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

polhcujo  于 2023-10-18  发布在  Hive
关注(0)|答案(1)|浏览(248)

问题一:

我有一个表,数据量很小,但在日常写操作中有很多动态分区,原来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上提问。如果我做错了什么,请指出来。我会及时改正的,谢谢!

0s0u357o

0s0u357o1#

在写入Hive表之前,Spark需要读取元数据。它通过连接到配置单元元存储区并提取分区信息来实现。这就是为什么你在spark 3中的工作会变慢。在spark 2中,它使用hive serdes(orc/parquet)进行读写。在spark 3中,spark使用自己的本地serdes。对于大量的分区,这个元存储操作会变慢。您可以设置以下内容,然后查看差异。

  1. spark.sql.hive.convertMetastoreOrc=false
  2. spark.sql.hive.convertMetastoreParquet=false

相关问题