• Spark RDD设计学习笔记


    本文档是学习RDD经典论文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》的学习笔记。
    date:2016/8/3
    author:wangxl

    1 引言

    一种分布式的内存抽象,称为弹性分布式数据集(RDD,Resilient Distributed Datasets)。

    2 弹性分布式数据集(RDD)

    2.1 目标

    目标:为基于工作集的应用(即多个并行操作重用中间结果的这类应用)提供抽象。
    1.自动容错
    1.检查点(成本高)
    2.记录数据的更新(粗粒度) ✔
    2.位置感知性调度
    3.可伸缩性
    不适合:RDD不太适合那些异步细粒度地更新共享状态的应用,例如并行web爬行器。

    2.2 RDD抽象

    RDD是只读的、分区记录的集合。RDD只能基于在稳定物理存储中的数据集和其他已有的RDD上执行确定性操作来创建。
    RDD不需要物化。根据Lineage可以从物理存储的数据计算出相应的RDD分区。

    2.3 编程模型

    在Spark中,RDD被表示为对象,通过这些对象上的方法(或函数)调用转换。
    定义RDD之后,程序员就可以在动作中使用RDD了。动作是向应用程序返回值,或向存储系统导出数据的那些操作(延迟计算)。
    控制RDD:
    1.缓存
    2.分区

    2.4 RDD与分布式共享内存DSM


    与DSM相比,RDD模型有两个好处。第一,对于RDD中的批量操作,运行时将根据数据存放的位置来调度任务,从而提高性能。第二,对于基于扫描的操作,如果内存不足以缓存整个RDD,就进行部分缓存。把内存放不下的分区存储到磁盘上,此时性能与现有的数据流系统差不多。
    最后看一下读操作的粒度。RDD上的很多动作(如count和collect)都是批量读操作,即扫描整个数据集,可以将任务分配到距离数据最近的节点上。同时,RDD也支持细粒度操作,即在哈希或范围分区的RDD上执行关键字查找。

    3. Spark编程接口

    1.转换
    2.动作
    

    4. 应用程序示例

    5. RDD的描述及作业调度

    每个RDD都包含:
    1.一组RDD分区(partition,即数据集的原子组成部分)
    2.对父RDD的一组依赖,这些依赖描述了RDD的Lineage
    3.一个函数,即在父RDD上执行何种计算
    4.元数据,描述分区模式和数据存放的位置。例如,一个表示HDFS文件的RDD包含:各个数据块的一个分区,并知道各个数据块放在哪些节点上。而且这个RDD上的map操作结果也具有同样的分区,map函数是在父数据上执行的。
    


    RDD之间的依赖关系:
    1.窄依赖(narrow dependencies):子RDD的每个分区依赖于常数个父分区(即与数据规模无关)
    2.宽依赖(wide dependencies):子RDD的每个分区依赖于所有父RDD分区。例如,map产生窄依赖,而join则是宽依赖(除非父RDD被哈希分区)

    5.1 RDD实现举例

    HDFS文件:目前为止我们给的例子中输入RDD都是HDFS文件,对这些RDD可以执行:partitions操作返回各个数据块的一个分区(每个Partition对象中保存数据块的偏移),preferredLocations操作返回数据块所在的节点列表,iterator操作对数据块进行读取。
    map:任何RDD上都可以执行map操作,返回一个MappedRDD对象。该操作传递一个函数参数给map,对父RDD上的记录按照iterator的方式执行这个函数,并返回一组符合条件的父RDD分区及其位置。
    union:在两个RDD上执行union操作,返回两个父RDD分区的并集。通过相应父RDD上的窄依赖关系计算每个子RDD分区(注意union操作不会过滤重复值,相当于SQL中的UNION ALL)。
    sample:抽样与映射类似,但是sample操作中,RDD需要存储一个随机数产生器的种子,这样每个分区能够确定哪些父RDD记录被抽样。
    join:对两个RDD执行join操作可能产生窄依赖(如果这两个RDD拥有相同的哈希分区或范围分区),可能是宽依赖,也可能两种依赖都有(比如一个父RDD有分区,而另一父RDD没有)。

    5.2 Spark任务调度器

    调度器根据RDD的结构信息为每个动作确定有效的执行计划。调度器的接口是runJob函数,参数为RDD及其分区集,和一个RDD分区上的函数。该接口足以表示Spark中的所有动作(即count、collect、save等)。
    stage的边界有两种情况:一是宽依赖上的Shuffle操作;二是已缓存分区,它可以缩短父RDD的计算过程

    参考

    http://shiyanjun.cn/archives/744.html

  • 相关阅读:
    HDU5754 Life Winner Bo(博弈)
    COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)
    ACdream1157 Segments(CDQ分治 + 线段树)
    Codeforces 611C New Year and Domino(二维前缀和)
    HDU5739 Fantasia(点双连通分量 + Block Forest Data Structure)
    POJ2942 Knights of the Round Table(点双连通分量 + 二分图染色)
    HDU 2255 奔小康赚大钱(KM算法)
    BZOJ 2395 [Balkan 2011]Timeismoney(最小乘积生成树)
    BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊(分块)
    Codeforces 610C:Harmony Analysis(构造)
  • 原文地址:https://www.cnblogs.com/riordon/p/5734015.html
Copyright © 2020-2023  润新知