2016-06-17 3 views
0

У меня есть большое количество файлов (~ 500k hdf5) внутри ведра s3, который мне нужно обрабатывать и повторно загружать в другой ведро s3.загружать, обрабатывать, загружать большое количество файлов s3 с искру

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

s3keys = bucket.list() 
data = sc.parallelize(s3keys) 
data = data.map(lambda x: download_process_upload(x)) 
result = data.collect() 

где download_process_upload является функцией, которая загружает файл, указанный с помощью ключа, делает некоторую обработку на нем и повторно добавления его в другое ведро (возвращение 1, если все прошло успешно, и 0, если произошла ошибка) Таким образом, в конце концов, я мог бы сделать

success_rate = sum(result)/float(len(s3keys)) 

Я прочитал эту искру map заявления должны быть лицами без гражданства, в то время как моя пользовательская функция карты определенно не является апатридом. Он загружает файл на диск, а затем загружает его в память и т. Д.

Так это правильный способ выполнить такую ​​задачу?

ответ

0

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

Кроме того, вы можете сэкономить несколько нажатий клавиш и принять явный лямбда из заявления карты, как это data = data.map(download_process_upload)