是否有一种直接解决以下错误的方法,还是使用Hive获得我需要的连接的更好方法?输出到存储表并不是必需的,因为我可以满足于INSERT OVERWRITE LOCAL DIRECTORY到csv。
我正在尝试执行以下交叉连接。ipint是一个9GB的表,geoiplite是270 is。
CREATE TABLE iplatlong_sample AS
SELECT ipintegers.networkinteger, geoiplite.latitude, geoiplite.longitude
FROM geoiplite
CROSS JOIN ipintegers
WHERE ipintegers.networkinteger >= geoiplite.network_start_integer AND ipintegers.networkinteger <= geoiplite.network_last_integer;我在ipintegers上使用交叉连接,而不是geoiplite,因为我读到的规则是,较小的表在左边,较大的在右边。
根据蜂巢,地图和减少阶段完成100%,但然后
2015-08-01 04:45:36,947级-1 map = 100%,减少= 100%,累积CPU 8767.09秒 MapReduce累计总CPU时间:0天2小时26分7秒90毫秒 结束作业= job_201508010407_0001 第8级由条件解析器选择. 执行日志: /tmp/myuser/.log 2015-08-01 04:45:38开始启动本地任务以处理映射连接;最大内存= 12221153280 执行失败,退出状态:3 获取错误信息 任务失败了! 任务ID:阶段-8 日志: /tmp/myuser/hive.log 失败:执行错误,从org.apache.hadoop.hive.ql.exec.mr.MapredLocalTask返回代码3 MapReduce作业启动:作业0:地图: 38减少:1累积CPU: 8767.09秒 HDFS读: 9438495086 HDFS写: 8575548486成功
我的蜂巢配置:
SET hive.mapred.local.mem=40960;
SET hive.exec.parallel=true;
SET hive.exec.compress.output=true;
SET hive.exec.compress.intermediate = true;
SET hive.optimize.skewjoin = true;
SET mapred.compress.map.output=true;
SET hive.stats.autogather=false;我在真和false之间有不同的,但结果是相同的。
以下是/tmp/myuser/hive.log输出日志中的错误
$ tail -12 -f tmp/mysyer/hive.log
2015-08-01 07:30:46,086 ERROR exec.Task (SessionState.java:printError(419)) - Execution failed with exit status: 3
2015-08-01 07:30:46,086 ERROR exec.Task (SessionState.java:printError(419)) - Obtaining error information
2015-08-01 07:30:46,087 ERROR exec.Task (SessionState.java:printError(419)) -
Task failed!
Task ID:
Stage-8
Logs:
2015-08-01 07:30:46,087 ERROR exec.Task (SessionState.java:printError(419)) - /tmp/myuser/hive.log
2015-08-01 07:30:46,087 ERROR mr.MapredLocalTask (MapredLocalTask.java:execute(268)) - Execution failed with exit status: 3
2015-08-01 07:30:46,094 ERROR ql.Driver (SessionState.java:printError(419)) - FAILED: Execution Error, return code 3 from org.apache.hadoop.hive.ql.exec.mr.MapredLocalTask我在Master上运行hive客户端,它是一个类型为n1-highmem-8类型(8 CPU,52 as)的Google云平台实例,工作人员是n1-highmem-4 (4CPU 26 As),但我怀疑在MAP之后,并减少了在Master上发生的本地连接(这是隐含的)。无论如何,在bdutils中,我将工作节点(n1-highmem-4)的JAVAOPTS配置为:n1-highmem-4
解决方案编辑:解决方案是将数据、范围数据组织成一个范围树。
发布于 2015-08-01 19:41:51
我不认为这是不可能执行这种交叉加入蛮力-只是乘以行数,这是有点失控。你需要一些优化,我认为蜂巢还不能。
但是,这个问题实际上可以在O(N1+N2)时间内解决,前提是您已经对数据进行了排序(单元可以为您完成)--您只需同时遍历两个列表,在每一步中获取一个ip整数,查看是否有任何间隔开始于该整数,添加它们,删除结束的数据,发出匹配的元组,等等。伪码:
intervals=[]
ipintegers = iterator(ipintegers_sorted_file)
intervals = iterator(intervals_sorted_on_start_file)
for x in ipintegers:
intervals = [i for i in intervals if i.end >= x]
while(intervals.current.start<=x):
intervals.append(intervals.current)
intervals.next()
for i in intervals:
output_match(i, x)现在,如果您有一个外部脚本/UDF函数,它知道如何读取较小的表,并将ip整数作为输入,并以匹配的元组作为输出,则可以使用hive和SELECT TRANSFORM将输入流到它。
或者您可能只需在本地机器上运行这个算法,其中包含两个输入文件,因为这只是O(N),甚至9GB的数据都是可以完成的。
https://stackoverflow.com/questions/31764417
复制相似问题