0
我有一堆存儲在Amazon S3中的小型(1KB到1MB)文本文件,我想使用Amazon EMR的Hadoop進行處理。EMR Hadoop處理整個S3文件
爲映射器提供的每條記錄都需要包含文本文件的全部內容以及某種確定文件名的方法,所以我不能使用默認的TextInputFormat。
完成此操作的最佳方法是什麼?還有什麼我可以做的(如將文件從S3複製到hdfs)來提高性能?
我有一堆存儲在Amazon S3中的小型(1KB到1MB)文本文件,我想使用Amazon EMR的Hadoop進行處理。EMR Hadoop處理整個S3文件
爲映射器提供的每條記錄都需要包含文本文件的全部內容以及某種確定文件名的方法,所以我不能使用默認的TextInputFormat。
完成此操作的最佳方法是什麼?還有什麼我可以做的(如將文件從S3複製到hdfs)來提高性能?
我有同樣的問題。請參考以下問題。
如果你沒有任何大的文件,但有很多的文件,這是足夠使用s3cmd get --recursive s3://<url> .
命令。將文件檢索到EMR實例後,可以使用Hive創建表。例如,您可以使用分區加載帶有LOAD DATA
語句的整個文件。
樣品
這是一個示例代碼
#!/bin/bash
s3cmd get --recursive s3://your.s3.name .
# create table with partitions
hive -e "SET mapred.input.dir.recursive=true; DROP TABLE IF EXISTS import_s3_data;"
hive -e "CREATE TABLE import_s3_data(rawdata string)
PARTITIONED BY (tier1 string, tier2, string, tier3 string);"
LOAD_SQL=""
# collect files as array
FILES=(`find . -name \*.txt -print`)
for FILE in ${FILES[@]}
do
DIR_INFO=(`echo ${FILE##./} | tr -s '/' ' '`)
T1=${DIR_INFO[0]}
T2=${DIR_INFO[1]}
T3=${DIR_INFO[2]}
LOAD_SQL="${LOAD_SQL} LOAD DATA LOCAL INPATH '${FILE}' INTO TABLE
import_s3_data PARTITION (tier1 = '${T1}', tier2 = '${T2}', tier3 = '${T3}');"
done
hive -e "${LOAD_SQL}"
另一個選項
我覺得有一些其他的選擇來獲取小S3數據
s3cmd get
的情況相比,它的性能幾乎相同。在這種情況下,它可能更有效,S3上有許多大的原始或gziped文件。