验证 Hive 单查询和多查询并行性

问题描述

我使用以下 hive-site.xml 属性配置了 Hive 并行性并重新启动了集群

属性 1

Name: hive.exec.parallel
Value: true
Description: Run hive jobs in parallel

属性 2

Name: hive.exec.parallel.thread.number
Value: 8 (default)
Description: Maximum number of hive jobs to run in parallel

为了测试并行性,我创建了以下 2 个条件:

1。 file.hql 中的单个查询并将其作为 hive -f file.hql

运行
SELECT COL1,COL2 FROM TABLE1
UNION ALL
SELECT COL3,COL4 FROM TABLE2

结果:

当 hive.exec.parallel = true 时, 耗时:28.015秒, MapReduce cpu 总耗时:3 秒 10 毫秒

当 hive.exec.parallel = false 时, 耗时:24.778 秒, MapReduce cpu 总耗时:3 秒 90 毫秒。

2。如下 2 个不同文件中的独立查询,并将其作为 nohup hive -f file1.hql & nohup hive -f file2.hql

运行
select count(1) from t1 -> file1.sql
select count(1) from t2 -> file2.sql

结果:

当 hive.exec.parallel = false 时, 耗时:29.391 秒, MapReduce cpu 总耗时:1 秒 890 毫秒

问题:

如何检查以上 2 个条件是否确实并行运行? 在控制台中,我看到的结果就像查询按顺序运行一样。

为什么 hive.exec.parallel = true 花费的时间更多?我如何才能看到 hive 的多个阶段被利用了?

谢谢,

解决方法

当 Hive 执行引擎为 MR (hive.execution.engine=mr) 时,Hive 将查询表示为一个或多个 Map-Reduce 作业,这些作业(每个包含 Map 和 reduce)可以并行执行如果可能的话。 例如这个查询:

SELECT COL1,COL2 FROM TABLE1
UNION
SELECT COL3,COL4 FROM TABLE2

可以作为 3 个作业执行: 1 - 从表 1 中选择, 2-选择table2, 3-UNION(不同)

前两个作业可以并行执行,第三个作业可以在第一和第二个完成后并行执行。

可以执行更复杂的查询,因为有许多 MR 作业广告这些参数:

hive.exec.parallelhive.exec.parallel.thread.number 允许为在 MR 上运行的单个查询并行执行作业。

您可以在 Job Tracker 上查看作业,URL 会在执行期间打印在日志中。您可以在日志中看到一些作业已启动及其执行进度。

如果在 Tez 执行引擎上运行(hive.execution.engine=Tez),Hive 将查询表示为单个优化的 DAG,省略不必要的步骤,例如将中间结果写入持久存储并使用映射器再次读取它们。 DAG 中可以并行执行的所有顶点都在并行执行。在 Tez 上运行时,相同的设置不起作用。它始终在 Tez 上并行运行。相同的查询将表示为 2 个 mapper 顶点(并行运行)和最后运行的 reducer。最后一个reducer也可以在mapper快完成的时候提前启动。

设置 hive.exec.parallelhive.exec.parallel.thread.number 不会影响 Tez 上查询的并行性,它们也不适用于单个脚本中的两个单独查询。

单个脚本中的两个单独的查询是一个接一个地运行,而不是并行的(每个都有自己的任务并行性)

上一个示例中的两个 hive 会话并行运行(取决于可用的集群资源)

可以使用 time Unix command 测量时间差异。 Hive 报告的时间是集群时间。如果集群没有可用资源,并行任务可以等待资源。使用作业跟踪器检查执行期间究竟发生了什么。

所以,实际上有不同种类的并行性。

MR 上的单一查询作业并行性 - 您要求的参数适用于此类。

Hive 会话并行运行 - 这些参数不影响它。

Tez vertices parallelism - 这些参数不影响它

同一个顶点实例的并行执行(mapper或者reducer,每个都可以启动多个)——它们是并行运行的——这些参数不影响它