У меня есть 60 ТБ данных, которые находятся в 12 файлах CSV.
Данные будут загружены в кластеризованную базу данных, где процессы загрузки являются единственными, распараллелил. Для улучшения моей производительности загрузки, я должен инициировать процесс загрузки от каждого узла.
Пока неплохо с этой точки зрения. Моя самая большая проблема состоит в том, как я могу разделить эти данные? Это заархивировано, и каждый файл CSV имеет приблизительно 5 ТБ данных! Я попробовал разделение, но оно занимает слишком много времени!
Самый простой, но не самый быстрый, скорее всего, способ -
unzip -p <zipfile> | split -C <size>
Если предположить, что порядок данных не имеет значения, то одним из способов сделать это - не столько более быстрым, сколько, по крайней мере, немного параллельным - написать скрипт, который делает следующее.
Это не быстрее последовательного чтения большого файла, но позволяет разделить файл на более мелкие куски, которые можно загрузить параллельно, пока остальные данные не будут завершены.
Как и большинство сжатых выходных данных, его нельзя искать (вы не можете перепрыгнуть через X байт вперед), так что самый большой минус у вас есть, если процесс по каким-то причинам прервётся, вы будете вынуждены перезапустить всё с нуля.
Python предоставляет поддержку для выполнения подобных действий через модуль zipfile.
.Нужно ли загружать эти 12 файлов в порядке или их можно импортировать параллельно?
Я спрашиваю, потому что кажется, что если их загрузить, то их дальнейшее разделение все равно не позволит вам запустить что-либо параллельно, а если нет, то вы можете импортировать 12 файлов, которые у вас уже есть параллельно.
Если файлов на узлах еще нет, то их передача может занять столько же времени, сколько и импорт в любом случае.
Узкие места могут появиться в удивительных местах. Вы запустили процесс однопоточного импорта и проверили, что узлы не используются в полной мере? Возможно, вы решили не ту проблему, если не проверили
.