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