wrt由c3.2x大型示例组成的3节点集群。
我有两张table。表u有大约6500万条记录,其中包含纬度和经度等字段。表l有大约100万条记录,还包含纬度和经度。
u存储为orc表。
任务是确定有多少u记录落在l的10英里半径范围内。
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英里。
问题:查询似乎需要很长时间才能完成。当map阶段相对较快地完成时,reduce阶段会停留在某个固定的百分比(80%ish)
我在Hive发出的输出信息中注意到了这一点。编译时确定的reduce任务数:1
我试图通过将mapred.reduce.tasks设置为7来增加reducer的数量,但结果总是为1。我没有成功地增加减速机的数量。
这个答案似乎表明,如果我以不同的方式编写查询,那么我可以强制使用1个以上的减速机。但我还没能做到。
执行时间估计:对于l中的单个位置,大约需要60秒才能得到答案。按此计算,需要6000万秒,也就是700天左右!要花这么多时间吗?即使是hadoop。
我也尝试过添加额外的限制,比如限制纬度,长在一个10英里乘10英里的正方形框中,框的中心位置是l,但是现在1个位置所用的时间是40秒,这并不是一个巨大的改进。
问题:
1) 我怎样才能强迫更多的减速机?2) 是否有更好的(在执行时间方面)查询?3) 任何能帮我解决这个问题的建议。
版本:hadoop-2.7.0 java 1.7.0\u 80 hive 1.2.1
2条答案
按热度按时间klh5stk11#
如果您使用的是hadoop 2,那么指定reducer的正确方法是:
SET mapreduce.job.reduces=7;
这与hadoop2中所做的更改有关。我的行为与您描述的相同,已更新为上述命令,并成功地设置了reduce任务。我不确定hadoop如何选择所需的减速机数量,但在某些情况下,减速机的数量似乎很小,这可能会导致显著的性能滞后。carvr3hs2#
如前所述,
mapred.reduce.tasks替换为mapreduce.job.reduces
请查看本文中所有不推荐使用的属性和这些不推荐使用的值的新值。
除了不推荐使用的属性之外,您还必须迁移本文中介绍的一些函数