修改配置单元查询以强制使用1个以上的reducer

时间:2015-10-19 12:11:35

标签: sql hadoop hive bigdata

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

2 个答案:

答案 0 :(得分:1)

如前所述,

mapred.reduce.tasks 替换为 mapreduce.job.reduces

查看此article中已弃用的值的所有弃用属性和新值。

除了已弃用的属性,您还必须迁移一些功能以及此article

中所述的功能。

答案 1 :(得分:0)

如果您正在使用Hadoop 2,则指定reducer的正确方法是:

low < i < high

这与Hadoop 2中所做的更改有关。我有与您描述的相同的行为,已更新为上述命令,并且成功设置了reduce任务。我不确定Hadoop如何选择必要的减速器数量,但在某些情况下似乎确实很小,这可能会导致显着的性能滞后。