代碼如下:
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" 應該也能加速,但是我沒有嘗試