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文件。