Spark 3.0 读取 JSON 文件的速度比 Spark 2.4 慢很多。

9

我有大量的json文件,Spark 2.0可以在36秒内读取这些文件,但是Spark 3.0要花费近33分钟才能读取。经过更仔细的分析,看起来Spark 3.0选择的DAG与Spark 2.0不同。有没有人知道发生了什么?Spark 3.0是否存在任何配置问题。

Spark 2.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

Spark 3.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

以下是翻译的结果:

以下是详细信息:

在此输入图像描述


也许是这个Spark Bug?一个解决方法可能是在读取Json文件时减少samplingRatio。 - werner
可能是一个 bug,或者是 Spark 3.0 使用了未经优化的 DAG - 请注意额外的 stages FileScanRDD 和 SQLExecutionRDD。我认为这两个阶段正在拖慢处理速度。 - smishra
1个回答

11

事实证明,Spark 3.0的默认行为已经改变——除非指定了模式,否则它会尝试推断时间戳,并且这将导致大量文本扫描。我尝试使用inferTimestamp=false来加载数据,这使得时间接近于Spark 2.4,但是Spark 2.4仍然比Spark 3快约3秒(也许在可接受的范围内,但问题是为什么?)。我不知道为什么更改了这个行为,但应该用粗体字通知用户。

Spark 2.4

spark.time(spark.read.option("inferTimestamp","false").json("/data/20200528/").count)
Time taken: 29706 ms
res0: Long = 2605349



spark.time(spark.read.option("inferTimestamp","false").option("prefersDecimal","false").json("/data/20200528/").count)
Time taken: 31431 ms
res0: Long = 2605349

Spark 3.0

spark.time(spark.read.option("inferTimestamp","false").json("/data/20200528/").count)
Time taken: 32826 ms
res0: Long = 2605349
 
spark.time(spark.read.option("inferTimestamp","false").option("prefersDecimal","false").json("/data/20200528/").count)
Time taken: 34011 ms
res0: Long = 2605349

注意:

  • 确保在inferTimestamp为false时也不要将prefersDecimal设置为true,否则会花费大量时间。
  • Spark 3.0 + JDK 11比Spark 3.0 + JDK 8慢近6秒。

我也发现我的pyspark代码(应用了一些PandasUDF)在Spark 3(EMR 6.3.0)上比在Spark 2.4(EMR 5.30.0)上慢。 - panc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接