2016-12-15 107 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文件。