我有一张数据量不大的表,但是日常写入中有很多动态分区,原来
spark2
写入只需2分钟就能解决,但是升级到spark3
后需要10分钟才能写完整。我了解到spark3
在向hive
写入数据时添加了更严格的事务机制,是否与此有关,应该如何解决?
这是我的任务之一,代码几乎一样调整了部分日志打印,分别使用
spark2
(左)和spark3
运行(右),在参数相同的情况下,spark3
每个作业的运行速度都明显优于spark3
,但总运行时间spark3
花了1.2h,而spark2
只花了44分钟。为什么会出现这种现象呢?这个额外的时间是用来做什么的?[上半部分是spark2 r的eventTime,下半部分是spark3的事件时间]
我尝试过设置这些参数,但没有一个效果很好:
spark.sql.hive.useDynamicPartitionWriter=false
spark.hadoop.hive.txn.manager=org.apache.hadoop.hive.sql.lockmgr.NoTxnManager
这是我第一次在 StackOverflow 上提问。如果我有什么做错的地方,请指出。我会及时改正的,谢谢!
在写入 Hive 表之前,Spark 需要读取元数据。它通过连接到配置单元元存储并提取分区信息来实现这一点。这就是你在 Spark3 中减慢工作速度的原因。在spark2中,它使用hive serdes(orc/parquet)进行读写。在spark3中,spark使用自己的原生serdes。对于大量分区,此元存储操作会变慢。您可以设置以下内容然后看看差异。
spark.sql.hive.convertMetastoreOrc=false
spark.sql.hive.convertMetastoreParquet=false