配置单元交叉连接在本地Map连接上失败

epfja78i  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(372)

有没有一种直接的方法来解决下面的错误,或者有一种更好的方法来使用hive来获得我需要的连接?输出到存储表不是一个要求,因为我可以满足于 INSERT OVERWRITE LOCAL DIRECTORY 到csv。
我正在尝试执行以下交叉连接。ipint是一个9gb的表,geoiplite是270mb。

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,因为我已经读到规则是较小的表在左侧,较大的表在右侧。
根据Hive,绘制并减少阶段完成到100%,但是
2015-08-01 04:45:36947第一阶段map=100%,reduce=100%,累计cpu 8767.09秒
mapreduce累计cpu总时间:0天2小时26分7秒90毫秒
结束作业=作业\u 201508010407 \u 0001
阶段8由条件分解器选择。
执行日志位于:/tmp/myuser/.log
2015-08-01 04:45:38启动本地任务处理Map加入;最大内存=12221153280
执行失败,退出状态:3
获取错误信息
任务失败!
任务id:阶段8
日志:
/tmp/myuser/hive.log
失败:执行错误,从org.apache.hadoop.hive.ql.exec.mr.mapredlocaltask返回代码3
mapreduce作业已启动:作业0:map:38 reduce: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;

我有不同的想法 SET hive.auto.convert.join 在真与假之间,但结果相同。
以下是/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(8cpu,52gb)的google云平台示例,worker是n1-highmem-4(4cpu26gb),但我怀疑map和reduce之后,在master上发生了一个本地连接(如暗示的)。无论如何,在bdutils中,我为工作节点配置了javaopts( n1-highmem-4 )收件人: n1-highmem-4 解决方案编辑:解决方案是将范围数据组织成范围树。

envsm3lx

envsm3lx1#

我不认为有可能执行这种交叉连接暴力-只是乘以行号,这有点失控。你需要一些优化,我认为hive还不能。
但是这个问题实际上可以在o(n1+n2)时间内解决,前提是你已经对数据进行了排序(hive可以为你做这些)-你只需同时浏览两个列表,每一步都得到一个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的数据也是非常可行的。

相关问题