Spark 写 Hive table 非常慢【解决】

代码如下:

dataFrame.createOrReplaceTempView("view_page_utm")

val sql =
  s"""
    |insert overwrite table data_lake_v1.urchin_tracking_module PARTITION(cd='$date', tag ='ads')
    | select p_id, platform, utm_campaign, utm_source, utm_term, utm_medium, ext_timestamp
    |   from view_page_utm
  """.stripMargin
logger.info(s"sql -> $sql")
spark.sql(sql)
logger.info("sql done.")

执行代码 spark.sql 执行了 15 分钟,看到 spark job 也结束了,但是 sql done 的日志,过了 40 分钟才出来。观察了 spark driver 上的日志,感觉时间花在 Hive 在拷贝文件上。

解决方案
1. 默认情况下, dataFrame 有 200 个分区,往 hive 中也写入了 200 的文件。这儿做了
dataFrame.reparition(1)
速度就有了巨大提升
2. 具体原理没有特别理解,查到一个相关的问题:
https://issues.apache.org/jira/browse/HIVE-13382
https://issues.apache.org/jira/browse/HIVE-11940
其中第二的链接说,hive 为每一个分区创建一个 distcp 任务,所以分区越多越慢。
设置 “exec.stagingdir=/tmp/hive” 应该也能加速,但是我没有尝试