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
只是lat / long之间的距离
对应小于10英里。
问题:查询似乎需要永远完成。而地图 阶段完成相对较快,减少阶段陷入某些困难 固定百分比(80%ish)
我在Hive发出的输出消息中注意到了这一点。 数量 减少在编译时确定的任务:1
我尝试通过设置增加减速器的数量 mapred.reduce.tasks 到7但它总是最终为1.我不是 成功地增加了减速器的数量。
This answer似乎暗示,如果我以不同的方式编写查询,那么我可以强制使用1个以上的reducer。但我还没能做到。
执行时间估算值:对于L中的单个位置,获得答案大约需要60秒。通过该帐户,它应该需要6000万秒,大约700天!应该花这么多时间吗?即使是Hadoop。
我也尝试过添加限制,例如限制lat, 长在一个10英里乘10英里的方形盒子里,位于L中心 的盒子,但现在所用的时间是40秒,1个位置 并不是一个巨大的进步。
问题:
1)我如何强制减少更多的减速器? 2)是否有更好的(在执行时间方面)查询? 3)任何其他建议,将帮助我解决这个问题。
版本: Hadoop - 2.7.0 Java 1.7.0_80 Hive 1.2.1
答案 0 :(得分:1)
如前所述,
mapred.reduce.tasks 替换为 mapreduce.job.reduces
查看此article中已弃用的值的所有弃用属性和新值。
除了已弃用的属性,您还必须迁移一些功能以及此article
中所述的功能。答案 1 :(得分:0)
如果您正在使用Hadoop 2,则指定reducer的正确方法是:
low < i < high
这与Hadoop 2中所做的更改有关。我有与您描述的相同的行为,已更新为上述命令,并且成功设置了reduce任务。我不确定Hadoop如何选择必要的减速器数量,但在某些情况下似乎确实很小,这可能会导致显着的性能滞后。