我是蜂巢新手,我现在已经玩了一段时间了。我不知道hive优化器是如何工作的,但基本上我想知道hive运行的hadoop作业的最大数量,只是为了看看瓶颈在哪里,我已经在一个具有多级查询嵌套的表上尝试了查询从来没有发现一个案例,提交了超过2个hadoop作业,以便给我查询结果。有人可以给我一个示例查询,其中hive在该查询上提交了2个hadoop作业。
我有2级嵌套的查询,我用1 map / 1 reduce运行它,所花的时间大约是84s。我将映射器更改为10并将reducers更改为10,执行时间增加到89s。
Runtime usage:
Job 0: Map: 1 Reduce: 10
Job 1: Map: 5 Reduce: 1
Time taken: 89.306 seconds,
我怀疑它必须是因为JVM调用时间。有人能告诉我为什么会这样吗? JVM也可以在相同的hadoop作业中重用吗?如果是的话,可以在多个hadoop作业之间共享JVM(基本上有一个JVM预分配池用于map / reduce而不是按需生成JVM吗?)。
hadoop是否提供此类功能?
答案 0 :(得分:0)
我不知道单个配置单元查询将运行的作业数量有任何限制。我认为我见过5个左右,但超过2个是罕见的,我同意。有许多操作(连接,“不同”,“分组”)必须作为其自己的shuffle-sort-reduce阶段的一部分发生,因此嵌套其中许多可能会导致许多工作。将这些内容与过滤器和UDF等对比,可以很容易地将其添加到地图上或减少将要发生的阶段。例如:
select a.z, max(b.s) from
(
select distinct x, y, z from t1
) a join
(
select x, sum(y) as s from t2 group by x
) b
on a.x = b.x
group by a.z
我希望能接受四个左右的MR工作。
对于你的第二个问题,hive查询运行所需的时间长度涉及很多事情,所以我不能确定导致这种性能行为的原因。 84s到89s肯定在正常波动范围内,即使你没有改变任何设置。在那么小的工作中,大部分工作都是开销。
JVM启动可能是一个因素,尤其取决于您拥有多少个任务槽。据我所知,JVM不能在不同的mapreduce作业之间共享,只能在单个作业中的不同任务之间共享。