spark工作机制
来源:互联网 发布:知乎live怎么免费听 编辑:程序博客网 时间:2024/05/21 17:50
spark
这里以wordcount程序为例,演示spark的基本流程和原理
基本概念
- RDD:弹性分布式数据集。数据存放在各个节点上。spark对RDD进行操作。
- 算子:各种操作/行动。spark中的函数
- 创建
- 变换
- 缓存
- 行动
spark架构分析
- application:用户编写的spakr程序,包含驱动程序和要运行的代码
- driver驱动程序:main创建sparkcontent,程序结束后负责关闭sparkcontent。
- sparkcontent:与clustermanager通信
- clustermaster:集群资源管理器。
- 是这个spark集群的核心。不负责具体的执行,只负责管理整个集群的计算机资源。(内存,cpu等)。每个计算节点都要向clustermaster注册自己的资源情况。
- yarn,mesos等。
- master节点:主节点,负责管理分配集群资源
- slave节点:执行作业的逻辑节点。根据功能不同分成两类,任务调度节点和任务执行节点
- Driver节点:整理程序逻辑的七点,创建sparkcontext,定义一个或多个RDD。
- 将一个程序分割成物理上可执行的task。
- 将task分到最合适的task节点上运行
- worker节点
- 运行executor进程。
- 实际计算task任务
- 为RDD提供内存
spark可运行在单机上,也可以运行在集群上。这使得spark可以运行多种模式。
- 本地模式
- 单机模式
- 伪分布式模式
- yarn模式
- mesos模式
- Driver节点:整理程序逻辑的七点,创建sparkcontext,定义一个或多个RDD。
一个spark程序的执行
spark相比mr更简介,容易理解。scala最大的特点是每次操作都是一次方法调用。先用map将所有的单词以空格为分隔符分成单词,在用flatMap将所有的单词都转化成kv模式,最后用reduce统计value的次数。
val file = sc.textFile("文本路径")val result = file.flatMap(s => (x.split(" ")).map(x => (x,1)).reduceByValue(_+_)result.saveAsTxtFile("文本路径")
(1) 创建RDD。用textFile()是一个创建RDD的算子。从指定的HDFS文件中读取指定的数据。这里还可以指定分片的个数。
(2) spark中的分区是一个逻辑概念,真正存储的是数据块。一个分区对应一个物理上的数据块,一个partion对应一个block。
(3) flatMap对RDD算子进行一对一的变换,这个stage是窄依赖的,生成的partion仍然是跟原来partion的个数一样。
(4) reduceByKey操作是宽依赖。执行一个shuffle操作。这里将partion个数处理成spark中默认的个数。partion的个数可能变化。reduceByValue是真正触发操作的行动,其他的都是惰性求值。
(5) 最后将执行结果保存到指定路径中。
结合wordcount和spark架构
spark的初始化可以通过sparkshell和sparksubmit进行。
初始化之后:
(1) 编写一个主函数,里面包含RDD的创建,转换等操作。 用户将完整的spark程序提交到集群上,申请并执行。集群收到请求后,启动Driver节点,相应主函数。
(2) 当Driver启动后,发现RDD需要一系列的转换操作,这时候会与master节点通信,通过mastrer节点申请程序所需的资源。
(3) soark上的worker节点都向master注册了自己的计算资源,当mastre收到driver的通信后,会通过心跳机制检测各个worker节点是否能正常工作,然后通过已经注册的worker节点启动executor进程
(4) master通知dirver节点哪些worker节点正常启动运行了,让driver节点使用这些worker节点运行程序
(5) driver对RDD进行分割。然后分发给worker节点操作,并随时监控执行情况。具体的driver对RDD的操作见后
(6) worker节点上的executor进程是真正的任务执行者。一个worker上可以有多个executor进程。每个executor运行在一个jvm中。
(7) driver通知client完成任务。
spark中driver节点对RDD的操作
- 构建RDD的DAG(有向无环图)
- DAG的拆分(把job拆分成stage。一个job对应一个action)
- 利用宽窄依赖,区分各个不同的stage。当提交RDD
- DAGscheduler会遍历RDD有向无环图,碰到相同的依赖就放到同一个阶段。每个stage内都是一组相互关联但彼此之间没有关系的任务集合。(taskset)
- DAGscheduler调度:最高层次的调度调度的对象是stage
- 为每个job绘出DAG,绘出DAG并查找最短路径。(非递归层次遍历)
- 把每个job分割成不同的阶段stage。并生成了stage的有序执行序列。stage内是taskset
- 把task交给taskscheduler。
- waitingstages 父stage未执行完的stage
- runningstages 正在运行的stage
- faildstages 执行失败的stage
- Taskscheduler调度:对象是task
- 为收到的不同taskset创建一个tasksetmanager,tasksetmanager实际负责taskset中task的调度。
- tasksetmanager通过taskset与底层物理节点通信
- fifo和fair调度模式
- task的执行
- 由taskscheduler选择合适的节点,分配给worker节点,然后在节点上启动executor进程。
- 一个executor对应一个jvm进程中。
- spakr可以灵活设计DAG调度,还能结合其他系统资源调度。
spark作业执行流程
- 流程:
DAGschedler–>taskset(多个task组成)–>taskschuduler–>taskmanager–>workor(多个jvm组成)–>executor–>执行 - spark 作业提交,并向master申请资源(多个作业的时候采用fifo或fair模式)
- master收到申请,分配资源
- 对spark的RDD做转换操作,构建DAG图
- DAG中把job拆分成stage,判断finalstage是否存在shuffle操作。
- 作业真正的提交是在碰到action操作的时候(与依赖无关)
- Spark工作机制
- Spark的工作机制
- spark工作机制见解
- spark工作机制
- spark 工作机制
- Spark工作机制
- spark架构及其工作机制
- Spark(四) -- Spark工作机制
- Spark征程——Spark工作机制
- 【Spark系列】三、Spark工作机制
- 【Spark工作机制详解】 执行机制
- 【Spark工作机制详解】 I/O 机制
- 【Spark工作机制详解】容错机制
- 【Spark工作机制详解】 Shuffle机制
- 【Spark工作机制详解】通信模块
- Spark-core 架构及工作机制综述
- spark的工作机制详细介绍、spark源码编译、spark编程实战
- 【Spark工作机制详解】调度与任务分配
- 输入父集,求出所有子集.
- 使用蚁群算法(ACO)、遗传算法(GA)、霍普菲尔德网络(Hopfield)解决旅行商问题(TSP)
- 探索并发编程(五)------Java多线程开发技巧
- 【工具】Source Insight中文注释间隔过大的解决办法
- 并查集模板
- spark工作机制
- jenkins windows下挪动工作目录
- IDEA开发时,控制台输出中文乱码解决方法
- 关于Dword、LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR
- Linux/MacOS下matplotlib能正常显示的中文字体选择
- bzoj 1070【scoi2007】修车(网络流)
- PHP 对象转为字符串,及中为乱码
- 数据挖掘-目录-分类器(classification)
- oibh2006 容易的网络游戏(离散)