RDD内部解密

第一阶段(1-3月):会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战。课程会涵盖Scala编程详解、Spark核心编程、Spark SQLSpark StreamingSpark GraphXSparkRMachine LearningSpark内核以及源码剖析、性能调优、企业级案例实战等部分

第二阶段(Spark超大规模大数据案例实战):使用了Spark技术生态栈中的Spark CoreSpark SQLSpark StreamingSparkRMachine 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的处理,

3RDD弹性的特点:

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得到恢复。

针对RDDwide 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,所以SparkSQLSpark 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)

注:

1RDD有依赖的清除需要checkpoint(一般存磁盘)

2、假设有1000RDD,不会产生中间结果,只产生一次结果,若一个Stage1000步骤,默认产生一次结果。

 

 

Spark,在进行下一步操作的时候,会感知当前位置。

(8)RDD写入缓存cache的几种情况:

1、计算步骤特别耗时会做Cache

2、计算链条很长,失败的时候会有很大代价,血统容错恢复;

3shuffle之后;

4checkPointTachyonCache不可靠)data放于文件系统中,保证数据安全

(9)RDD如何保障数据处理效率?

RDD提供了两方面的特性persistencepatitioning,用户可以通过persistpatitionBy函数来控制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









  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值