Hive中如何设置MapReduce的并行度?

在Hive中,MapReduce的并行度主要控制执行MR任务的 reducetask 的个数。它可以通过以下三个参数设置:

  1. set mapreduce.job.reduces:
    该参数直接指定MR任务的reducetask个数,例如:
SET mapreduce.job.reduces = 10;

这个设置会令下一条SQL查询任务使用10个reducetask。

  1. SET hive.exec.reducers.max:
    该参数指定Hive中所有MR任务的最大reducetask个数,例如:
SET hive.exec.reducers.max = 100;

这个设置会限制接下来Hive发出的所有MR任务的reducetask个数不能超过100个。如果某个查询需要的reducetask个数大于该值,会报ValueOutOfRange异常。

  1. SET hive.exec.reducers.bytes.per.reducer:
    该参数设置每个reducetask处理的数据量,Hive会根据表的数据总量和该值自动计算reducetask的个数。例如:
SET hive.exec.reducers.bytes.per.reducer = 100000000; 

这个设置会让Hive根据表数据量和每个reducetask处理的数据量100000000字节,自动计算reducetask的个数。
除此之外,Hive中reducetask的个数还会受到YARN中参数mapreduce.job.reduces的影响。Hive的参数设置只在该YARN参数允许的最大值范围内生效。

所以,总结来说,Hive中可以通过以下几种方式设置MapReduce的并行度(即reducetask的个数):

  1. 直接通过SET mapreduce.job.reduces指定。
  2. 通过SET hive.exec.reducers.max限制最大个数。
  3. 通过SET hive.exec.reducers.bytes.per.reducer设置每个reducetask处理的数据量,让Hive自动计算。
  4. 需要注意,Hive的参数设置受到YARN的mapreduce.job.reduces参数限制。

在Hive进行数据分析时,設定适当的MapReduce并行度很重要,可以最大限度地发挥集群的计算能力,减少任务的执行时间。