Spark
回顾hadoop
apache Hadoop软件库是一个允许使用简单的编程模型夸计算机集群处理大型数据集合的框架,设计初衷是将单个服务器扩展成上千个计算机组成一个集群为大数据提供计算服务,每个计算机都提供了本地计算和储存服务
hadoop中的优缺点
高可靠性:Hadoop按位存储和处理数据的能力,值得人们的信赖
高扩展型:Hadoop是在可用的计算机集簇间分配数据并完成计算任务,这些集簇可以方便地扩展到数以千计的节点中.
高效性:Hadoop能够存在节点间动态的移动数据,并保证各个节点的动态平衡,因此处理速度非常快.
高容错性:Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配
缺点不适合低延迟数据访问
无法高效存储大量小文件
不支持多用户写入及任意修改文件
hadoop2.x中提供了Yarn资源调度系统,专门进行资源你的调度使用
hadoop的模块
hadoop的三大核心组件是hdfs mapreduce,yarn
hadoop2的一个公共模块和三大核心组成了四个模块,
1.hadoopcommon :为其他的hadoop模块提供基础设施
2.hdfs: 高可靠性,高吞吐量的分布式文件系统,
3.mapreduce:基于yarn系统,分布式离线并行计算框架
4.yarn:负责作业调度与资源管理的框架
spark
spark是一种快速,通用,可扩展,大数据分析引擎,
spark官网将spark定义为大型可扩展数据的快速和通用处理引擎
采用的dag执行引擎支持循环数据列和内存计算,内存速度是hadoop MR的百倍,磁盘速度是Hadoop Mr的十倍(官网数据)
spark是一个通用处理引擎用来做批处理迭代计算,交互式查询,流处理,机器学习
mr迭代
spark迭代
1.spark把运算的中间数据存放在内存,迭代计算效率更高;
mapreduce的中间结果需要落地,需要保存到磁盘,这样必然有磁盘io操作影响性能
2.spark容错性高,他通过弹性分布式,数据集RDD来实现高效容错,RDD是一组分布式的存储在节点内存中的只读数性质的数据集,这些集合是弹性的,某一部分丢失或者出错,可以通过整个数据集的计算流程的血缘关系来实现重建,mapreduce只能重新计算成本比较高
3.spark更加通用,spark提供了transformation和action这两个大类的多个功能api,另外还有流式处理sparkstreaming模块,图计算GraphX等等,mapreduce只提供了map和reduce两种操作,流计算以及其他的模块的支持比较缺乏
4.spark框架和生态更加复杂,首先有RDD,血缘lineage,执行时的有向无环图DAG,stage划分等等,很多时候spark作业都需要根据不同的业务场景的需要进行调优以达到型能要求,mapreduce框架及生态相对较为简单,对性能的要求也相对较弱,但是运行较为稳定,适合长期后台运行
spark core
实现了spark的基本功能,包括任务调度,内存管理,错误恢复,存储系统,交互等模块.spark core还包含了对弹性分布式数据集(resilient distributed dataset 简称RDD)api定义
spark Sql
是用来操作结果化数据的程序包,通过spark sql,我们可以使用sql或者apache hive版的sql方言(HQL)来查询数据,spark sql支持多种数据源,比如hive表,parquet以及json等
spark Steaming
是spark 提供的对实时数据进行流式计算流式的组件,提供用来操作数据流的api,并且与spark core中的RDD api 高度对应
spark MLlib
提供常见的机器学习(ML)功能的程序库,包括分类,回归,聚类,协同过滤等,还提供了模型评估,数据导入等额外的支持功能
spark GraphX
GraphX在spark基础山提供了一站式的数据解决方案,可以高效的完成图计算的完整流水作业grapthx是用于图计算和并行图计算的新的(alpha)sparkAPI,通过引入弹性分布式属性图(Resilient Distributed Property Graph),一种顶点和边都带有属性的有向多重图,扩展了Spark RDD
spark的
快
与hadoop的mr比要内存快100倍,基于硬盘的10倍,实现了高效的dag执行引擎,可以通过基于内存来高效处理数据流
易用
spark支持java,python和scala的api,支持超过80种高级算法,使用户可以快速的构建不同的应用,而且spark支持交互式的python和scala的shell可以非常方便的在这些shell中使用spark几区拿来验证解决问题的方法,
通用
spark提供了统一的解决方案,spark可以用于批处理,交互式,查询(Spark SQL),实时流处理(sparkStreaming),机器学习(spark MLlib)和图计算(GraphX),这些不同的类型的处理都可以在同一个应用中无缝使用,spark统一的解决问题非常具有吸引力,用统一的平台处理问题可以减少开发和维护的人力成本,和部署平台的物力成本
兼容性
spark可以非常方便的与其他的开源产品进行融合,比如,spark可以使用hadoop的yarn和apachemesos作为他的资源管理和调度器,并且可以处理所有的hadoop支持的数据,包括hdfs,hbase,cassandra等,这对于已经部署hadoop集群的用户,可以不用做任何的数据迁移,就可以使用spark的强大处理能力,spark也可以不依赖第三方资源管理和调度器,它实现了standalone作为其内置的资源管理和调度框架,,这样进一步降低了spark的使用门槛,所有人都可以非常容易的部署和使用spark
yarn-client
在yarn-client中,driver运行在client运行在client上,通过ApplicationMaster向RM获取资源,本地driver负责与所有的executorcontainer进行交互,并将最后结果的汇总,结束掉终端,相当于kill掉这个spark应用
因为driver在客户端,所以可以通过webUI访问Driver状态,默认是Http://leetom:4040访问,yarn通过http://leetom:8088访问
spark yarn client向yarn的resourcemanager申请启动application master,同时在sparkContent初始化中将创建dagscheduler和taskscheduler等,由于我们选择的是yarn-client模式,程序会选择yarnclientclusterscheduler和YarnClientSchedulerBackend
Resourcemanager收到请求后,在集群中选择一个nodemanager,为该应用的applicationMaster与Yarn-Cluster区别的是在该ApplicationMaster不运行SparkContent,只与SparkContent进行联系进行资源分配
client中的SparkContent初始化完成后完毕后,与ApplicationMaster建立通讯,向ResourceManager注册,根据任务信息,向Resourcemanager申请资源(Container)
一旦Application申请到资源(也就是Container)后,便于对应的Nodemananger通信,要求他在获得Container中启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动回想Client中的SparkContent注册申请Task
client中的sparkContent分配task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行task并向driver汇报运行的状态和进度,以让Client随时掌握各个任务的运行状态,从而可以在任务事变时重新启动任务
应用程序运行完成后,Client的SparkContent向Resourcemanager申请注销并关闭自己
因为是Client端通信,所以Client不能关闭,
客户端的Driver将应用提交给Yarn后,Yarn会先后启动ApplicationMaster和executor,另外ApplicationMaster和executor都装载在container里运行,container默认内存是1G
ApplicationMaster分配的是内存driver-memory,executor分配的内存是executor-memory,应为Driver在客户端,所以进程的 运行结果可以在客户端显示,Driver以进程名为sparkSubmit形式存在
Yarn-Cluster
在yarn-cluster模式中,当用户向Yarn中提交一个应用程序后,yarn将分两个阶段运行该应用程序:
1.第一个阶段是把spark和driver作为一个ApplicationMaster在Yarn集群中先启动,
第二个阶段是由ApplicationMaster创建应用程序,然后为他向Resourcemanager申请资源,并启动executor来运行task,同时监控他的整个运行过程,直到运行完成,
应用的结果不能在客户端显示,(可以在history server中查看),所以最好的节骨哦保存在hdfs而非stdout输出,客户端的终端显示的是作为yarn的job的简单运行状况,
执行过程
spark yarn client向Yarn中提交运行程序,包括ApplicationMaster程序,启动ApplicationMater的命令,需要在Executor中的运行过程
ResoruceManager收到请求后,在集群中选择一个NodeManger,为,应用程序分配第一个Container,要求他在这个Container中启动应用程序的ApplicationMaster进行SparkContext等的初始化
ApplicationMaster向Resourcemanager注册,这样用户可以直接通过resourcemanager查看应用程序的运行状态,然后他将采用轮询的方式通过Rpc协议为各个任务申请资源,并监控他们的运行状态知道运行结束
一旦ApplicationMaster申请到资源(也就是Container)后,便于对应的NodeManager通信,要求他在获得Container中启动CoarseGrainedExecutorBackend,而Executor对象的创建及维护是有CoarseGrainedExecutorBackend负责的
CoarseGrainedExecutorBackend启动后会向ApplicationMaster中的sparkContext注册并申请Task,这一点和standalone模式一样,只不过sparkContext在sparkApplication中初始化时,使用CoarseGrainedExecutorBackend配合yarnClusterScheduler进行任务的调度其中YarnClusterSchedulerImpl的一个简单包装增加了对Executor的等待逻辑等
ApplicationMaster中的sparkContext分配task给CoarseGrainedExecutorBackend执行task并向applicationMaster汇报运行的状态和进度,让applicationMaster随时掌握各个任务的运行状态,和进度,可以让ApplicationMaster最是掌握各个任务的运行状态,从而可以在任务失败是重新启动任务
应用程序运行完成后,ApplicatonMaster向Resourcemanager申请注销并关闭自己
yarn-cluster和yarn-client的区别
在yarn中每个Application实例都有一个applicationmaster进程他是aplication启动第一个容器,他负责和resourcemanager进程打交道请求资源,获取资源之后告诉nodemanager为其启动Container,两者之间的区别就是application的区别
yarn-cluster模式driver在AM(applicationmaster)中他负责向yarn申请资源,并家督作业的运行状况,当用户提交作业,之后就可以关闭client作业会继续在client作业会继续在yarn上运行,因而yarncluster模式不适合运行交互式类型的作业
yarn-client模式 applicationmaster仅仅像yarn请求executor,client和请求container通信来调度他们的工作,也就是说client不能离开
1)yarn cluster的driver是在集群中的某一台的nm上但是yarn-client就是在RM的机器上
2)而driver回合executor进行通信,所以yarn-client在提交App之后可以关闭client而yarn-client不可以,
3)yarn-cluster适合生产环境,yarn-client适合交互和调试
yarn cluster | yarn client | spark standalone | |
---|---|---|---|
运行 | applicationmaster | client | client |
返回资源 | applicationmaster | applicationmaster | client |
开始执行进程 | yarn nodemanager | yarn nodemanager | sparkslave |
persistent services | yarn resourcemanager and nodemanagers | yarn resourceManager and node managers | spark masters and workers |
是否支持shell | 不支持 | 支持 | 支持 |
作业提交
spark-submit
standalone模式下,集群启动是包括master和worker,其中master负责接收客户端提交的作业,管理worker
作业流程描述
提交任务的节点启动一个driver(client)进程
driver进程启动后,首先是创建sparkcontext,sparkcontext主要包含 两部分:dagscheduler和teskScheduler
taskscheduler会寻找master节点,master接收到application的注册请求后,通过资源调度算法,在自己集群的worker上启动executor进程,启动executor也会反向注册到taskscheduler上
executor进程内部会维护一个线程池,executor没接收到一个task,都会用taskrunner封装task,然后从线程中取出一个线程去执行taskTaskRunner主要包含两种task:shuffleMapTask和resultTask除了最后一个stage是resultTask外,其他的stage都是shuffleMapTaskExecutor注册到TaskScheduler后,driver进程会对程序进行划分,划分一个或多个action;每个action就是一个job,dagscheduler通过stage划分算法对job进行划分,每个stage建立一个tasksetra,然后dagscheduler将taskset提交给taskScheduler去执行
名词解释
standalone模式下存在的角色
client:客户端进程,提交作业到master
masterstandalone模式中主控节点,负责client提交的作业,管理worker,并命名worker启动driver和executor
worker:standalone模式中slave节点上的守护进程,负责管理本节点的资源,定期向master汇报心跳,接收master的命令,启动driver和executor
driver:一个spark祖业运行时包括一个driver进程,也是作业的主进程,负责作业的解析,生成stage调度task到executor上,包括dagscheduler,taskscheduler
executor:即真正执行作业的地方,一个集群包括多个executor,每个executor接收到driver命令launch task一个executor可以执行一到多个task
作业相关名次解释
stage:一个spark作业包含一到多个stage
task:一个stage包含一到多个task通过多个task实现并运行的功能
dagscheduler:实现spark作业分解成一到多个stage,每个stage根据RDD的Paprtition个数决定task个数,然后生成相应的taskset放到taskscheduler中
taskscheduler:实现task分配到executor
在启动任务的时候并没有指定分配资源,而是有多少资源就使用了多少资源,我们在跑任务的时候是可以指定资源的,可以在指定的核数和内存资源
./spark-submit \ > --class org.apache.spark.examples.sparkPi \ > --master spark://leetom:7077 \ > --executor-memory 512m \ > --total-executor-cores 2 \ > /usr/local/spark/exmaples/jars/spark-examples_2.11-2.2.0.jar 100 --executor -memory设置内存 --total-executor-cores核数
sparkshell
spark-shell启动的两种模式 local和cluster
local模式
spark-shell
local模式仅本机启动一个sparksubmit进程没有与集群建立联系,虽然进程中有sparksubmit但是不会被提交到集群中
cluster模式(集群模式)
spark-shell \ --master spark://leetom:7077 \ --executor-memory 512m \ --total-executor-cores 1 后两个命令不是必须的--master这条命令是必须的(除非在jar包中已经指定,可以不指定,不然就必须指定)
退出shell
一定不要ctrl+c
spark-shell正确退出quit
如果使用了ctrl+c使用功能命令监听端口netstat -apn | grep 4040
再使用kill -9 杀死