hive 优化Spark作业

pbpqsu0x  于 2022-12-26  发布在  Hive
关注(0)|答案(1)|浏览(156)

我有一个从hive读取和转换数据的spark作业。数据按日期分区,每个分区大约有2gb的数据。最好的情况下,该作业每天运行,最坏的情况下,是一个月的28/29/30/31天
转换有一些变压器,导致洗牌groupby和distinct。我有一个10集群节点,总内存为1. 5 TB,有480个核心。当运行作业时,它需要永远,然后终止。
SQL转换

With dbsase as (

          SELECT 
              user_id,
              month,
              a,
              b,
              c,
              d,
              e,
              f,
              ....,
              min(day) min_day
            from db.db
            GROUP BY 
              user_id,
              month,
              a,
              b,
              c,
              d,
              e,
              f,
              ....

)
          SELECT 
            distinct min_day,
              a,
              b,
              c,
              d,
              e,
              f,
              ....

            COUNT(user_id) OVER (
            PARTITION BY 
            trunc(to_date(min_day), "MM"),
              a,
              b,
              c,
              d,
              e,
              f,
              ....

            ORDER BY min_day
            ) cumulative_active_users
            
          FROM dbsase
          ORDER BY 1

我试过在Yarn和本地两种情况下运行这项工作[*]我试过大量的增加和减少

  • 驱动程序存储器
  • 执行器存储器
  • 遗嘱执行人人数

但是工作还是很慢,请知道我错过了什么。谢谢

q3qa4bjr

q3qa4bjr1#

我觉得问题在于-
1.因为你的SQL使用的是整个表,所以它没有使用分区修剪。看看你是否可以在某个特定的月份运行。
1.对许多列执行distinct是一个内存密集型操作,您应该不惜一切代价避免它,或者构建一些其他的解决方案来完成它。

  1. Order by 1-要自动加载数据,这是无用的。如果你能避免它,看看它。
    1.不能所有列都是键列,也不能用于比较。请找到键列并在窗口函数中使用。
    如果你真的不能调整它,你可以做一个两步的方法-
    步骤1 -使用主SQL并创建一个非独特表。
With dbsase as (

          SELECT  col1, col2, min(day) min_day
            from db.db
            GROUP BY col1,col2
)
          SELECT 
            min_day, col1, col2,
            COUNT(user_id) OVER (
            PARTITION BY 
            trunc(to_date(min_day), "MM"),col1, col2,
            ORDER BY min_day
            ) cumulative_active_users
            
          FROM dbsase

步骤2 -然后使用上述阶段表,并从表中得到区别,选择/插入到最终表中。

相关问题