【问题标题】:How do I enable execution of multiple jobs in parallel Hive如何在并行 Hive 中启用多个作业的执行
【发布时间】:2020-11-13 06:18:50
【问题描述】:

我正在运行下面的 sql,其中表中的数据在 4,34,836,959 记录附近。需要 3 多分钟才能得到结果。

select distinct col_1,col_2,col_3,col_4,col_5,  
to_date(concat(year(col_6),'-',month(col_6), '-1')) as col_6_new,col_7,
cast(first_value(col_11) over (partition by col_1,col_2,col_5,col_4,concat(year(col_6),'-',month(col_6)) order by col_6) as double) as col_9,
cast(first_value(col_11) over (partition by col_1,col_2,col_5,col_4,concat(year(col_6),'-',month(col_6)) order by col_6 desc) as double) as col_10,
min(to_date(concat(year(col_6),'-',month(col_6), '-1'))) over (partition by col_1,col_2,col_5,col_4) as col_8
from my_table

当我从后台检查执行时,我可以看到一次只有 1 个 Job 和 1 个 Stage 正在运行。有没有办法并行化这个?

我什至尝试了下面的代码,但作业/阶段没有并行运行。

spark.sql("set hive.exec.parallel=true")
spark.sql("set hive.exec.parallel.thread.number=16")
spark.sql("set hive.vectorized.execution = true")
spark.sql("set hive.vectorized.execution.enabled = true")

我使用的 Spark 版本是2.3

非常感谢任何帮助。

【问题讨论】:

    标签: sql performance apache-spark hive


    【解决方案1】:

    Spark 执行计划中的每个阶段都对应于一组不需要改组的操作。

    据我所知,您的查询中至少需要 2 次随机播放:

    1. 用于计算带有 partition by col_1,col_2,col_5,col_4,concat(year(col_6),'-',month(col_6)) order by col_6 等子句的窗口函数
    2. 用于计算最终的distinct 操作。

    因此,2 次随机播放会产生 3 个 Spark 阶段。

    由于你不能在计算所有窗口函数之前做distinct,所以阶段应该一个一个地执行并且不能并行化
    要从您这边检查它,您可以在 Spark UI 中找到执行 DAG。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多