跳到主要内容

自动并行度

启用自动并行度

要启用自动并行度,用户应在 hive-site.xml 中将 hive.tez.auto.reducer.parallelism 设置为 true,并在 tez-site.xml 中将 tez.shuffle-vertex-manager.enable.auto-parallel 设置为 true。启用自动并行度可能会使单个查询运行稍慢,但通常会提高并发查询的吞吐量,尤其是在集群负载较重时。

如果 tez.shuffle-vertex-manager.enable.auto-parallel 设置为 true,以下配置键决定何时触发自动并行度以及如何重新分配 Task。(对于具有 SIMPLE_EDGE 类型传入边的 Vertex,前两个配置键会被忽略。)

  • tez.shuffle-vertex-manager.auto-parallel.min.num.tasks
  • tez.shuffle-vertex-manager.auto-parallel.max.reduction.percentage
  • tez.shuffle-vertex-manager.use-stats-auto-parallelism
  • tez.shuffle.vertex.manager.auto.parallelism.min.percent

以下是配置自动并行度的示例。

vi conf/tez-site.xml
<property>
<name>tez.shuffle-vertex-manager.enable.auto-parallel</name>
<value>true</value>
</property>
<property>
<name>tez.shuffle-vertex-manager.auto-parallel.min.num.tasks</name>
<value>251</value>
</property>
<property>
<name>tez.shuffle-vertex-manager.auto-parallel.max.reduction.percentage</name>
<value>20</value>
</property>
<property>
<name>tez.shuffle-vertex-manager.use-stats-auto-parallelism</name>
<value>true</value>
</property>
<property>
<name>tez.shuffle.vertex.manager.auto.parallelism.min.percent</name>
<value>20</value>
</property>
  • tez.shuffle-vertex-manager.auto-parallel.min.num.tasks = 251:考虑至少 251 个 Task 的 Vertex 进行自动并行度。
  • tez.shuffle-vertex-manager.auto-parallel.max.reduction.percentage = 20:Task 数量最多可减少 100 - 20 = 80%,因此留下 20% 的 Task。例如,开始时有 100 个 Task 的 Vertex 在使用自动并行度时可能最终只有 20 个 Task。
  • tez.shuffle-vertex-manager.use-stats-auto-parallelism = true:Vertex 在应用自动并行度时分析来自上游 Task 的输出统计信息。
  • tez.shuffle.vertex.manager.auto.parallelism.min.percent = 10:当考虑来自上游 Task 的输出统计信息时,将零输入大小规范化为 10,而最大输入大小映射到 100。

当有足够的资源可用时,禁用自动并行度有时可以改善顺序查询的响应时间。要禁用自动并行度,请在 tez-site.xml 中将 tez.shuffle-vertex-manager.auto-parallel.min.num.tasks 设置为大于 hive-site.xmlhive.exec.reducers.max 的值。

提示

MR3 发布版本中 tez.shuffle-vertex-manager.auto-parallel.max.reduction.percentage 的默认值是 50,这对于执行顺序查询是一个合理的选择。在同时执行许多查询的集群中,建议使用较小的值(例如 20),因为它通常会导致更高的吞吐量。

警告

过度使用自动并行度(例如将 tez.shuffle-vertex-manager.auto-parallel.max.reduction.percentage 设置为 5)会增加 straggler 的可能性,因为单个 reducer 可能被分配太多数据从上游 mapper 获取。

hive.tez.llap.min.reducer.per.executor

启用自动并行度后,HivePlus 使用 hive-site.xml 中的配置键 hive.tez.llap.min.reducer.per.executor 来决定每个 Reduce Vertex 的 reducer 数量的基准。例如,如果整个 ContainerWorker 集合可以同时运行 100 个 reducer,并且 hive.tez.llap.min.reducer.per.executor 设置为 0.2,则查询优化器会尝试为每个 Reduce Vertex 最多分配 100 * 0.2 = 20 个 reducer。这样,配置键 hive.tez.llap.min.reducer.per.executor 会影响查询的执行时间。

对于典型工作负载,默认值 1.0 是可以接受的,但根据集群的特性(例如 ContainerWorker 数量、并发级别、数据集大小、mapper 和 reducer 的资源等),不同的值可能会导致性能改进(或下降)。

如果 reducer 数量太少,用户可以尝试在 Beeline 连接中设置配置键 hive.tez.llap.min.reducer.per.executor 的更大值,而无需重启 HiveServer2。需要注意的是,较大的值会增加自动并行度开始前的初始 reducer 数量,但不保证自动并行度调整后 reducer 最终数量会增加。如果调整后 reducer 的最终数量仍然没有变化,用户可以通过更新 hive.mr3.reduce.task.memory.mbhive.mr3.reduce.task.vcores 来减少分配给每个 reducer 的资源,以便 ContainerWorker 可以容纳更多 reducer。

以下是在 Beeline 会话中尝试增加 reducer 最终数量的示例(其中我们将 hive.mr3.reduce.task.vcores 设置为 0 并忽略核心数)。

  1. hive.tez.llap.min.reducer.per.executor = 0.2,hive.mr3.reduce.task.memory.mb = 6144。
    ContainerWorker 可以容纳 432 个 reducer。初始 reducer 数量 = 432 * 0.2 = 87。自动并行度无效,最终 reducer 数量也是 87。
  2. hive.tez.llap.min.reducer.per.executor = 1.0。
    初始 reducer 数量增加到 432 * 1.0 = 432。自动并行度将 reducer 数量减少到 432 / 5 = 87,因此调整后 reducer 的最终数量仍然相同。
  3. hive.tez.llap.min.reducer.per.executor = 2.0。
    初始 reducer 数量增加到 432 * 2.0 = 864。最终 reducer 数量仍然是 864 / 10 = 87。
  4. hive.mr3.reduce.task.memory.mb = 4096。
    初始 reducer 数量增加到 1009,这是配置键 hive.exec.reducers.max 设置的最大值。最终 reducer 数量为 1009 / 10 = 101。