【发布时间】:2016-01-17 18:41:59
【问题描述】:
WRT 一个由 c3.2xlarge 实例组成的 3 节点集群。
我有两张桌子。表 U 有大约 6500 万条记录,包含 在其他领域的纬度和经度。 L表大约有100万 记录,还包含纬度和经度。
U 存储为 ORC 表。
任务是确定在 10 英里半径范围内有多少 U 记录 L.的位置。
select l.id, count(u.id) from U u, L l where 3960 *
acos(cos(radians(l.lat)) * cos(radians(u.lat)) * cos(radians(l.long) -
radians(u.long)) + sin(radians(l.lat)) * sin(radians(u.lat))) < 10.0
group by l.id;
3960 * acos(cos(radians(l.lat)) * cos(radians(u.lat)) *
cos(radians(l.long) - radians(u.long)) + sin(radians(l.lat)) *
sin(radians(u.lat))) < 10.0 位只是纬度/经度之间的距离
对应小于 10 英里的限制。
问题:查询似乎需要很长时间才能完成。虽然地图 阶段完成相对较快,减少阶段卡在某个 固定百分比(80% ish)
我在 Hive 发出的输出消息中注意到了这一点。 数量 减少编译时确定的任务:1
我尝试通过设置来增加减速器的数量 mapred.reduce.tasks 到 7,但它总是以 1 结束。我不是 成功地增加了reducer的数量。
This answer 似乎暗示如果我以不同的方式编写查询,那么我可以强制使用多个减速器。但我还没有做到这一点。
执行时间估计:对于 L 中的单个位置,大约需要 60 秒才能得到答案。按照这个帐户,它应该需要 6000 万秒,也就是大约 700 天!需要这么多时间吗?即使是 Hadoop。
我也尝试过设置额外的约束,比如限制纬度, 长在 10 英里乘 10 英里的方形盒子中,位置在 L 的中心 盒子,但现在 1 个位置花费的时间是 40 秒 不是很大的进步。
问题:
1) 我怎样才能强制更多数量的减速器? 2)是否有更好的(就执行时间而言)查询? 3) 任何其他可以帮助我解决此问题的建议。
版本: Hadoop - 2.7.0 Java 1.7.0_80 Hive 1.2.1
【问题讨论】:
-
我认为您应该查看 Hive 的 GIS 扩展:cwiki.apache.org/confluence/display/Hive/Spatial+queries。
-
您使用的是哪个版本的 Hadoop? mapreduce.job.reduces 取代了 Hadoop 2.x 中的 mapreduce.job.reduces
-
有一个交叉连接U x L,然后过滤。交叉连接乘以行。是否可以将 WHERE 子句转换为加入 ON 子句?像这样: FROM U u INNER JOIN L l ON (3960 * acos(cos(radians(l.lat)) * cos(radians(u.lat)) * cos(radians(l.long) - radians(u.long )) + sin(radians(l.lat)) * sin(radians(u.lat)))