hive ip geocoding(交叉连接半大表)

时间:2014-01-23 00:49:58

标签: hadoop hive ip-geolocation

我的问题。

我需要500,000个不同的IP地址进行地理编码。 Geocode查找表有一个ip-from和ip-to范围,我必须比较一个180万行的表。

所以基本上是这样的:

select *
/*+ MAPJOIN(a) */
from ip_address a
cross join  ip_lookup b
where a.AddressInt >= b.ip_from and a.AddressInt <= b.ip_to;

在aws EMR上,我正在运行一个10 m1.large的集群,在交叉加入阶段,它会在0%停留20分钟,但这很有趣:

Stage-5: number of mappers: 1; number of reducers: 0

问题: 1)任何人都有比交叉加入更好的想法吗?我不介意启动几个(更多)实例,但我怀疑这会有所帮助 2)我真的在进行交叉映射连接,就像将ip_addresses存储在内存中一样吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

去年我遇到了你的(某种)问题。

由于我的地理编码表安装在RAM中,这就是我所做的:

  1. 我编写了Java类(让我们称之为GeoCoder),它将光盘中的地理编码信息读入RAM并 在内存中进行了地理编码。
  2. 我已将文件geocode.info添加到分布式缓存中(Hive add file命令执行此操作。)
  3. 我写了UDF GeoCoder方法中创建(或使用,如果已经创建)evaluate实例。 Hive UDF可以通过getClass().getClassLoader().getResource("geocode.info").getFile()
  4. 获取分布式缓存中文件的本地路径
  5. 现在我有geocode.info的本地路径(现在它是普通文件),其余的是历史记录。
  6. 这种方法可能是一种矫枉过正(150行Java),但它对我有用。

    此外,我认为您确实需要使用Hadoop(就像我一样)来完成您的任务。 可以在笔记本电脑上快速地对500000个IP进行地理编码。