Spark 写 Hive table 非常慢

Posted keepthinking

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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" 应该也能加速,但是我没有尝试

















以上是关于Spark 写 Hive table 非常慢的主要内容,如果未能解决你的问题,请参考以下文章

hive使用spark引擎的几种情况

通过 Spark R 操作 Hive

spark SQL和hive到底啥关系

python spark-sql-create-hive-tables.py

Hive 查询在 spark 中失败,但在直线 Hive 中有效

通过 Spark SQL 读取 Hive Table 的最佳方法是啥?