Spark进行昂贵的S3 API调用

时间:2020-03-08 18:51:36

标签: apache-spark amazon-s3 databricks

我有一个spark作业,该作业接收约100k个文件的列表,并每10分钟被调用一次。这些文件在s3中。路径如下:

s3://<bucket>/<folder>/<file_name>

文件加载如下:

df = spark.read.option("mergeSchema", "true").schema(schema).parquet(*files)

在后台,似乎spark对每个文件进行了LIST和HEAD API调用。这是非常浪费的,因为这些文件是文件,而不是目录,并且由于工作性质而被保证存在。我查看了spark代码库,看来,此行为是InMemoryFileIndex的一部分。有没有一种方法可以将spark配置为直接拨打 GET 电话并跳过列表/头部电话?

1 个答案:

答案 0 :(得分:1)

这非常浪费,因为这些文件不是目录,并且由于作业的性质而保证存在。

这里的问题是文件系统层不知道“工作的本质”,因此它有时会做自己的探测

看起来也像InMemoryFileIndex.scala效率很低;它除了HDFS的一些硬编码位外,还执行自己的树状遍历,并且似乎确实重新扫描了刚刚列出的所有文件。

是的,正如开源项目所说的那样,还有改进的余地。但是因为他们也倾向于说“请提交补丁”