《循序渐进学Spark》一第2章

 本节书摘来自华章出版社《循序渐进学Spark》一书中的第2章,第2.1节,作者 小象学院 杨 磊,更多章节内容可以访问“华章计算机”公众号查看。

第2章

Spark 编程模型

与Hadoop相比,Spark最初为提升性能而诞生。Spark是Hadoop MapReduce的演化和改进,并兼容了一些数据库的基本思想,可以说,Spark一开始就站在Hadoop与数据库这两个巨人的肩膀上。同时,Spark依靠Scala强大的函数式编程Actor通信模式、闭包、容器、泛型,并借助统一资源调度框架,成为一个简洁、高效、强大的分布式大数据处理框架。

Spark在运算期间,将输入数据与中间计算结果保存在内存中,直接在内存中计算。另外,用户也可以将重复利用的数据缓存在内存中,缩短数据读写时间,以提高下次计算的效率。显而易见,Spark基于内存计算的特性使其擅长于迭代式与交互式任务,但也不难发现,Spark需要大量内存来完成计算任务。集群规模与Spark性能之间呈正比关系,随着集群中机器数量的增长,Spark的性能也呈线性增长。接下来介绍Spark编程模型。

2.1 RDD弹性分布式数据集

通常来讲,数据处理有几种常见模型:Iterative Algorithms、Relational Queries、Map-

Reduce、Stream Processing。例如,Hadoop MapReduce采用了MapReduce模型,Storm则采用了Stream
Processing模型。

与许多其他大数据处理平台不同,Spark建立在统一抽象的RDD之上,而RDD混合了上述这4种模型,使得Spark能以基本一致的方式应对不同的大数据处理场景,包括MapReduce、Streaming、SQL、Machine Learning以及Graph等。这契合了Matei Zaharia提出的原则:“设计一个通用的编程抽象(Unified Programming Abstraction)”,这也正是Spark的魅力所在,因此要理解Spark,先要理解RDD的概念。

2.1.1 RDD简介

RDD(Resilient Distributed Datasets,弹性分布式数据集)是一个容错的、并行的数据结构,可以让用户显式地将数据存储到磁盘或内存中,并控制数据的分区。RDD还提供了一组丰富的操作来操作这些数据,诸如map、flatMap、filter等转换操作实现了monad模式,很好地契合了Scala的集合操作。除此之外,RDD还提供诸如join、groupBy、reduceByKey等更为方便的操作,以支持常见的数据运算。

RDD是Spark的核心数据结构,通过RDD的依赖关系形成Spark的调度顺序。所谓Spark应用程序,本质是一组对RDD的操作。

下面介绍RDD的创建方式及操作算子类型。

RDD的两种创建方式

从文件系统输入(如HDFS)创建

从已存在的RDD转换得到新的RDD

RDD的两种操作算子

Transformation(变换)

Transformation类型的算子不是立刻执行,而是延迟执行。也就是说从一个RDD变换为另一个RDD的操作需要等到Action操作触发时,才会真正执行。

Action(行动)

Action类型的算子会触发Spark提交作业,并将数据输出到Spark系统。

2.1.2 深入理解RDD

RDD从直观上可以看作一个数组,本质上是逻辑分区记录的集合。在集群中,一个RDD可以包含多个分布在不同节点上的分区,每个分区是一个dataset片段,如图2-1所示。

在图2-1中,RDD-1含有三个分区(p1、p2和p3),分布存储在两个节点上:node1与node2。RDD-2只有一个分区P4,存储在node3节点上。RDD-3含有两个分区P5和P6,存储在node4节点上。

1.  RDD依赖

RDD可以相互依赖,如果RDD的每个分区最多只能被一个Child RDD的一个分区使用,则称之为窄依赖(narrow dependency);若多个Child RDD分区都可以依赖,则称之为宽依赖(wide dependency)。不同的操作依据其特性,可能会产生不同的依赖。例如,map操作会产生窄依赖,join操作则产生宽依赖,如图2-2所示。

2. RDD支持容错性

支持容错通常采用两种方式:日志记录或者数据复制。对于以数据为中心的系统而言,这两种方式都非常昂贵,因为它需要跨集群网络拷贝大量数据。

RDD天生是支持容错的。首先,它自身是一个不变的(immutable)数据集,其次,RDD之间通过lineage产生依赖关系(在下章继续探讨这个话题),因此RDD能够记住构建它的操作图,当执行任务的Worker失败时,完全可以通过操作图获得之前执行的操作,重新计算。因此无须采用replication方式支持容错,很好地降低了跨网络的数据传输成本。

3. RDD的高效性

RDD提供了两方面的特性:persistence(持久化)和partitioning(分区),用户可以通过persist与partitionBy函数来控制这两个特性。RDD的分区特性与并行计算能力(RDD定义了parallerize函数),使得Spark可以更好地利用可伸缩的硬件资源。如果将分区与持久化二者结合起来,就能更加高效地处理海量数据。

另外,RDD本质上是一个内存数据集,在访问RDD时,指针只会指向与操作相关的部分。例如,存在一个面向列的数据结构,其中一个实现为Int型数组,另一个实现为Float型数组。如果只需要访问Int字段,RDD的指针可以只访问Int数组,避免扫描整个数据结构。

再者,如前文所述,RDD将操作分为两类:Transformation与Action。无论执行了多少次Transformation操作,RDD都不会真正执行运算,只有当Action操作被执行时,运算才会触发。而在RDD的内部实现机制中,底层接口则是基于迭代器的,从而使得数据访问变得更高效,也避免了大量中间结果对内存的消耗。

在实现时,RDD针对Transformation操作,提供了对应的继承自RDD的类型,例如,map操作会返回MappedRDD,flatMap则返回FlatMappedRDD。执行map或flatMap操作时,不过是将当前RDD对象传递给对应的RDD对象而已。

2.1.3 RDD特性总结

RDD是Spark的核心,也是整个Spark的架构基础。它的特性可以总结如下:

1) RDD是不变的(immutable)数据结构存储。

2) RDD将数据存储在内存中,从而提供了低延迟性。

3) RDD是支持跨集群的分布式数据结构。

4) RDD可以根据记录的Key对结构分区。

5) RDD提供了粗粒度的操作,并且都支持分区。

时间: 2024-08-03 17:49:25

《循序渐进学Spark》一第2章的相关文章

《仿人机器人原理与实战》一1.4 反射弧实验进阶

1.4 反射弧实验进阶 在仿人机器人的设计中,这种简单的反射弧模拟装置不仅功能齐全而且十分有用.同人类的反射一样,直至反射被触发,舵机才正常运转.不过,你可以将程序稍作改进,以便提供更多有实用价值的功能.按照如下顺序,我们将这些功能添加到模拟器的硬件和代码库中. 1.4.1 反射方向 第一个改进是以编程方式定义反射方向.如果把开关S1安装在舵机摇臂上,那么反射可以使按钮的运动方向朝向或躲避撞击物体.如果反射方向不能满足设计要求,那么你可以移动开关,或者减小位置变量的值至0.以下是需要替换的递增代

《仿人机器人原理与实战》一导读

前 言 本书以人体为讨论对象,采用一种独特而有趣的视角来学习嵌入式系统.机器人学和电子学.诚然,爬行机器人和地毯清洁机器人是非常酷的实验平台,但是它们多半是冷冰冰的.毫无生气的机器.反之,人类拥有复杂的神经反射,包括根据压力调节心跳频率和根据环境光线强度调节瞳孔大小等.如果你想迈出制造更接近人类的机器人的第一步,那么本书是你的不二选择. 首先,本书的灵感一部分来源于科幻作家所描绘的影像,一部分来源于我们开发救生用人工智能系统的经验.如果你已经看过<银翼杀手><太空堡垒卡拉狄加>&l

《仿人机器人原理与实战》一1.1 反射弧生物学基础

1.1 反射弧生物学基础 当内部或外界事件发生时,体会反射过程似乎是一件困难的事,因为在某些事件发生之前,有些反射是没有被激活的.我们不妨援用下面的故事来解释这一过程. 1.1.1 猴子突袭 设想身处旧金山普雷西迪奥的你正漫步在桉树林中,此时,一只75磅的硕壮的猴子突然跳到你的背上.如果你姿势不错,那么你还能保持直立,然后把它从脖子上抓下来,在它戳你眼睛.咬你耳朵之前把它扔到地上.反之,如果此时你膝部弯曲,那么你会毫无悬念地摔倒在地,而猴子又将跳到你的胸口,没准儿你会因此呼吸困难,事情不太可能完

《仿人机器人原理与实战》一1.5 反射弧“小魔怪”

1.5 反射弧"小魔怪" 如上所述,这里给出的是最简单的机器人电路.你也许注意到例子里并没有用中断或者复杂的算法.毫无疑问,将大量代码减少到几行是有可能的,且能够实现位翻转操作,希望你能做到.但是,对我们的目的来说,用简单的整数运算就能达到目的了.然而在实践中,即使简单的机器人也会被贴上"多学科综合"和"问题重生"的标签.因此,机器人偶尔也会有小故障.假设一个舵机在不规律地运行,有时会产生流畅的反射,有时只是跳动几秒钟.代码可能是完美的,布线也是

《仿人机器人原理与实战》一1.3 反射弧实验入门

1.3 反射弧实验入门 现在到了你卷起衣袖运用理论的时间了,我们从一个简单的反射弧模拟器开始.该模拟器可以模仿之前详述的简单反射,但是两者之间有一些区别:在脊髓中的突触被隐藏了,而纺锤体纤维中的牵引传感器首先由瞬时接触开关代替,再由力传感器代替.事实上,你们会发现将模拟装置简单化的设计方法可以应用在任何一个仿人机器人的设计上. 1.3.1 器材清单 为了构建在本章的第一部分提到的一系列简单反射弧,我们需要以下器材: 模拟量舵机(2个) 瞬时接触开关(2个) 10kΩ电位器(2个) Arduino

《仿人机器人原理与实战》一3.5 附加项目:电加热板的PID控制

3.5 附加项目:电加热板的PID控制 好了,我们假定你对混合水和电不感兴趣.不过你仍然可以将之前的理论和代码应用到全电加热系统中,而且只需要修改少量代码.如果你的目标只是为仿人机器人提供热量,而不需要将其产生的热量转移,那么最简单的方法是把清单3-3中的PID控制代码和仿人机器人皮肤下的加热元件联合起来.3.5.1 器材清单完成这个附加项目,你需要以下器材: Arduino Uno或者等效微控制器 5Vdc的聚酰亚胺薄膜加热板 给加热板供电的9-12Vdc电源 电机驱动扩展板或者额定电流2A的

《仿人机器人原理与实战》一1.2 反射弧与仿人机器人设计

1.2 反射弧与仿人机器人设计 鉴于人类反射机制的各种优势,显然仿人机器人可以从类似的功能中获益.例如,将传感器和末端执行器的处理从主控制器转移到外设微处理器中,不仅为更复杂的工作腾出运算资源,也降低了灾难式单点故障发生的可能性.但是在设计仿人机器人时,还需要仔细考虑如何将这些优势与你的设计相匹配.在设计仿人机器人的反射功能时,主要问题是带自主反射仿人机器人与其所处环境的隔离程度.为给这个话题添加一个有实际意义的上下文,想象搜索和救援仿人机器人在一个部分坍塌的矿井中搜索失踪人员的情景.现在,我们

《仿人机器人原理与实战》一第3章

第3章 动 态 平 衡动态平衡即恒定内部状态的维持,是生理上需要实现的目标.更进一步,生理学使我们能够快速地从座位上站起来而不会飞出去.这与使用PID(比例–积分–微分)控制器有直接关系,PID控制器能够让机器人无人机在有风的情况下维持飞行高度.站起和飞行两者都依赖于负反馈控制系统.本章以温度控制为焦点来探索动态平衡和基本控制理论.我们选择温度为控制对象,而不是关节速度.功率或压力,这是因为温度传感器是现成的,第一手经验更加丰富,也许更重要的是,本实验将水和电有目的地混合在一起,这种机会非常宝贵

《仿人机器人原理与实战》一2.3 行为链实验入门

2.3 行为链实验入门 有了第1章描述的反射弧,再加上机械臂.温度和压力传感器以及一点想象力,我们将探讨一个关于图2-1中所示的理论上的行为链框架的实际例子.作为一个四肢健全的仿人机器人的组成部分之一,机械臂是一个很好的实验平台,因为它足够复杂以至于能够演示许多种肢体上的行为链.我们的另一个选择是应用仿真.然而,电脑仿真或许能够体现出应当发生的事情,然而在现实中移动具体的事物更具有魔力.如图2-3所示,我们通过按钮S1来启动夹持器夹紧的动作.如果夹持器上的传感器测量出被夹物体的温度过高,则夹持器

《仿人机器人原理与实战》一第2章

第2章 行 为 链在通常情况下及绝大部分时间里,大多数人的创造力和智慧是被高估且未被充分利用的.人类是依赖于习惯的生物,而习惯是一种人们每天都在重复的行为链.你身后一位驾驶18轮大货车的司机可能事实上正在创作奏鸣曲或者正在纠结于希格斯玻色子的意义,但是从他的行为来看,他也可能正在仔细考虑中午吃什么.对于司机的雇主来说,重要的是司机要把货物完好.准时地送到,雇主只需要确定司机知道油门和刹车的区别就够了,关于司机的其他方面都是没有意义的.仿人机器人也一样,只要能够完成工作任务,它在想什么并不重要.如