我有大量的json文件,spark可以在36秒内读取,但是spark3.0几乎需要33分钟才能读取。仔细分析,看起来spark 3.0选择的dag与spark 2.0不同。有人知道发生了什么事吗?spark 3.0是否存在任何配置问题。
Spark2.4
scala> spark.time(spark.read.json("/data/20200528"))
Time taken: 19691 ms
res61: org.apache.spark.sql.DataFrame = [created: bigint, id: string ... 5 more fields]
scala> spark.time(res61.count())
Time taken: 7113 ms
res64: Long = 2605349
Spark3.0
scala> spark.time(spark.read.json("/data/20200528"))
20/06/29 08:06:53 WARN package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.
Time taken: 849652 ms
res0: org.apache.spark.sql.DataFrame = [created: bigint, id: string ... 5 more fields]
scala> spark.time(res0.count())
Time taken: 8201 ms
res2: Long = 2605349
详情如下:
1条答案
按热度按时间c0vxltue1#
结果表明,spark 3.0的默认行为已经发生了变化——它试图推断时间戳,除非指定了模式,这将导致大量的文本扫描。我试着用infertimestamp=false加载数据,虽然时间确实接近spark2.4,但spark2.4仍然比spark3快了3秒(可能在可接受的范围内,但问题是为什么?)。我不知道为什么这个行为被改变了,但是应该用粗体字通知它。
Spark2.4
Spark3.0
注:
确保永远不要启用prefersdecimal to true,即使infertimestamp为false,也需要大量时间。
spark 3.0+jdk 11比spark 3.0+jdk 8慢近6秒。