【问题标题】:Spark 3.0 is much slower to read json files than Spark 2.4Spark 3.0 读取 json 文件比 Spark 2.4 慢得多
【发布时间】:2020-10-18 08:29:37
【问题描述】:

我有大量的 json 文件,Spark 可以在 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 文件时降低采样率
  • 可能是一个错误,也可能是 Spark 3.0 使用了未优化的 DAG - 请注意 FileScanRDD 和 SQLExecutionRDD 的其他阶段。我想这两个正在减慢处理速度。

标签: scala apache-spark java-11 spark3


【解决方案1】:

事实证明,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

注意:

  • 确保永远不要将 prefersDecimal 设置为 true,即使在 inferTimestamp 是假的,这又需要大量的时间。
  • 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) 慢。
猜你喜欢
  • 1970-01-01
  • 2016-08-18
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 2017-03-05
相关资源
最近更新 更多