我有3个文件夹,包含3个不同模式的HDFS中的csv文件。所有3个文件都很庞大(几个GB)。我想并行读取文件并并行处理它们中的行。我如何使用Spark?
在纱线群上完成此任务答案 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 配置。