Spark学习方法
(1)SparkSQL电子书:http://marsishandsome.github.io/SparkSQL-Internal/ (来源:https://www.zhihu.com/question/31427697)
(2)B站入门视频:https://www.bilibili.com/video/BV1tp4y1B7qd
Spark Streaming + Canal + Kafka打造Mysql增量数据实时进行监测分析(https://mp.weixin.qq.com/s?__biz=MzU3MzgwNTU2Mg==&mid=2247500830&idx=1&sn=1b2c27ecb5db12bf9d07747c2fe95716&chksm=fd3e828bca490b9db33d198554a5d918e2e2c8ee1a72365828b5e374d98b065a72ae0992439c&scene=21#wechat_redirect)
(3)面试问题:https://www.zhihu.com/question/31427697
1、语言:scala
写Spark最好用scala,先学习scala语言(在这之前最好学一些java)。scala这个语言有好几个编程范式,你至少要把面向对象,面向过程和scala函数式编程弄明白。其中函数式编程最难(如果你不会java的话面向对象编程也比较难,反正scala是公认的比较难就对了)。
2、平台:IDEA
3、课程:厦门大学林子雨
4、工具优点:适合企业做开发。百万级用numpy和pandas做的活放大到了百亿左右这个level
5、产品:
本身从产品的角度讲,spark这个东西它设计出来就是为了把所有的大数据分析任务“一站式解决。”比如SparkSQL就是起源于hive的模拟(不过现在的版本已经跟hive没啥关系了)。当然你要做大规模实施推荐这种业务。spark是不够的,这个时候换成flink或者storm就行了。原理基本差不多。
6、背景:
1、设计思想
2、运用的抽象
3、RDD提出原理
7、核心论文:
第一篇:《弹性分布式数据集:一种为内存化集群计算设计的容错抽象》
提出了弹性分布式数据集(RDD,Resilient Distributed Datasets)这个概念。提出了弹性分布式数据集(RDD,Resilient Distributed Datasets)这个概念。(提出了弹性分布式数据集(RDD,Resilient Distributed Datasets)这个概念)
第二篇:《大型集群上的快速和通用数据处理架构》170pages
Spark框架设计者——计算机可续而博士Matei Alexandru Zaharia和加州大学伯克利分校教授、主席Scott Shenker撰写的。作者主要分析当前流行的计算框架使用场景及对应缺点,然后浅谈Spark框架编写原因及模块详细设计理念、运行原理。
1、数据量暴增,需要从单机处理向集群处理扩展。随之出现3各集群维度问题:
(1)并行化。多个节点并行处理数据。
(2)容错。多节点并行,结点故障出错处理。
(3)资源动态分配。多用户间切换集群,需要资源动态扩展和缩减。
2、Spark RDD优于MR的计算引擎——数据流模型在计算中高效共享数据。解决MR频繁对磁盘和内存间进行的IO操作而设计的一种并行计算阶段高效共享数据的方案,节省从磁盘到内存频繁加载数据的过程。同时Spark Shuffle直接操作内存,进行checkpoint保证shuffle失败map数据不会丢失。RDD特征:可容错、并行数据结构。使得用户指定数据存储到磁盘还是内存、控制数据的分区方法,并在数据集上进行比MR更丰富的操作。
3、容错。
一般的容错方案:对于数据密集型任务代价高,因为需要在带宽远低于内存的集群网络间拷贝大量的数据,同时存储开销大。
(1)主机间复制数据。恢复时间短,但消耗内存和磁盘控件存储数据。
(2)主机的更新做日志。恢复时间长,不需要额外的内存。
RDD容错方案:提供基于粗粒度变换接口(如:map,filter,join)将相同操作应用到多个数据集上,通过记录创建数据集变换(lineage),无需存储真实数据,达到高效容错。(注:当一个RDD某个分区丢失时,RDD记录有足够的信息记录其如何通过其他RDD进行计算,只需重新计算该分区。丢失数据很快恢复,无需昂贵复制代价。)
4、RDD用户可控的持久化和分区。(RDD——分区只读记录集合)
自由的为某个RDD制定存储策略;
位置优化,让RDD中数据根据key分布到集群多个机器——控制2个join数据使用相同hashpartition方式。
默认状态:内存记录调用Persist的RDD。内存不足则写入硬盘。用户可制定persist参数请求其他持久化策略、用户可在RDD设置持久化优先级设定那些数据优先写入磁盘。
RDD优点:(1)lineage恢复数据,无需checkpoint开销。仅丢失部分重新计算,可多节点并发执行,无需回滚整个程序。(2)任务执行可按照数据位置优化,减少缓慢结点执行优先级。超出内存分区可存储于磁盘,性能下降稳定,且与其他并行系统相当。(3)适合批处理操作。不适合异步细粒度更新共享状态应用——如:WEB应用或增量网络爬虫的存储系统。
5、宽窄依赖。
(1)窄依赖:
允许在单个集群结点上流水线式执行,此结点可计算所有父级分区。
窄依赖,失败结点恢复高效。仅丢失的父级分区重新计算,且可并行在不同结点计算。
(2)宽依赖:
需要所有父RDD可用且shuffle完成。
继承关系使单个失败结点导致一个RDD所有祖先中的一些分区丢失,导致计算重新执行。
6、Spark调度器。
保证被持久化的RDD所在分区保存在内存中调用。当用户对一个RDD执行Action(count\save)时,调度器根据RDD所在的Lineage构建一个由若干stage组成的DAG以执行程序。每个stage都包含尽可能多的连续窄依赖型转换。各个阶段间的分界线则时宽窄依赖所需的shuffle操作,或时DAG中一个经由该分区能快速到达父RDD的已计算分区。
其后,调度器运行多task计算各个stage缺失分区,知道得到目标RDD。调度器向各机器的task分配采用延时调度机制并根据数据存储位置(本地性)来确定。若一个task需处理某分区,该分区刚好存储在某节点内存,则task被分配给该结点。否则,若一个task处理的某分区,该分区含有RDD提供的较佳位置(如,一个HDFS文件),我们把该task分配到这些位置。
对应宽依赖类的操作(如,shuffle依赖),会将中间记录物理化到保存夫分区的结点上。这和MapReduce物化Map输出类似,能简化数据的故障恢复过程,对执行失败的任务,只要它对应stage的父类信息仍可用,它便会在其他节点重新执行。如果某些stage不可用(如,因shuffle在map阶段某个输出丢失了),则重新提交的相应的任务以并行计算丢失的分区。(DAGscheduler官方定义)若某个任务执行缓慢(即,落后者straggler),系统则在其他结点上执行该任务拷贝。与MapReduce类似,并取最先得到的结果作为最终结果。
7、Spark内存管理。
三种持久化RDD的存储策略:(1)为序列化Java对象存储于内存中(2)序列化后的数据存储于内存(3)磁盘存储。选项一的性能最优,因为可直接访问JAVA虚拟机内存里的RDD对象。在空间优先的情形下,选项二可以让用户采用比JAVA对象图更有效的内存组织方式,代价是降低性能。选项三适用于RDD太大难以存储在内存的情形,但每次计算该RDD会带来额外的资源开销。
对于有限内存。使用RDD为对象的LRU(最近最少使用)回收算法进行管理。当计算得到一个新的RDD分区,但没有足够空间存储时,系统会从最近最少使用的RDD中回收一个分区的空间。
若RDD是新分区对应的RDD。Spark会将旧的分区继续保留在内存,防止同一个RDD的分区被循环调入调出。(注:这一点是关键重点。大部分的操作会在一个RDD的所有分区上进行,那么很有可能已经存在内存中的分区会被再次使用。目前,这种默认策略在所有应用中都运行的很好,此外还有“持久化优先级“选项控制RDD的存储。)
8、模块&学习
(1)Spark SQL、Spark Streaming、MLlib(machine learning)、GraphX(graph)
(2)Apache Spark
(3)虚拟机基础:定制虚拟机,在虚拟机上安装Centos7os
(4)Linux基础:实现Host和Guest的网络连接、完成基本文件操作、能使用Vim编辑文件。
(5)Spark编程:编写、编译、打包、调试、运行Scala程序;能使用Scala编写简单的串行处理程序;能看懂简单的SparkScalaAPI接口。
(6)Spark基础:叙述Spark运行时架构;提交Spark程序分布式运行;能解释Spark相关概念:RDD、Application、Job、DAG、Stage、Task;能说Spark程序运行过程和代码执行过程。
(7)Spark核心编程:使用IDEA编写、编译、打包、调式、运行Spark程序;使用RDD】DataFrame/Dataset的基础API编写Spark程序。