我正在尝试使用Amazon EMR和Hive来处理由广告跟踪服务器生成的大量日志文件。表现远比我预期的要糟糕,我希望有人可以指点我的改进。
跟踪服务器每隔几分钟将日志文件上传到按日分区的S3文件夹(例如," 2014-05-20")。每天上传大约3,000个文件,每个文件大约20k。
使用Hive,我已经成功创建了引用S3中数据的外部表,并为30天的日志文件设置了分区。我已经验证分区工作正常,并且简单查询(例如," SELECT * FROM click WHERE dt =' 2014-05-19' LIMIT 10)正常工作并快速响应。
我正在将数据加载到临时HDFS表中以供后续查询使用。为此,我运行一个基本上是这样的HQL作业(注意click
是S3中的外部表):
CREATE TABLE tmp_click (
clickId string,
-- ...
dt string
)
STORED AS SEQUENCEFILE;
INSERT OVERWRITE TABLE tmp_click
SELECT
clickId,
-- ...
k.dt
FROM
click k
WHERE
k.dt >= '${START_DAY}' AND
k.dt <= '${END_DAY}'
;
此操作需要一个多小时,其中25个xlarge实例用作核心/任务节点。鉴于此处基本上没有处理 - 它只是复制数据,对吧? - 我觉得必须有一些我想念的东西。任何人都可以给我任何调查技巧吗?
我认为可能大量文件(约3,000天)或日志文件的压缩(gz)可能会出现问题,但我无法控制输入。
答案 0 :(得分:1)
您的查询必须同时处理列出S3中的文件和处理压缩的S3N协议。尝试使用s3distcp将文件从S3更快地复制到HDFS,然后创建一个包含复制文件的表。