Spark运行原理和RDD解密

来源:互联网 发布:英语单词阅读软件 编辑:程序博客网 时间:2024/06/05 11:52

1.实战解析Spark运行原理
交互式查询(shell,sql)
批处理(机器学习,图计算)
首先,spark是基于内存的分布式高效计算框架,采用一栈式管理机制,同时支持流处理,实时交互式出,批处理三种方式,Spark特别支持迭代式计算,因此,他对机器学习,图计算具有较强的支持,为此他提供了机器学习和图计算接口。
(1)分布式:Distributed Computation
分布式多台机器运行 特征:
整个Spark有个提交程序的客户端,提交给集群,集群中中有很多台机器,作业运行在分布式节点上的,Spark程序提交到集群运行,节点一般处理一部分数据,分布式作并行化,
这里写图片描述
客户端->集群节点
图书馆管理员查找图书,馆长Cluster manager,1000个人,分布式计算,每个书架总数多少,分布式用到并行计算

先有集群资源管理服务(Cluster Manager)和运行作业任务的结点(Worker Node),然后就是每个应用的任务控制结点Driver和每个机器节点上有具体任务的执行进程(Executor);Executor有二个优点:一个是多线程来执行具体的任务,而不是像MR那样采用进程模型,减少了任务的启动开稍。二个是Executor上会有一个BlockManager存储模块,类似于KV系统(内存和磁盘共同作为存储设备),当需要迭代多轮时,可以将中间过程的数据先放到这个存储系统上,下次需要时直接读该存储上数据,而不需要读写到hdfs等相关的文件系统里,或者在交互式查询场景下,事先将表Cache到该存储系统上,提高读写IO性能。另外Spark在做Shuffle时,在Groupby,Join等场景下去掉了不必要的Sort操作,相比于MapReduce只有Map和Reduce二种模式,Spark还提供了更加丰富全面的运算操作如filter,groupby,join等。
(2)基于内存
Spark能有效利用内存
300万条数据,1,2,3机器分别算100万条数据,数据首先考虑Memory,若只能放50万条,另外50万条磁盘,尽量放内存(速度很快)

(3) 擅长迭代式计算,是Spark的真正精髓
第一个阶段计算-》第二个阶段计算-》第三个阶段计算
计算之后可以把结果移到另一台机器——shuffle,从一个节点移到另一个节点。
Hadoop Map+Reduce两阶段(每次都要读写磁盘)
Spark可以在第一个阶段后还有很多阶段(迭代式)更加灵活(每次计算结果优先考虑放内存,下个阶段可以读内存中数据)
Spark调度器DAG Schedule Lineage

为什么还是很多公司使用Java语言开发Spark?
1. 人才问题
2. 整合更加容易,J2EE做前端程序的很多
3. 维护更加容易

这里写图片描述

Spark SQL只能取代Hive的计算引擎,不能取代Hive的数据存储
在driver上驱动程序执行,执行在worker上
处理数据来源:HDFS、HBase、Hive、DB、S3(Amazon S3,全名为亚马逊简易储存服务(Amazon Simple Storage Service),由亚马逊公司,利用他们的亚马逊网络服务系统所提供的网络线上储存服务)
处理数据输出:HDFS、HBase、Hive、DB、S3,或返回driver(也就是程序本身)

2.RDD解密
通用的分布式弹性数据集
RDD是Spark的核心
RDD代表要处理的数据,处理的时候是分布式的
(1)一系列分片,在节点中存储,内存中,内存中放不下数据,将一部分数据放在磁盘上,自动在内存和磁盘中切换(弹性之一)
(2)第900个出错,一共1000个任务,可以从第900个重新计算,无需从头开始进行计算,提高错误恢复速度
(3)Task1000个计算步骤,第900个进行恢复,失败3-5次,默认4次
(4)Task失败,整个阶段失败,再次提交Stage,1000000-5个不会提交,只提交失败的5个Task(默认3次)
弹性之一:自动的进行内存和磁盘数据存储的切换
弹性之二:基于Lineage的高校容错
弹性之三:Task如果失败会自动进行特定次数的重试
弹性之四:Stage如果失败会自动进行特定次数的重试
这里写图片描述

缓存时机:
1.计算任务特别耗时
2.计算链条很长(计算代价)1000个,第900个恢复
3.Shuffle之后,进行缓存,失败之后,不需要进行重新Shuffle(从其他地方抽取数据)
4.CheckPoint把数据整个放入磁盘,CheckPoint之前步骤无需重新计算

RDD是一系列数据分片,数据分片分布在不同机器的不同节点上,按partition进行管理,partition就是一个数据集合 RDD包含函数的计算
最常用的RDD在Hadoop上
启动文件系统
这里写图片描述
启动Spark
这里写图片描述
这里写图片描述
这里写图片描述
集群唯一的接口:SparkContext ,SparkContext是一切工作都要经过的地方,SparkContext创建RDD

这里写图片描述
这里写图片描述
自动获取,是本地还是集群

spark一切操作皆RDD,每次操作都会产生RDD
这里写图片描述
data.textFile
是lazy的,transformation,不运行
这里写图片描述
data.count
是action,所以会运行

hdfs分片和spark rdd的分区有什么关系?
spark读取数据时,RDD相当于HDFS的一个Block,Partion size=Block Size(128M)最后一条记录跨两个Block,128M左右

分区,可以进行hash,Range等等,不同分区策略

这里写图片描述

这里写图片描述

这里写图片描述
Reduce后进行shuffle
这里写图片描述
传入HDFS
这里写图片描述

这里写图片描述

Any shuffle后的数据
Process _LOCAL
这里写图片描述

Cloudera Manager 中Spark不是最新版本的,而且不能手动更新,(开发商提供,不推荐),不推荐使用(懒人)
Spark+Tachyon+HDFS,将来是黄金组合

0 0
原创粉丝点击