使用Spark,如何从HDFS中的不同文件夹并行读取多个文件?

时间:2017-10-03 08:59:27

标签: apache-spark

我有3个文件夹,包含3个不同模式的HDFS中的csv文件。所有3个文件都很庞大(几个GB)。我想并行读取文件并并行处理它们中的行。我如何使用Spark?

在纱线群上完成此任务

4 个答案:

答案 0 :(得分:1)

假设您正在使用Scala,使用hdfs客户端和.par便捷方法创建文件的并行集合,然后将结果映射到spark.read并调用一个动作 - 瞧,如果群集中有足够的资源,你将并行读取所有文件。在最坏的情况下,Spark的作业调度程序会将某些任务的执行洗牌,以减少等待时间。

如果你没有足够的工人/执行者,你就不会获得太多收益,但如果你这样做,你可以充分利用这些资源,而不必等到每个工作完成,然后再发出下一个工作。

由于懒惰的评估,这可能会发生,取决于您使用数据的方式 - 但您可以通过使用并行或期货强制并行执行多个操作/作业。

答案 1 :(得分:0)

在“并行读取文件并并行处理其中的行”中你是什么意思? Spark根据您的应用程序配置(num-executors,executor-cores ...)并行处理您的数据。 如果你的意思是“同时开始阅读文件并同时处理”,我很确定,你无法明确地得到它。它需要一些能力来影响应用程序的DAG,但据我所知,在将数据流程构建为一系列转换/动作时,唯一的方法是隐式执行。 Spark也是以这种方式设计的,如果您的资源分配允许,它可以“开箱即用”同时执行几个阶段。

答案 2 :(得分:0)

如果要分别处理所有数据,可以始终编写3个spark任务来单独处理它们并在群集中并行执行它们。有几种方法可以并行运行所有3个作业。最直接的是拥有一个带有3个并行子工作流程的oozie工作流程。

现在,如果要在同一作业中处理3个数据集,则需要按顺序读取它们。之后,您可以处理数据集。使用spark操作处理多个数据集时,Spark会为您并行化。关闭操作将被运送给执行者,所有操作都将并行工作。

答案 3 :(得分:0)

我最近遇到了类似的情况。 您可以传递带有路径的 CSV 列表以激发读取 api,例如 spark.read.json(input_file_paths) (source)。这将加载单个数据帧中的所有文件,最终执行的所有转换将由多个执行程序并行完成,具体取决于您的 spark 配置。