我一直在阅读Hadoop, YARN和SPARK。到目前为止,对我来说有意义的是我总结如下:
Hadoop MapReduce:客户端选择一个输入文件并将其交给Hadoop(或YARN)。Hadoop负责拆分基于用户的InputFormat,并将其存储在尽可能多的可用节点上和配置的客户端提交一个作业(map-reduce)给YARN,其中将jar复制到可用的数据节点并执行作业。纱是负责所有调度和运行的编排器实际任务
Spark:给定一个任务,输入和一堆配置参数,它可以运行你的工作,这可能是一系列的转换和为您提供输出。
我也明白MapReduce是一个基于批处理的范式和SPARK更适合微批量或基于流的数据。
有很多文章讨论Spark如何在YARN上运行以及它们是如何互补的,但是没有一篇文章能够帮助我理解这两者在实际工作流程中是如何结合在一起的。例如,当客户端有一个作业要提交,读取一个巨大的文件,并做一堆转换时,在YARN上使用Spark的工作流是什么样子的?让我们假设客户机的输入文件是一个100GB的文本文件。请附上尽可能多的细节
如果有任何帮助,我将不胜感激
谢谢凯
假设大文件存储在HDFS中。在HDFS中,文件被分成一定大小的块(默认为128 MB)。
这意味着你的100GB文件将被分成800块。每个块将被复制,并且可以存储在集群的不同节点上。使用Hadoop InputFormat
读取文件时,首先获取带有location的split列表。然后在每个拆分中创建一个任务。你将得到800个并行任务,在运行时执行。
基本上,MapReduce和Spark的输入过程是相同的,因为它们都使用Hadoop输入格式。
它们都将在单独的任务中处理每个InputSplit
。主要的区别在于,Spark有更丰富的转换集,如果有一系列可以同时应用的转换,它可以优化工作流。与MapReduce相反,map和reduce阶段总是只有。
YARN代表"Yet another resource negotiator"。当提交具有某些资源需求(内存、处理器)的新作业时,YARN负责检查集群上是否有所需的资源可用。如果集群上运行的其他作业占用了太多的资源,那么新作业将等待,直到以前的作业完成并且资源可用。
YARN将在集群中为worker分配足够的容器,并为Spark驱动程序分配一个容器。在每个容器中,JVM都是用给定的资源启动的。每个Spark worker可以并行处理多个任务(取决于每个executor配置的内核数)。。
如果每个Spark executor设置8个内核,YARN会尝试在集群中分配101个容器来运行100个Spark worker + 1个Spark master (driver)。每个工人将并行处理8个任务(因为有8个核心)。