第1章 spark 简介
spark相比于hadoop,spark是计算框架,hadoop包含计算框架mapreduce,分布式文件系统hdfs,还包括Hbase,Hive
spark优势:中间结果输出(spark将执行模型抽象成DAG,将多stage任务串联或者并行执行,无须将stage中间结果输出到HDFS中,类似引擎包括Dryad,Tez),数据格式和内存布局(RDD),执行策略,任务调度的开销(采用时间驱动来启动任务,通过线程池复用)
1.1 生态系统
Spark:大数据分布式编程框架,不仅实现了mapreduce的算子map和reduce及计算模型,还提供更丰富的算子,filter,join,groupByKey等。并将分布式数据抽象为弹性分布式数据集(rdd),实现了应用任务调度,RPC,序列化和压缩,并为运行在其上的上层组件提供API。将数据在分布式环境下分区,将作业转化为DAG,并分阶段进行DAG的调度和任务的分布式并行处理
Shark:在Spark和Hive基础之上的数据仓库。
Spark SQL
spark streaming:指定时间片累积为RDD,然后将每个RDD进行批处理,进而实现大规模的流数据处理。
GraphX:基于BSP模型,在spark上封装pregel的接口,进行大规模同步全局的图计算
Tachyon:分布式内存文件系统,可以理解为内存中HDFS。
Mesos,BlinkDB
1.2 spark架构
dirver程序是应用逻辑执行的起点,负责作业的调度,即task任务的分发,而多个worker用来管理计算节点和创建executor并行处理任务。在执行阶段,driver会将task和task所依赖的file和jar序列化后传递给对应的worker机器,同时executor对相应的数据分区的任务进行处理
spark整体流程:client提交应用,master找到worker启动driver,driver向master或者资源管理器申请,之后将应用转化为RDD Graph,再由DAGSheduler将RDD Graph转化为stage的提交给taskScheduler,再由taskScheduler提交任务给executor执行。
第2章 spark集群的安装与部署
在win上运行spark,需要先安装cygwin来模拟linux环境,才能安装spark;另外由于spark主要使用hdfs当持久层,需要完整安装hadoop。
预先安装JDK,scala的依赖,hadoop
2.1 linux上安装
1.安装jdk配置JAVA_HOME
2.安装hadoop
下载解压,配置环境变量,hadoop-env.sh, core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml
启动hadoop:hadoop namenode -format sbin下bash start-dfs.sh
http://x.x.x.x:50070
3.安装spark
下载解压,然后配置各种文件,最终start-all.sh
http://x.x.x.x:8098/
第3章 spark计算模型
3.1 spark程序模型
RDD在代码中相当于数据的一个元数据结构,存储着分区及其逻辑结构的映射关系
3.2 弹性分布式数据集
RDD与分布式共享内存的异同
两种创建方式:1从hdfs等直接输入创建2从父RDD转换得到新的RDD
两种操作算子:Transformation和action
RDD内部的重要属性:分区列表,计算每个分片的函数,父RDD的依赖列表,对kv的RDD的分区器,控制分区策略和分区数,每个数据分区的地址列表
spark数据存储:抽象理解为一个大数组array,但是这个数组是分布在集群上的。逻辑上每个RDD分区叫一个partition
3.3 spark算子分类和功能
value型的transformation算子:输入和输出一对一(map,flatmap,mappartition,glom),多对一(union,cartesian),多对多(groupby),输出为输入子集(filter,distinct,subtract,sample,takesample),Cache型(cache,persist)
kv型transformation算子:一对一(mapValues),聚集(单个RDD【combineByKey, reduceByKey,partitionby】两个RDD【cogroup,】),连接(join,leftoutjoin,rightoutjoin)
actions算子:无输出(foreach),Hdfs(saveastextfile, saveasobjectfile,),scala集合(collect, collectasmap, reducebykeylocally, lookup, count, top, reduce, fold, aggregate, )和数据类型(broadcast, accumulator)
第4章 spark工作机制详解
4.1 spark应用执行机制
执行机制总览
应用提交与执行方式
4.2 spark调度与任务分配模块
spark应用程序之间的调度
spark应用程序内job的调度
stage和tasksetmanager调度方式
task调度
4.3 spark I/O机制
通过序列化将链式分布的数据转化为连续分布的数据,这样可以进行分布式的进程间通信
压缩,能够减少数据的内存使用,以及IO和网络数据传输开销
spark块管理:RDD在逻辑上是按照partition来分块的,是数据项的分布式数组。物理存储的RDD以block为单位的。一个partition对应一个block
4.4 spark通信模块
通信框架AKKA
client,master和worker间的通信
4.5 容错机制
lineage机制:相比其他系统的细颗粒度的内存数据更新级别的备份或者LOG机制,RDD的Lineage记录的是粗颗粒度的特定数据Transformation操作(如filter、map、join等)行为
窄依赖如果出现节点宕机重算,没有冗余计算;宽依赖就会出现冗余,这种情况用checkpoint机制
checkpoint机制:将RDD写入disk做检查点
4.6 suffle机制
spark的shuffle分为两种实现,分别为HashShuffle和SortShuffle,
HashShuffle又分为普通机制和合并机制,普通机制因为其会产生MR个数的巨量磁盘小文件而产生大量性能低下的Io操作,从而性能较低,因为其巨量的磁盘小文件还可能导致OOM,HashShuffle的合并机制通过重复利用buffer从而将磁盘小文件的数量降低到CoreR个,但是当Reducer 端的并行任务或者是数据分片过多的时候,依然会产生大量的磁盘小文件。
SortShuffle也分为普通机制和bypass机制,普通机制在内存数据结构(默认为5M)完成排序,会产生2M个磁盘小文件。而当shuffle map task数量小于spark.shuffle.sort.bypassMergeThreshold参数的值。或者算子不是聚合类的shuffle算子(比如reduceByKey)的时候会触发SortShuffle的bypass机制,SortShuffle的bypass机制不会进行排序,极大的提高了其性能
SortShuffleManager相较于HashShuffleManager来说,有了一定的改进。主要就在于,每个Task在进行shuffle操作时,虽然也会产生较多的临时磁盘文件,但是最后会将所有的临时文件合并(merge)成一个磁盘文件,因此每个Task就只有一个磁盘文件。在下一个stage的shuffle read task拉取自己的数据时,只要根据索引读取每个磁盘文件中的部分数据即可
第5章 spark开发环境配置及流程
5.1 spark应用开发环境配置
spark shell开发
5.2 远程调试spark程序
5.3 spark编译
5.4 配置spark源码阅读环境
第6章 spark实战
第7章 benchmark详解
benchmark是一种评价方式,测试负载的执行时间,传输速度,吞吐量,资源占用率等
bigbench
第8章 BDAS简介
8.1 SQL on spark
spark sql架构
8.2 Spark Streaming
架构
原理剖析
调优
8.3 GraphX
架构
8.4 MLlib
MLlib的数据存储
数据转换为向量(向量空间模型VSM)
MLlib中聚类和分类
第9章 spark性能调优
配置参数
如何观察,通过webui,driver程序控制台日志,logs文件夹下日志,work文件夹下日志,profiler工具
调优技巧:调度与分区优化(小分区合并【通过coalesce来减少分区,repartition也可以本质也是调用coalesce,可能是扩大】,倾斜【数据倾斜,任务倾斜,将spark.speculation=true中把执行时间长的节点去掉】
解决:增大任务数,减少每个分区的数据量;特殊key处理,空值映射为特殊key,然后分发到不同节点,对空值不做处理;广播(数据量大还可以切分为小表,map side join),聚集,拆分RDD),并行度(parallelism配置suffule过程的默认任务数量),DAG调度执行优化(减少shuffle发生,使用cache和persisit将数据缓存在内存)
内存存储优化:调整数据结构,减少对象嵌套,序列化存储RDD,临时目录空间的优化(中间结果会临时写入)
网络传输优化:
序列化与压缩:
其他:批量写