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