前言
之前,一直在考虑,如何延续职业生涯.虽然刚入职,但是危机意识告诉我,不能当咸鱼.拒绝996的同时,也要自我学习,才不至于早早被扫地出门.哪怕考公务员也要学习[手动吃瓜].
受到我们部门leader的启发,我决定深入探讨一个工具,钻研源码,做到"精通"一个工具.
由Spark始吧.
本系列,主要参考了耿嘉安的深入理解Spark核心思想与源码分析.可以理解成我照猫画虎,更新了自己的一版本吧.
就从开头开始吧.
1 Spark设计理念和基本架构
1.1 初始Spark
Spark vs Hadoop
Hadoop是高吞吐,批量处理,离线计算;我部门就是跑批的形式,批量计算
实时计算?No
Spark通过内存计算,比磁盘快十倍以上,
内存直接由CPU控制,也就是CPU内部集成的内存控制器,所以说内存是直接与CPU对接,享受与CPU通信的最优带宽,
然而硬盘则是通过桥接芯片(在主板上)与CPU相连,所以说速度比较慢,SATA接口目前最高速度是6GB接口也就是实际传输速度550MB/s,这也是硬盘的最快速度,
其次就是与CPU直连的m.2口和pcie口,这两种接口都是通过pcie通道与CPU直连,所以说速度都在1.2G/s左右,pcie接口速度随着pcie通道数量的提升而提升,2~4G/s的读写速度都是有的
内存的读写速度随便可以上20GB/s(50GB/s)
当然更快的还有CPU的那几级缓存,比如L1可以到400+GB/s的读取、200+GB/s的写入(3100+GB/s读、1600+GB/s写)。
链接:https://www.zhihu.com/question/33272188
Spark特点:
快速处理
Hadoop是将中间输出和结果存在HDFS中,读写HDFS->磁盘IO,成为速度瓶颈
Spark可以利用内存,将中间输出和结果存在内存中,避免大量磁盘IO
Spark本身的DAG,有向无环图,支持内存计算.
容易使用.支持多种语言编写
支持查询.SQL
流式计算,SparkStreaming
丰富数据库支持.HDFS,Cassandra,HBase,Hive等,都可以接入Spark体系中
1.2 Spark基础知识
Spark的概念
RDD, resillient distributed dataset, 弹性分布式数据集
Task,任务,分为ShuffleMapTask和ResultMap,分别对应于Map和Reduce
Job,提交的作业,一个Job可以由多个Task构成
Stage,Job分成的阶段.一个Job可能由一个多个Stage构成
Partition,分区,RDD的数据可以划分为几个分区
NarrowDependency,窄依赖,子RDD依赖于父RDD中的固定RDD,不涉及shuffle过程(不涉及洗牌)
ShuffleDependency,洗牌依赖,子RDD依赖父RDD的多个未知RDD,涉及洗牌过程
1.3 Spark设计思想
Spark模块
Spark Core = SparkContext初始化, 部署模式, 存储体系, 任务提交和执行, 计算引擎
SparkSQL
SparkStreaming,流式计算,支持Kafka,Flume等
GraphX,图形计算能力
MLib, 机器学习
Spark核心功能 Spark Core
SparkContext, context,顾名思义,环境,上下文.SparkContext = 网络通信+分布式部署+消息通信+存储+计算+缓存+测量系统+文件服务+Web服务
因此sc的初始化极其重要
开发人员只需要利用sc提供的api就可以完成功能开发.
sc内置的DAGScheduler,有向无环图调度器,就可以创建job,将rdd划分到不同stage,提交stage.
taskscheduler,任务调度器,可以申请资源,任务提交,请求集群对任务的调度
存储体系
spark优先利用内存作为存储.减少磁盘IO,提高效率.
提供以内存为中信的高容错的分布式文件系统,Tachyon
计算引擎
DAGScheduler向无环图调度器,RDD,Executor一起,负责Map和Reduce的执行.
DAGScheduler和RDD位于sc内部,但是任务正式提交与执行之前,会将Job中的RDSD组成DAG,然后划分stage,决定任务执行阶段,任务的数量,迭代计算,shuffle等过程
部署模式
Yarn,Mesos,Standalone
Spark扩展功能
SQL
Streaming
GraphX
Spark模型设计
通过sc提供的api编写driver
使用sc提交的用户程序,先用blockmanager和broadcastmanager将任务的hadoop配置进行广播,然后DAGscheduler将任务转化为RDD,
并组织成DAG,DAG还被划分为不同的stage;TaskScheduler借助ActorSystem将任务提交给集群管理器ClusterManager
ClusterManager给任务分配资源,将具体任务分配给worker,worker创建executor来处理任务运行;有不同的集群管理器,standalone,yarn,mesos等
RDD计算模型
ClusterManager:yarn,mesos,standalone;负责worker上面的资源分配给应用程序;不负责对executor的资源分配;也就是将资源分给具体的worknode,工作节点,但是工作节点内部如何划分资源,属于work内政
worker:干活的,工作节点
executor:执行计算任务的一线进程.负责任务执行,worker和driverapp的信息同步
driverapp:客户端驱动程序,将任务转成RDD和DAG,与ClusterManager通信和调度