2016-12-15 109 views
0

我有一堆存儲在Amazon S3中的小型(1KB到1MB)文本文件,我想使用Amazon EMR的Hadoop進行處理。EMR Hadoop處理整個S3文件

爲映射器提供的每條記錄都需要包含文本文件的全部內容以及某種確定文件名的方法,所以我不能使用默認的TextInputFormat。

完成此操作的最佳方法是什麼?還有什麼我可以做的(如將文件從S3複製到hdfs)來提高性能?

回答

0

我有同樣的問題。請參考以下問題。

如果你沒有任何大的文件,但有很多的文件,這是足夠使用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數據

  • S3DistCp ...它會將小文件合併爲一個大文件來處理Hadoop
  • Hive - External Tables ...它會創建一個引用s3存儲的外部表。然而,與使用s3cmd get的情況相比,它的性能幾乎相同。在這種情況下,它可能更有效,S3上有許多大的原始或gziped文件。