理解Hadoop & Spark

理解Hadoop & Spark,第1张

理解Hadoop & Spark

Hadoop

Spark

1. Spark与Hadoop的关系

2. Spark的特点

3. Spark架构&工作流程

名词解释

运行过程

补充Job,Stage,Task的关系

DAG和RDD是什么

RDD的相关 *** 作(creation, transformation, action)

开发者需要做哪部分工作


Hadoop

在大数据的背景下,我们需要分布式数据存储和处理的工具,来解决一些现实问题(如:基础设施崩溃(hardware broken/network failure);data combination(处理来自多个源头的数据))(这些问题都是集中式系统面临的挑战)。因此Hadoop系统得到广泛应用。

Hadoop系统分为两部分,HDFS(hadoop distributed file system) 和 MapReduce(processing framework)。 HDFS是分布式文件系统,可以进行创建、删除、移动、重命名文件、读/写文件等 *** 作。有一个NameNode和多个DataNode,NameNode负责管理文件系统的名字空间和控制外部客户机的访问;DataNode 提供存储块,存储在 HDFS 中的文件被分成块,然后将这些块复制到多个计算机中(DataNode)中。NameNode 决定是否将文件映射到 DataNode 上的复制块上。HDFS 的主要目的是支持以流的形式访问写入的大型文件。下图为HDFS的读,写 *** 作过程。

         

MapReduce模型由Map,shuffle,reduce这三部分组成,原理如下图:

Split和Map环节的各块数据,在不同的计算机中处理;经过MapReduce的shuffle环节,再将不同单词的词频总计任务分配给不同的reducer(计算机);最后由reduce到output环节再merge到一台计算机上。最初的MapReduce模型可能效率跟不上大数据需求,但是这种编程思想是值得学习的。参考知乎问题:mapreduce为什么被淘汰了? - 知乎

Spark

这个文章写的很好:Spark: 基本架构及原理。接下来的内容很多选取自此文章。

1. Spark与Hadoop的关系

Spark是在Hadoop系统上的改进产物。它是专为大规模数据处理而设计的快速通用的计算引擎,提供了一个全面、统一的框架用于管理各种有着不同性质(文本数据、图表数据等)的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求。Spark本身并没有提供分布式文件系统,因此其分析大多依赖于Hadoop的分布式文件系统HDFS;Hadoop的MapReduce与spark都可以进行数据计算,而相比于Mapreduce,spark的速度更快并且提供的功能更加丰富。关系如下:

2. Spark的特点

Spark有以下几个特点:

速度快:内存计算;DAG作为逻辑执行计划,分解Task,计算RDD之间的依赖关系易用性:使用RDD数据结构;支持很多语言:scala,python,R,JAVA,SQL模块化:提供了很多库:Spark Core、Spark SQL、Spark Streaming、MLlib、GraphX等多种模式:能在独立的clusters,Hadoop平台,云平台(AWS/Azure)等上运行; 能访问不同的数据源:HDFS, Hbase, Hive等 3. Spark架构&工作流程

名词解释

先看第一幅图,这些名字都是都是干什么的:

Application: 用户编写的Spark应用程序。一个application有一个driver和多个jobs.Driver: 运行上述Application的main函数并创建SparkContext:准备Spark应用程序的运行环境,ClusterManager通信,进行资源申请、任务的分配和监控等,当Executor部分运行完毕后,Driver同时负责将SparkContext关闭,通常用SparkContext代表Driver。SparkSession:用Spark编程的入口,一个application对应一个SparkSession.Cluster Manager:主节点,控制整个集群,监控worker,资源管理器的角色;Worker Node:从节点,负责控制计算节点,启动Executor或者Driver;集群中任何可以运行Application代码的节点。Executor:执行器,是为某个Application运行在worker node上的一个进程, 来运行某个task。 运行过程

参考第二幅图:

构建Spark Application的运行环境,启动SparkContextSparkContext向cluster manager申请运行Executor资源,并启StandaloneExecutorbackendExecutor向SparkContext申请TaskSparkContext将应用程序分发给ExecutorSparkContext构建成DAG图,将DAG图分解成Stage、将Taskset发送给Task Scheduler,最后由Task Scheduler将Task发送给Executor运行Task在Executor上运行,运行完释放所有资源  补充Job,Stage,Task的关系

Job: 包含多个Task组成的并行计算,往往由Spark Action触发生成, 一个Application中往往会产生多个Job。(it consist of RDD(s) and operations on RDD(s)——关于RDD看下面就明白了)Stage:每个Job会被拆分成多个Stage(一个Stage就是一个Taskset),Stage的划分和调度是有DAGScheduler来负责的Task:是被送到某个Executor上的工作单元,是运行Application的基本单位,多个Task组成一个Stage,而Task的调度和管理等是由TaskScheduler负责 DAG和RDD是什么

RDD(Resilient Distributed Datasetsd性分布式数据集):

是分布式内存的一个抽象概念,可以看作是Spark的一个对象,它本身运行于内存中,如读文件是一个RDD,对文件计算是一个RDD,结果集也是一个RDD ,不同的分片、 数据之间的依赖 、key-value类型的map数据都可以看做RDD;它允许开发人员在大型集群上执行基于内存的计算,将数据保存在内存中能够极大地提高性能;为了有效地实现容错,RDD提供了一种高度受限的共享内存,即RDD是只读的,并且只能通过其他RDD上的批量 *** 作来创建。尽管如此,RDD仍然足以表示很多类型的计算,包括MapReduce和专用的迭代编程模型等。(可以理解了,为什么Spark更快,并且容错度也较高,并且也可以实现mapreduce及更多的功能)RDD作为数据结构,本质上是一个只读的分区记录集合。一个RDD可以包含多个分区,每个分区就是一个dataset片段。RDD可以相互依赖。如果RDD的每个分区最多只能被一个Child RDD的一个分区使用,则称之为narrow dependency;若多个Child RDD分区都可以依赖,则称之为wide dependency。不同的 *** 作依据其特性,可能会产生不同的依赖。如下图所示:每个大蓝框是一个RDD,每个小蓝框是一个分区,左边所示每个分区只映射到一个childRDD的一个分区中,所以是narrow dependency;右边所示每个分区映射到了一个childRDD的多个分区中,所以是wide dependency。为什么不同 *** 作会有不同的映射关系,其实也好理解,比如map *** 作的含义就是将某个function应用到每个元素中,产生对应的每个结果,所以是这样一对一的关系。

DAG(Directed Acyclic Graph有向无环图):就是将一个计算任务画成这种有向无环图:先构建DAG,再依据RDD之间的依赖关系分解成Stage,再将Stage分解成tasks,再去送到executor那里执行(上述层次 *** 作在sparkcontext那里有体现)。举例DAG如下面第一幅图所示,整个computing的过程如下面第二幅图所示:

RDD的相关 *** 作(creation, transformation, action)

creation: 创造RDD有两种方式:

parallize一个现有数据集

rdd = spark.sparkContext.parallelize(data)
从外部存储中读取
rdd = spark.read.text("datafilepath")
transformation: 有如下方法:

action:有如下方法:

开发者需要做哪部分工作

这整个过程中,需要开发者编程的部分就是:Application: application program developed by user;Job:consist of RDD(s) and operations on RDD(s)。其他诸如将DAG划分为Stage,再分解成task,再传递给executor执行等 *** 作都是spark系统的后续工作,不需要我们处理。

写在最后:

本文概述了Hadoop系统的构成(HDFS+MapReduce),Spark的原理,以及二者的关系。

由于数据规模越来越大,在传统的集中式架构基础上诞生了Hadoop分布式数据存储及处理系统;而随着实时处理海量数据的需求日益强烈,在原有HDFS+MapReduce基础上又诞生了Spark计算引擎。

Spark为什么可以比MapReduce更快更友好,主要是它利用内存计算(RDD),建立了一整套生态系统,包括RDD的 *** 作,绘制DAG计算图,分解任务,中央调度,分配任务,执行任务,释放资源等等。在这个基础架构下,Spark可以支持不同语言的 *** 作,还提供了很多不同的库,还可以访问各个云平台,就像我们最开始说的:它提供了一个全面、统一的框架用于管理各种有着不同性质(文本数据、图表数据等)的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求。可以说是非常好用了。

但是会不免在想:这些系统/方法在短短十几年时间里,一直在更新,会不会再过几年,Spark又被某种新的方法取代了。很有可能啊,技术总是随着需求的改变而不停更新的啊,作为技术工作者,是要不停学习新的更新产物,但会不会产生这种感觉:时代一直在发展,人家一直在发明创造新的方法,而我们一直在学习新的方法,那过去对旧方法的学习的那段时间是不是就浪费了,反正以后也不用了,这样就会有自己跟不上时代的感觉?也许更重要的是学习每个方法背后的思想吧,就像是MapReduce这种思想,Spark利用RDD建立那种生态结构的思想...有时也要观其大略,不求甚解(也求甚解......)。

PS: 第一次接触Hadoop和Reduce,写的有偏差的地方请指教!!

下一篇描述:Spark在databricks上的具体 *** 作

参考资源:Spark: 基本架构及原理,RDD(分布式内存的一个抽象概念)_百度百科,Apache Spark_百度百科,以及老师的ppt......

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5708958.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存