我试图在一个表上运行一个简单的查询,其中一个分区有大约200-300k记录,所有这些记录都是120字节的小文件。
我正在使用自定义INPUTFORMAT读取文件内容,然后查询另一个s3文件以获取实际数据。每个文件对应一条记录。
查询大约需要6个小时才能完成。我在EMR上使用了一组10台m2.4xlarge类型的机器。
查看日志,启动作业和启动map reduce任务之间会有一个小时的延迟。此外,映射器/任务的数量仅显示为1。
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0
有什么我想念的吗?看起来根本没有并行执行。 我尝试设置以下属性,但根本没有改进:
mapreduce.job.counters.limit 1000
mapred.tasktracker.tasks.maximum 1000
mapred.tasktracker.map.tasks.maximum 100
mapred.tasktracker.reduce.tasks.maximum 95
mapred.map.tasks 100
mapred.child.java.opts -Xmx15048m
namenide-heap-size 15048
以下是表格和查询详情。
CREATE EXTERNAL TABLE IF NOT EXISTS sample(
x string,
y date,
)
PARTITIONED BY (date STRING)
ROW FORMAT SERDE "com.gts.hive.analytics.store.serde.CustomSerDe"
STORED AS INPUTFORMAT 'com.gts.hive.analytics.store.formats.mapred.GZipJsonFileInputFormat2'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3n://xyzlocation/';
ALTER TABLE sample ADD IF NOT EXISTS PARTITION(date='2013-12-31-07');
select x from sample;
答案 0 :(得分:1)
gzip不可拆分,任何对gzip数据的Hadoop处理都将导致一个映射器。有可拆分的压缩格式,例如你可以使用的bzip。有关详情,请访问http://comphadoop.weebly.com/
答案 1 :(得分:0)
您可以尝试在查询结尾处添加cluster by rand()
,我不太明白为什么,但似乎join
,group by
,{{1}等等为地图作业启用某种洗牌。否则减速器的数量会自动强制为1。