【发布时间】:2018-04-13 16:27:56
【问题描述】:
我正在尝试从两个不同的位置 A 和 B 读取镶木地板文件。它们都是 GCP 中的镶木地板文件,架构中的列数大致相同(80 - 90,主要是字符串)。 B 的文件大小和记录数非常小(大约比 A 小 5 个数量级)。但是从 GS 读取 A 所需的时间大致相同。我想知道为什么会这样。
scala> show_timing{spark.read.parquet("gs://bucket-name/tables/A/year=2018/month=4/day=5/*")}
Time elapsed: 34862525 microsecs
res5: org.apache.spark.sql.DataFrame = [a1: string, a2: string ... 84 more fields]
scala> show_timing{spark.read.parquet("gs://bucket-name/tables/B/year=2018/month=4/day=5/*")}
Time elapsed: 25094417 microsecs
res6: org.apache.spark.sql.DataFrame = [b1: string, b2: string ... 81 more fields]
scala> res5.count()
res7: Long = 2404444736
scala> res6.count()
res8: Long = 98787
我的 spark 版本是 2.2。我知道这不是很多信息。但我不太确定还有什么要调查的。
【问题讨论】:
-
每种情况下分区和执行器的数量是多少?
-
两台相同的 gcp n1-standard-8(8 核)机器具有 60 个工作节点。
--executor-cores和--num-executors没有额外设置。 -
day=5/* 中单个 .parquet 文件的数量是多少?例如,如果那里只有一个文件,尽管您有很多可用的文件,但只有一个执行者会读取它。另一方面,如果有成千上万的小文件,打开它们的成本可能太高,在将数据保存到此分区时,将它们合并为少量较大的文件是值得的。另外,在 Spark UI 中查看是否所有执行器在读取阶段都被平等地利用。
-
对于案例 B,它每小时一个文件。所以每天24个。每个文件的大小小于 2MB。在案例 A 中,每小时大约有 200 个文件,每个文件 150 MB。差别比较大。我要增加每个核心的执行者,看看。
标签: scala apache-spark parquet