第一阶段(1-3月):会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战。课程会涵盖Scala编程详解、Spark核心编程、Spark SQL和Spark Streaming、Spark GraphX、SparkR、Machine Learning、Spark内核以及源码剖析、性能调优、企业级案例实战等部分
第二阶段(Spark超大规模大数据案例实战):使用了Spark技术生态栈中的Spark Core、Spark SQL、Spark Streaming、SparkR、Machine Learning,进行离线计算和实时计算业务模块的开发、数据的关联性分析、用户行为模式和特征的训练与应用、用户网络的社区发现、用户影响力、能量传播、标签传播、标签推理、人群划分、年龄段预测、商品交易时序跳转
本课内容:
1 RDD:基于工作集的应用抽象
2 RDD内幕解密
3 RDD思考
(1)RDD(弹性分布式数据集)
分布式是基于内存的计算方式,特别适合于迭代计算,也可以基于磁盘计算,适合各种规模的集群的计算。RDD是基于工作集的应用抽象,具有位置感知,容错 负载均衡的优点。
RDD基于数据集的处理:从物理存储上加载数据,然后操作数据 最后写入物理存储设备。基于数据集的方式,不适用:
1、不适合于含有大量迭代;
2、不适合交互式查询;
重点是:基于数据流的方式 不能够复用曾经的结果或者中间计算结果
(2)RDD组成:
RDD由以下几个主要部分组成
partitions——partition集合,一个RDD中有多少data partition
dependencies——RDD依赖关系
compute(parition)——对于给定的数据集,需要作哪些计算
preferredLocations——对于data partition的位置偏好
1、分布式:多态集群,整个Spark有一个提交程序的Driver端,提交给集群(多台)进行运行,不同的Node处理其中一部分内容,Node间各不影响。
2、主要基于内存:data首先会考虑在MEM中运行,data太大可将部分data数据存放于disk上,
3、擅长迭代计算(多步骤计算)shuffle
RDD:rdd代表要处理的数据,分布式处理,data分成若干分片Partition,存储于不同的节点中,只进行rdd的处理,
(3)RDD弹性的特点:
1、弹性之一:自动的进行内存和磁盘数据存储的切换;
2、弹性之二:基于Lineage的高效容错(第n个节点出错,会从第n-1个节点恢复,血统容错);
3、弹性之三:Task如果失败会自动进行特定次数的重试(默认4次);
4、弹性之四:Stage如果失败会自动进行特定次数的重试(可以值运行计算失败的阶段);只计算失败的数据分片;
5、弹性之五:checkpoint
6、弹性之六:数据调度弹性:DAG TASK 和资源 管理无关
7、弹性之七:数据分片的高度弹性,repartition
RDD:是分布式函数式编程的抽象,采用Lazy级别,开始的时候只对数据集合做标记(操作的标记),如,下面flatmap中,下面的this为父RDD,即每次父RDD都会作为第一个参数传进来,构成了链条,也是一个函数展开的过程,即操作的标记。
new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.flatMap(cleanF))
1、RDD基于内存迭代,需要很多内存,
2、Spark1.x之前收数据规模的限制,受限于shuffle的机制
(4)常规的容错的方式:
1、数据检查点(IDC网络连接每台机器,操作前都需赋值数据集,极大的销号数据,网络带宽压力太大)
2、记录数据的更新(每次变化都需要记录,缺点为:复杂易失控)
数据复制或日志记录。对于以数据为中心的系统而言,这两种方式都非常昂贵,因为它需要跨集群网络拷贝大量数据,毕竟带宽的数据远远低于内存。
RDD天生是支持容错的。首先,它自身是一个不变的(immutable)数据集,其次,它能够记住构建它的操作图(Graph of Operation),因此当执行任务的Worker失败时,完全可以通过操作图获得之前执行的操作,进行重新计算。由于无需采用replication方式支持容错,很好地降低了跨网络的数据传输成本。
不过,在某些场景下,Spark也需要利用记录日志的方式来支持容错。例如,在Spark Streaming中,针对数据进行update操作,或者调用Streaming提供的window操作时,就需要恢复执行过程的中间状态。此时,需要通过Spark提供的checkpoint机制,以支持操作能够从checkpoint得到恢复。
针对RDD的wide dependency,最有效的容错方式同样还是采用checkpoint机制。不过,似乎Spark的最新版本仍然没有引入auto checkpointing机制。
(5)Spark就是基于数据更新,RDD通过记录数据更新的方式为何很高效?
1、RDD不可变(每次操作变成新的RDD,构成计算链条,不会产生中间结果,没有中间结果,就不需要维护)且Lazy级别的;
从第900步恢复的前提是要在900步持久化,每次产生新的RDD, 因为没有全局修改数据, 从而控制难度下降, 在这个基础之上RDD还有计算链条, 当第901个步骤出错了, 我们就可以从第900个步骤恢复, 因为每次都以前一个RDD作为标记, 因此可以做到在哪出错就在哪恢复。
2、RDD为什么是粗粒度(对RDD的所有写操作都是粗粒度的,对RDD进行的读操作可以是粗粒度和细粒度):为了效率,为了简化。
RDD本身各种转换都的惰性的,只记录,并不真实计算, action的时候才计算,出错的时候,会从记录源头开始重新计算,迭代时,为了避免这些重复计算,会引进一些机制,比如缓存,Checkpoint等等。这些控制性的操作之后,就直接从缓存或Checkpoint中获取数据,而不需要重新计算整个记录的操作,所以可以在内存中迭代使用rdd。另外,stage内的因为不需要Shuffle,所以可以pipeline方式,在内存中流式的计算数据,而对应的,stage的结果,也有一个重复利用的机制,当写磁盘后,后续可以重复使用这个stage的写磁盘结果,而不需要多次重复计算整个stage。
narrow dependencies可以支持在同一个cluster node上以管道形式执行多条命令,例如在执行了map后,紧接着执行filter。相反,wide dependencies需要所有的父分区都是可用的,可能还需要调用类似MapReduce之类的操作进行跨节点传递。
其次,则是从失败恢复的角度考虑。narrow dependencies的失败恢复更有效,因为它只需要重新计算丢失的parent partition即可,而且可以并行地在不同节点进行重计算。而wide dependencies牵涉到RDD各级的多个Parent Partitions。
(6)覆写RDD情况:
listPartition,必须知道数据分片的位置,RDD的数据分片计算逻辑都是一致的,处理数据不同。
RDD在函数展开的时候默认只会记录一次数据,除非进行checkpoint或者persist等情况。
所有的RDD返回都是一个迭代器Iterator,所以SparkSQL和Spark Streaming无缝集成各种框架(其内可以互相操作,this.type)。
注:Tachyon整合南北数据中心不同步数据的
Spark不擅长处理实时事物性处理,一统数据计算领域
(7)RDD缺陷:
1、主要不支持细粒度的写操作
2、不支持增量迭代计算(计算的时候只计算一部分数据)
Spark Streaming+kafka取代Storm
def repartition(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T] = withScope {
coalesce(numPartitions, shuffle = true)}
def coalesce(numPartitions: Int, shuffle: Boolean = false)(implicit ord: Ordering[T] = null)
注:
1、RDD有依赖的清除需要checkpoint(一般存磁盘)
2、假设有1000个RDD,不会产生中间结果,只产生一次结果,若一个Stage有1000步骤,默认产生一次结果。
Spark,在进行下一步操作的时候,会感知当前位置。
(8)RDD写入缓存cache的几种情况:
1、计算步骤特别耗时会做Cache
2、计算链条很长,失败的时候会有很大代价,血统容错恢复;
3、shuffle之后;
4、checkPoint:Tachyon(Cache不可靠)data放于文件系统中,保证数据安全
(9)RDD如何保障数据处理效率?
RDD提供了两方面的特性persistence和patitioning,用户可以通过persist与patitionBy函数来控制RDD的这两个方面。RDD的分区特性与并行计算能力(RDD定义了parallerize函数),使得Spark可以更好地利用可伸缩的硬件资源。若将分区与持久化二者结合起来,就能更加高效地处理海量数据。
RDD的特性可以总结如下:
· 它是不变的数据结构存储
· 它是支持跨集群的分布式数据结构
· 可以根据数据记录的key对结构进行分区
· 提供了粗粒度的操作,且这些操作都支持分区
· 它将数据存储在内存中,从而提供了低延迟性
DT大数据梦工厂
新浪微博:www.weibo.com/ilovepains/
微信公众号:DT_Spark
博客:http://.blog.sina.com.cn/ilovepains
TEL:18610086859
Email:18610086859@vip.126.com