0


Spark与Hadoop对比

核心组件对比

  • Hadoop:是一个分布式数据存储和计算框架。 1. HDFS(Hadoop Distributed File System):是一个分布式文件系统,能够大规模的数据分散存储在多个节点上,以提高数据的可靠性和处理效率。HDFS的主要职责是对数据的存储和管理,将大数据集分成多个数据块,并分配到不同的计算几点上进行存储。 1. Client:切分文件;访问HDFS;与NameNode交互,获取文件位置信息;与DataNode交互,读取和写入数据;2. NameNode:Master节点,管理HDFS的名称空间和数据块映射信息,配置副本策略,处理客户端请求;3. DataNode:Slave节点,存储实际的数据,汇报存储信息给NameNode;4. SecondaryNameNode:辅助NameNode,分担其工作量了合并fsimage和fsedits,推送给NameNode;紧急情况下,可辅助恢复NameNode,但Secondary NameNode并非NameNode的热备。2. MapReduce:这是Hadoop分布式计算架构,它提供了一个简单的编程模型,可以通过将大规模数据分解成多个小任务并行处理,从而大大提高数据处理的效率。MapReduce包括Map阶段和Reduce阶段,分别将数据分解合并处理结果。 1. JobTracker:Master节点,只有一个,管理所有作业,作业/任务的监控、错误处理等;将任务分解成一系列任务,并分派给TaskTracker。2. TaskTracker:Slave节点,运行Map Task和Reduce Task;并与JobTracker交互,汇报任务状态;3. Map Task:解析每条数据记录,传递给用户编写的map(),并执行,将输出结果写入本地磁盘(如果是map-only作业,直接写入HDFS);4. Reduce Task:从Map Task的执行结果中,远程读取输入数据,对数据进行排序,将数据按照分组传递给用户编写的reduce函数执行。3. YARN(Yet Anthor Resource Negotiator):作为Hadoop的资源管理器,Yarn负责为多个应用程序分配和管理计算资源,可以提高计算资源的利用率。YARN可以将集群中的计算资源划分为多个容器,并为不同的应用程序提供适当的资源,同时监控和管理各个应用程序的运行状态。 1. ResourceManager:处理客户端请求;启动/监控ApplicationMaster;监控NodeManager;资源分配与调度;2. NodeManager:单个节点上的资源管理;处理来自ResourceManager的命令;处理来自ApplicationMaster的命令;3. ApplicationMaster:数据切分;为应用程序申请资源,并分配给内存任务;任务监控与容错。
  • Spark:是一个分布式数据处理框架,设计目标是提供一个快速、通用和易用的大数据计算平台。Spark不包括自己的文件系统,通常与HDFS一起使用。基于Spark Core扩展四个核心组件。 1. Spark SQL:主要用于结构化数据的处理。能够将SQL查询和Spark程序无缝混合,支持Hive、Parquet、ORC、Json等数据源,支持HSQL。2. Spark Streaming:主要用于快速构建可扩展、高吞吐量、高容错的流处理程序,支持从HDFS、Flume、Kafka、Twitter和ZeroMQ读取数据,并进行处理。3. Spark MLib:是Spark的机器学习库。设计目标是使得机器学习变得简单且可扩展。提供了常见的机器学习的算法,特征提起、转换、降维和选择的特征化处理,构建了ML的管道工具,是一个可以做数据持久化的实用性工具。4. Graphx:GraphX是Spark中用于图形计算和图形并行计算的新组件。GraphX通过引入一个新的图形抽象来扩展RDD(弹性分布式数据集),可以附加到每个顶点和边缘的属性的定向多重图形。

适用场景对比

    通常情况下,Apache Spark运行速度是要比Apache Hadoop MapReduce的运行速度要快,因为Spark是在继承了MapRudece分布式计算的基础上做了内存计算的优化,从而避免了MapReduce每个阶段都要数据写入磁盘的操作,这样就减少了很多低效的I/O操作。MapReduce与Spark的适用场景分别如下:
  • Spark: 1. 默认不排序,处分使用SortByKey算子;2. 快速的数据分析和处理;3. 迭代计算多;4. 交互查询;5. 实时性要求较高
  • MapReduce: 1. 默认是排序的;2. 离线的;3. 大规模批处理任务。

任务执行流程对比

  • Spark: 1. 用户提交程序,创建SparkApplication的运行环境;2. SparkContext向资源管理器注册并向资源管理器申请Executor;3. 资源管理器分配并启动Executor;4. Executor将自己运行情况通过心跳的形式发送给资源管理器;5. SparkContext构建DAG有向无环图;6. 将DAG按照款窄依赖划分成不同的Stage(Taskset);7. 把Stage发送给TaskScheduler;8. Executor向SparkContext申请Task;9. TaskScheduler将Task发送给Executor运行;10. 同时SparkContext将应用程序代码发放给Executor;11. Task在Executor上运行,运行完毕释放所有资源。
  • MapReduce: - Map端 1. 待处理文件大小是200M;2. 读取数据组InputFormat(默认TextInputFormat),会通过getSplit方法对输入目录中的文件进行逻辑切片规划到Block,有多少个block就会对应多少个MapTask,0-128M 128M-200M;3. 将输入文件切分为Block后,由RecordReader对象(默认LineRecordReader)进行读取,以\n作为分隔符,读取一行数据,返回<key,value>,key表示每行首字符偏移值,value表示这一行的文本内容;4. 读取Block返回<key,value>,进入用户自己集成的Mapper类中,执行用户重写map函数,RecordReader读取一行这里调用一次;5. 分区:Mapper逻辑结束以后,将Mapper的每条结果通过context。写入进行collect数据收集,在collect中会先对其进行分区处理,默认使用hashPartitioner;6. 排序:接下来,数据会写入内存缓冲区(默认100M),环形缓冲区的作用是批量收集Mapper的结果,减少磁盘IO的影响,我们的Key/value对以及Partition的结果都会被写入缓冲区,写之前key和value都会被序列化成字节数组;7. 溢写到文件:当环形缓冲区的数据达到阈值(0.8),也就是80M是,溢写程序启动,程序将80M的数据进行排序(Sort),排序是MapReduce模型默认的行为,这里排序也是对序列化的字节做排序。8. Merge归并排序:合并溢写文件,每次溢写会在磁盘上生成一个临时我呢见,如果Mapper的输出结果很大,有多次溢写发生,磁盘上就会生成多个临时文件,当整个数据处理结束之后开始对磁盘中的临时文件进行merge合并,因为最终的文件只有一个写入磁盘,并且为这个文件提供一个索引文件,以记录每个reduce对应数据的偏移量;9. 合并:相当于预聚合,把<a,1>,<a,1>合并成<a,2>- Reduce端 1. copy阶段:简单的拉取数据。Reduce进行启动溢写数据copy线程(Fetcher),通过HTTP方式请求maptask获取属于自己的文件(map task的分区会表示每个maptask 属于哪个reduce task);2. Merge阶段:在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘的文件进行合并,以防止内存使用过多或磁盘上文件过多。Merger的三种方式:内存到内存;内存到磁盘;磁盘到磁盘。默认情况下第一种形式不启用。当内存中的数据量达到一定阈值,就直接启动内存到磁盘merge。与map端相似,这也是溢写的过程,这个过程如果设置了Combiner,也会启动,然后在磁盘中生成众多的溢写文件。内存到磁盘merge到一直在运行,直到没有map端的数据才结束,然后启动第三种磁盘到磁盘的merge方式生成最终的文件;3. 合并排序:把分散的数据合并成一个大数据后,还会再对合并后的数据进行排序;4. 对排序后的键值对调用reduce方法:键相等的键值对调用一次reduce方法,每次调用会产生0个或者多个键值对,最后把这些输出的键值对写入到hdfs文件中。

SQL执行的流程对比

  • Spark: 1. parser:基于antlr框架对sql解析,生成抽象语法树;2. 变量替换:通过正则表达式找出符合规则的字符串,替换成系统缓存环境的变量;3. parser:将antlr的tree转成spark catalyst的LogicPlan,也就是未解析的逻辑计划;4. analyzer:通过解析器,结合catalog,把logical plan和实际的数据绑定起来,将未解析的逻辑计划生成逻辑计划;5. 替换缓存:通过CacheManager,替换有相同结果的 logical plan(逻辑计划);6. logical plan优化,基于规则的优化;优化规则参考Optimizer,优化执行器RuleExecutor;7. 生成spak plan,也就是物理计划;8. spak plan准备阶段9. 构成RDD执行,涉及Spark的wholeStageCodegenExec机制,基于janino框架生成java代码并编译。
  • MapReduce: 1. 词法、语法解析:Antlr定义sql语法规则,完成SQL词法、语法解析,将SQL转化未抽象语法树AST Tree;2. 语义解析:遍历AST Tree抽象语法树,抽象出查询的基本组成单元QueryBlock;3. 生成逻辑执行计划:遍历QueryBlock,翻译为执行操作树Operator;4. 优化逻辑执行计划逻辑层优化器进行OperatorTree变换,合并Operator,达到减少MapReduceJob,减少数据传输及Shuffle数据量;5. 生成物理执行计划:遍历OperatorTree,翻译为MapReduce任务;6. 优化物理执行计划:物理层优化器进行MapReduce任务的变换,生成最终的执行计划。

容错对比

    容错是指一个系统在部分模块出现故障时还能否继续的对外提供服务,一个高可用的系统应该具备很高的容错性。
  • Spark: 1. Lineage机制:RDD(弹性分布式数据集)的Lineage记录的是粗粒度的特定数据transformation操作(如filter、map、join等)行为。当这个RDD的部分分区数据丢失是,它可以通过Lineage获取足够的信息来重新运算和恢复丢失的数据分区。RDD又区分宽依赖跟窄依赖:窄依赖可以在某个计算节点上直接通过计算父RDD的某块数据计算得到子RDD对应的数据块,相当于Redo日志的功能;宽依赖则需要父RDD的所有数据块全部重新计算来恢复,相当于在调度中构建DAG不同Stage划分点,代价比较大。2. Checkpoint机制:是把RDD保存到HDFS中,是多副本可靠存储,所以依赖链就可以丢掉了,斩断了依赖链,是通过复制实现的高容错。检查点(本质是通过将RDD写入Disk做检查点)是为了通过Lineage做容错的辅助,Lineage过长会造成容错成本过高,这样就不如在中间阶段做检查点容错,如果之后右节点出现问题而丢失分区,从检查点的RDD开始重做Lineage,就会减少开销,在宽依赖中做Checkpoint收益更大。
  • HDFS-MapReduce: 1. HDFS副本放置策略:HDFS具有很好的容错性的分布式存储系统,它利用了复制技术实现数据容错能力,数据会被复制多份并存储在集群的不同节点。这样集群中的某些机器宕机了,数据还可从其他正常运行的机器读取;2. 读数据容错:由于在读HDFS的过程中会从NameNode获取到数据块位置列表,如果某个DataNode失效,换个DataNode即可;3. 写数据容错:写HDFS的过程中会多个DataNode建立管道进行写入,如果数据发送者没有收到某个DataNode的ACK,则认为DataNode失效,会跳过该DataNode并将数据写入剩余DataNode。NameNode收集DataNode信息时发现文件的副本数与设置的不一致,会重新寻找一个DataNode保存副本;4. HDFS的HA架构:NameNode会被配置到两台独立的服务器上,在任何时候,一个NameNode处于Active状态,而另一个NameNode处于Standby状态,Active状态的NameNode会响应集群中所有的客户端的请求,Standby状态的NameNode只是作为一个副本,保证在必要的时候提供一个快速的响应策略,使得上层对NameNode的切换无感知,Standby NameNode与Active NameNode应时刻保持同步,在Actice NameNode和Standby NameNode之间要有个共享的存储日志的地方,使得两个NameNode元数据保持一致;5. MapReduce计算容错:MapReduce每个阶段的中间结果落入磁盘
标签: hadoop spark 大数据

本文转载自: https://blog.csdn.net/xiayuhaisong/article/details/136020601
版权归原作者 大数据松松 所有, 如有侵权,请联系我们删除。

“Spark与Hadoop对比”的评论:

还没有评论