为什么spark3动态分区写入hive很慢

问题描述 投票:0回答:1

问题1:

我有一张数据量不大的表,但是日常写入中有很多动态分区,原来

spark2
写入只需2分钟就能解决,但是升级到
spark3
后需要10分钟才能写完整。我了解到
spark3
在向
hive
写入数据时添加了更严格的事务机制,是否与此有关,应该如何解决?

问题2:

这是我的任务之一,代码几乎一样调整了部分日志打印,分别使用

spark2
(左)和
spark3
运行(右),在参数相同的情况下,
spark3
每个作业的运行速度都明显优于
spark3
,但总运行时间
spark3
花了1.2h,而
spark2
只花了44分钟。为什么会出现这种现象呢?这个额外的时间是用来做什么的?[上半部分是spark2 r的eventTime,下半部分是spark3的事件时间] enter image description here Enter image description here 我尝试过设置这些参数,但没有一个效果很好:

  • spark.sql.hive.useDynamicPartitionWriter=false
  • spark.hadoop.hive.txn.manager=org.apache.hadoop.hive.sql.lockmgr.NoTxnManager

这是我第一次在 StackOverflow 上提问。如果我有什么做错的地方,请指出。我会及时改正的,谢谢!

apache-spark apache-spark-sql hive bigdata spark3
1个回答
0
投票

在写入 Hive 表之前,Spark 需要读取元数据。它通过连接到配置单元元存储并提取分区信息来实现这一点。这就是你在 Spark3 中减慢工作速度的原因。在spark2中,它使用hive serdes(orc/parquet)进行读写。在spark3中,spark使用自己的原生serdes。对于大量分区,此元存储操作会变慢。您可以设置以下内容然后看看差异。

spark.sql.hive.convertMetastoreOrc=false
spark.sql.hive.convertMetastoreParquet=false
© www.soinside.com 2019 - 2024. All rights reserved.