Spark生态系统:
MLlib:机器学习算法库,对于一些成熟的机器学习算法。可以直接调用其接口并传参,就能自动进行训练并输出结果。
一些基本概念:
RDD:弹性分布式数据集。是分布式内存的一个抽象概念,在计算的过程中可以动态的变化分区数量和数据集大小,是spark核心的数据抽象。
DAG:有向无环图。反应RDD之间的关系。
Ececutor进程:负责执行相关任务。在每个工作节点会运行一个ececutor进程,每个ececutor进程会派生出很多线程,每个线程负责完成一个任务。
任务Task:运行在ececutor上的基本单元/ececutor是由一堆task组成的
作业Job:一个job包含多个RDD即作用于相应RDD上的各种操作
阶段Stage:Job的基本调度单位,一个job分为多组task,每组task称为一个stage/taskSet,代表一组关联的、没有依赖关系的任务集
应用Application:用户编写的spark应用程序
应用通过任务控制节点drive分成了多个作业(job),每个作业包含多个阶段(stage),每个阶段有多个任务(tsak)
基本架构:一主多从架构
当执行应用时:drive向资源管理器申请到资源(启动一个工作节点worker node)后,将应用程序代码文件发送给ececutor进程,ececutor进程会派发出线程执行任务。执行完,将结果(task receiver)发送给driver或写入数据库。
运行基本流程
Sparkcontext:由driver节点创建的指挥官
Sparkcontext根据程序代码中的RDD关系生成DAG图,将DAG图交给DAG Scheduler,使之将DAG图分解成Stage/taskset。
Task Scheduler:负责每个stage里task的分配:ececutor启动后,Worker Node会主动向Task Scheduler申请任务,Task Scheduler负责分发。分发任务的基本原则:计算向数据靠拢---如果数据在机器A上,那么优先让机器A执行该任务,避免额外的数据传输开销。
executor会将结果返回给Task Scheduler,并逐层向上传输,最终交予用户或写入数据库
RDD运行原理:
设计动机:大数据处理经常使用迭代计算,迭代计算需要大量的外存IO和(正反)序列化(将不方便存储的格式,如对象,转化成易于存储的二进制或字符串格式)操作,时间开销大。
于是设计了RDD,一种抽象的数据结构。不论多复杂的业务逻辑,都可以表示成一系列RDD的转化。RDD之间的依赖关系就可以表示成DAG图,进而进行优化处理,实现管道化流水线处理。
一个RDD可以分布式存储在多个机器上,故可以分布式并行计算。
RDD提供了一种高度受限的共享内存模型:
RDD是只读的,不能修改。要修改就只能对RDD进行转换---即生成一个新的RDD
粗粒度操作:一次只能对RDD全集进行转换。例如RDD是60个同学的成绩,要进行加5分操作,就只能所有人加5分。 (粗粒度操作不会使RDD操作受限,因为RDD提供了多种操作,操作组合可以实现细致操作。)
RDD操作类型:转换类型操作,动作类型操作
惰性操作:转换操作只会记录转换的轨迹,而不进行计算。只有遇到动作操作,才会从头执行操作(从 从磁盘读取数据,创建AC开始执行)
管道化/流水线处理:一个操作的输入是另一个的输出。 从而避免IO。
RDD高效的容错性:
低效的容错性:数据备份,日志
高效的容错性: 根据DAG回退,哪一步出错就退到前一步
Spark提供了RDD的API,程序员通过调用API对RDD进行操作
为什么要把一个作业分成多个阶段?
RDD之间的依赖关系:宽依赖(划分多个阶段),窄依赖(不划分)
窄依赖可以流水线优化,宽依赖不能
Shuffle/洗牌操作(依赖关系的判据):
DAG中若出现了一个父亲对多个儿子的情况: 前两个是窄依赖,第三个是宽依赖
Fork/join机制:
每一次RDD之间的转化都对应一个fork(分发并行处理)和一个join(结果汇总)。后者需要磁盘操作。但对于连读多个RDD的转化,其实不需要每次都join。窄依赖可以连续fork,但宽依赖必须join。
DAG图解析:
实例:
阶段内部并行,阶段之间等待
Spark有单机部署模式(local)和集群部署模式
集群部署又包括三种方式:Standalone---spark自带的集群资源管理器;Mesos---性能最高;YARN---应用最广