Spark - 如何并行读取多个文件作为数据帧?

Spark - How to read multiple files as DataFrames in parallel?

我有一个已定义的 S3 文件路径列表,我想将它们作为数据帧读取:

ss = SparkSession(sc)
JSON_FILES = ['a.json.gz', 'b.json.gz', 'c.json.gz']
dataframes = {t: ss.read.json('s3a://bucket/' + t) for t in JSON_FILES}

上面的代码有效,但是以一种意想不到的方式。代码提交到Spark集群时,一次只读取一个文件,只占用一个节点。

有没有更高效的读取多个文件的方法?一种让所有节点同时工作的方法?


更多详情:

要在 Spark 中读取多个输入,请使用通配符。无论您是构建数据框还是 rdd,都是如此。

ss = SparkSession(sc)

dataframes = ss.read.json("s3a://bucket/*.json.gz")

问题是:我不了解Spark的运行时架构。 Spark 有 "workers" 的概念,如果我现在更好地理解它(不要相信我),它能够并行处理事情。当我们提交一个 Spark 作业时,我们可以同时设置两个东西,即工作人员的数量和他们可以利用的并行度级别。

如果您使用的是 Spark 命令 spark-submit,这些变量表示为以下选项:

  • --num-executors:类似于workers
  • 的概念
  • --executor-cores:一个 worker 应该使用多少 CPU 个内核

This 是一份帮助我理解这些概念以及如何调整它们的文档。

回到我的问题上来,在那种情况下,我会为每个文件配备一名工作人员。