Spark 在驱动程序中而不是在执行程序中读取 orc 文件

Spark reading orc file in driver not in executors

我在 s3 中有 30GB 的 ORC 文件 (24 部分 * 1.3G)。我正在使用 spark 来读取这个 orc 并进行一些操作。但是根据我观察到的日志,甚至在执行任何操作之前,spark 正在打开并从 s3 读取所有 24 个部分 (仅读取文件需要 12 分钟)。但我在这里担心的是,所有这些读取操作都在发生 only in driver and executors are all idle 此时。

谁能解释一下为什么会这样?有什么方法可以让所有的执行者也能阅读吗?

这同样适用于镶木地板吗?

提前致谢。

ORC 和 Parquet 都可以检查文件页脚中的摘要数据,并且根据 s3 客户端及其配置,可能会导致它执行一些非常低效的 IO。这可能是原因。

如果您正在使用 s3a:// 连接器和 Hadoop 2.8+ 的底层 JAR,那么您可以将其指定为在柱状数据上实现最佳性能所需的随机 IO,并调整其他一些东西。

val OPTIONS = Map( "spark.hadoop.fs.s3a.experimental.fadvise" => "random" "spark.hadoop.orc.splits.include.file.footer" -> "true", "spark.hadoop.orc.cache.stripe.details.size" -> "1000", "spark.hadoop.orc.filterPushdown" -> "true" "spark.sql.parquet.mergeSchema" -> "false", "spark.sql.parquet.filterPushdown" -> "true" )

您是否提供了数据架构?

如果没有,Spark 会尝试获取所有文件的架构,然后继续执行。