Apache spark 并行加载spark中多个文件的最有效方法?

Apache spark 并行加载spark中多个文件的最有效方法?,apache-spark,pyspark,google-cloud-dataproc,Apache Spark,Pyspark,Google Cloud Dataproc,我需要在Spark中处理一个大数据集(~14TB)。不进行聚合,主要是过滤。给定约30k个文件(250个部分文件,10年内每月一次,每个部分约200MB),我想将它们加载到RDD/数据帧中,并根据一些任意过滤器过滤掉项目 为了提高文件列表的效率(我使用的是google dataproc/cloud storage,因此执行通配符glob的驱动程序非常串行且速度非常慢),我预先计算了文件名的RDD,然后将它们加载到RDD中(我使用的是avro,但文件类型不应该相关),例如 当我这样做时,即使是在5

我需要在Spark中处理一个大数据集(~14TB)。不进行聚合,主要是过滤。给定约30k个文件(250个部分文件,10年内每月一次,每个部分约200MB),我想将它们加载到RDD/数据帧中,并根据一些任意过滤器过滤掉项目

为了提高文件列表的效率(我使用的是google dataproc/cloud storage,因此执行通配符glob的驱动程序非常串行且速度非常慢),我预先计算了文件名的RDD,然后将它们加载到RDD中(我使用的是avro,但文件类型不应该相关),例如

当我这样做时,即使是在50个工作集群上,似乎只有一个执行者在执行读取文件的工作。我尝试过播放文件列表,读了十几种不同的方法,但我似乎无法解决这个问题

那么,有没有一种有效的方法可以从多个文件创建一个非常大的数据帧呢?在创建此RDD时,如何最好地利用所有潜在的计算能力


这种方法在较小的集合上非常有效,但是,在这种规模下,我看到大量的症状,比如没有反馈的长时间运行的进程。除了@zero323:-)之外,还有什么知识宝库可以在这种规模上优化spark吗?

列出30k文件对GCS来说不应该是一个问题-即使单个GCS列表请求一次最多列出500个文件需要1秒,所有30k文件都将在一分钟左右的时间内列出。有些情况下,某些glob模式可能会使其速度变慢,但GCS连接器最近的一些优化可能会有所帮助

这就是为什么您只需依靠globbing的默认Spark API就足够了:

val df=sqlContext.read.avro(“gs:///path/to/files/”)

您是否考虑过缓存和检查点?调整分区块怎么样?这是一个非常宽泛的问题要回答。是的,我意识到这是一个非常宽泛的问题;这是我害怕的,但我不知道下一步该去哪里。在这一点上,即使是通用的谷歌指针也可能有助于我找到合适的触发词进行研究。尽量不要成为那些“向我发送codez pls”问题中的一员。您需要更具体地了解集群和应用程序方面的性能和配置。(我并不是说这不是一个有趣的问题)这个过程的主要复杂性是,我需要在按特定键分组的行上设置行数窗口。想象一下“对于每个Id,给我第一行,按修订号降序排列。”最简单的方法是将所有内容放在一个大数据框中,然后应用窗口。我认为备份解决方案是将其分解为多个过程,检查数据,然后对所有中间输出执行最后一个过程。我只是想知道一次完成这项工作是否是一种现实的方法。你有没有找到解决办法?我也想这么做。。
[Disclaimer: While this question is somewhat specific, I think it circles a very generic issue with Hadoop/Spark.]
#returns an array of files to load
files = sc.textFile('/list/of/files/').collect()  

#load the files into a dataframe
documents = sqlContext.read.format('com.databricks.spark.avro').load(files)