【发布时间】:2014-01-02 10:03:11
【问题描述】:
我试图在一个分区上运行一个简单的查询,该分区有大约 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;
【问题讨论】:
-
集群中有多少个映射器?您在哪里设置了上面列出的所有属性(在 *-site.xml 文件中?)您没有提供信息来帮助解决为什么延迟一小时:例如是否有其他工作正在运行 - jobtracker 对正在运行的工作有什么看法? JT 对可用的 mapper/reducer 插槽有什么看法?
-
在集群设置期间启动这些步骤时,我通过 API 传递所有这些属性。无论有没有这些设置,都没有任何改进。集群上没有运行其他作业。 1 小时的延迟与分区中的记录数成正比。我尝试了一个包含 100 条记录的示例分区,在这种情况下没有延迟。但是一旦记录数增加,延迟就会越来越多。 jobtracker 显示有 800 个可用的 map /reduce 插槽。但在整个作业执行期间只有 1 个插槽在使用。
-
JT 说集群拥有多少个 map/reduce 槽?
-
我有 1 个主节点,8 个核心节点。 JT 显示 800 个 map 槽和 800 个 reduce 槽打开。
-
您已经击中了大部分项目。只有其他我能想到的:设置 mapreduce.input.fileinputformat.split.maxsize=8000000 并检查您的 InputFormat。
标签: mapreduce hive elastic-map-reduce