Разделить файл S3 на более мелкие файлы по 1000 строк - PullRequest
3 голосов
/ 15 мая 2019

У меня есть текстовый файл на S3 с 300 миллионами строк.Я хочу разделить этот файл на более мелкие файлы по 1000 строк в каждом (с последним файлом, содержащим остаток), который я бы затем хотел поместить в другую папку или корзину на S3.

Пока чтоЯ запускал это на своем локальном диске с помощью команды linux:

split -l 1000 file

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

Каков наиболее эффективный способ разделения этого файла S3, в идеале с использованием Python (в функции Lambda) или с использованием других команд S3?Это быстрее, чем просто запустить это на моем локальном диске?

Ответы [ 2 ]

3 голосов
/ 15 мая 2019

Все, что вы делаете, должно будет загрузить файл, разделить его и повторно загрузить.Единственный вопрос - , где , и задействован ли локальный диск.

Джон Ротенштейн привел вам пример использования локального диска в экземпляре EC2.Это дает преимущество работы в центрах обработки данных AWS, поэтому он получает высокоскоростное соединение, но имеет ограничения, которые: (1) вам нужно место на диске для хранения исходного файла и его частей, и (2) вам нужен экземпляр EC2где вы можете сделать это.

Одна небольшая оптимизация состоит в том, чтобы избежать локальной копии большого файла, используя дефис в качестве пункта назначения s3 cp: это отправит вывод стандартному выводу, и выможет затем передать его в split (здесь я также использую дефис, чтобы сказать split для чтения из стандартного ввода):

aws s3 cp s3://my-bucket/big-file.txt - | split -l 1000 - output.
aws s3 cp output.* s3://dest-bucket/

Опять же, для этого требуется экземпляр EC2, иместо для хранения выходных файлов.Однако есть флаг split, который позволит вам запустить команду оболочки для каждого файла в разбиении:

aws s3 cp s3://src-bucket/src-file - | split -b 1000 --filter 'aws s3 cp - s3://dst-bucket/result.$FILE' -

Итак, теперь вы устранили проблему с локальным хранилищем, но осталисьс вопросом где его запустить.Я бы порекомендовал AWS Batch , который может раскрутить экземпляр EC2 всего за время, необходимое для выполнения команды.

Конечно, вы можете написать скрипт Python для этогоЛямбда, и это было бы преимуществом автоматического запуска при загрузке исходного файла на S3.Я не очень знаком с Python SDK (boto), но похоже, что get_object вернет тело исходного файла в виде потока байтов , который затем можно перебрать какстрок, накапливая сколько угодно строк в каждом выходном файле.

2 голосов
/ 15 мая 2019

Ваш метод кажется надежным (загрузка, разделение, загрузка).

Вы должны запустить команды из экземпляра Amazon EC2 в том же регионе, что и корзина Amazon S3.

Используйте Интерфейс командной строки AWS (CLI) для загрузки / выгрузки файлов:

aws s3 cp s3://my-bucket/big-file.txt .

aws s3 cp --recursive folder-with-files s3://my-bucket/destination-folder/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...