Hadoop 配置单元交叉连接在本地映射连接上失败

Hadoop 配置单元交叉连接在本地映射连接上失败,hadoop,join,hive,cross-join,google-hadoop,Hadoop,Join,Hive,Cross Join,Google Hadoop,是否有一种直接的方法来解决以下错误,或者总体上有一种更好的方法来使用配置单元来获得我需要的连接?输出到存储表不是必需的,因为我可以满足于将插入覆盖本地目录到csv 我正在尝试执行以下交叉联接。ipint是一个9GB的表,geoiplite是270MB CREATE TABLE iplatlong_sample AS SELECT ipintegers.networkinteger, geoiplite.latitude, geoiplite.longitude FROM geoiplite CR

是否有一种直接的方法来解决以下错误,或者总体上有一种更好的方法来使用配置单元来获得我需要的连接?输出到存储表不是必需的,因为我可以满足于将
插入覆盖本地目录
到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;
我在truefalse之间改变了
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
我正在主服务器上运行hive客户端,这是一个类型为n1-highmem-8(8CPU,52GB)的Google云平台实例,工作线程为n1-highmem-4(4CPU 26GB),但我怀疑在映射并减少后,会在主服务器上发生本地连接(如暗示的)。无论如何,在bdutils中,我将工作节点(
n1-highmem-4
)的JAVAOPTS配置为:
n1-highmem-4


解决方案编辑:解决方案是将数据和范围数据组织到范围树中。

我认为不可能执行这种交叉连接暴力-只需将行号相乘,这有点失控。你需要一些优化,我认为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)
间隔=[]
ipintegers=迭代器(ipintegers\u排序\u文件)
间隔=迭代器(间隔\u排序\u在\u开始\u文件上)
对于iIntegers中的x:
间隔=[i为i,如果i.end>=x,则间隔为i]

虽然(intervals.current.StartInDect,这将是我的下一个方法。我将按ipinteger和ip范围设置配置单元排序表。范围中的上限和下限应该是唯一的。因此脚本将读取ipinteger,对照范围的上限和下限进行检查。如果为false,则为下一个间隔。如果为true,则发出并在最后检查时开始比较Interval.OK我认为我的实现仍然是O(n*m),需要几天才能完成。你如何使它更快?当然O(n*m)将永远需要。用伪代码更新了我的答案。我实现的越快,就是将范围数据组织到范围树中。
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)