Как разделить огромный файл CSV в Linux?

У меня есть 60 ТБ данных, которые находятся в 12 CSV-файлах.

Данные будут загружены в кластерную базу данных, где процессы загрузки являются однопоточными. Чтобы улучшить производительность загрузки, мне нужно инициировать процесс загрузки с каждого узла.

Пока все хорошо с этой точки зрения. Моя самая большая проблема - как я могу разделить эти данные? Это заархивировано, и каждый файл CSV имеет около 5 ТБ данных! Я пробовал сплит, но это занимает слишком много времени!

3 ответа

Самый простой, но не самый быстрый, скорее всего, способ

unzip -p <zipfile> | split -C <size>

При условии, что порядок данных не важен, один из способов сделать это - не так быстро, но, по крайней мере, несколько параллельно, - написать скрипт, который выполняет следующие действия.

  1. Откройте почтовый файл.
  2. Получите первый файл.
  3. Прочитайте данные из файла, скажем, в строках.
  4. Для каждой строки csv запишите новый zip-файл, содержащий строку.
  5. Поверните выбранный файл (скажем, пять zip-файлов), используя вывод одной строки.
  6. Как только вы достигнете определенного размера (скажем, 50 ГБ), создайте новый zip-файл.

Это не быстрее, чем последовательное чтение большого файла, но позволяет вам разбить файл на более мелкие куски, которые можно загружать параллельно, в то время как оставшиеся данные завершены.

Как и большинство сжатых выходных данных, они недоступны для поиска (вы не можете перейти на X байт вперед), поэтому самый большой недостаток, который у вас есть, - это если по какой-то причине процесс прерывается, вам придется перезапустить все с нуля.

Python предоставляет поддержку для выполнения чего-то подобного через модуль zipfile.

Нужно ли загружать 12 файлов по порядку или они могут быть импортированы параллельно?

Я спрашиваю, потому что может показаться, что если они должны быть загружены по порядку, то их дальнейшее разделение не позволит вам запустить что-либо параллельно, а если нет, вы можете импортировать 12 файлов, которые у вас уже есть параллельно.

Если файлы еще не доступны на узлах, их передача может занять столько же времени, сколько и импорт.

Узкие места могут появляться в удивительных местах. Вы запустили однопотоковый процесс импорта и убедились, что узлы используются недостаточно? Возможно, вы решаете не ту проблему, если не проверили.

Другие вопросы по тегам