2.0Spark编程模型

循序渐进学Saprk

与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分区 在图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-2 RDD依赖
  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提供了粗粒度的操作,并且都支持分区。

2.2 Spark程序模型 下面给出一个经典的统计日志中ERROR的例子,以便读者直观理解Spark程序模型。 1)SparkContext中的textFile函数从存储系统(如HDFS)中读取日志文件,生成file变量。 scala> var file = sc.textFile("hdfs://...") 2)统计日志文件中,所有含ERROR的行。 scala> var errors = file.filer(line=>line.contains("ERROR")) 3)返回包含ERROR的行数。 errors.count() RDD的操作与Scala集合非常类似,这是Spark努力追求的目标:像编写单机程序一样编写分布式应用。但二者的数据和运行模型却有很大不同,如图2-3所示。 [插图] 图2-3 Spark程序模型 在图2-3中,每一次对RDD的操作都造成了RDD的变换。其中RDD的每个逻辑分区Partition都对应Block Manager(物理存储管理器)中的物理数据块Block(保存在内存或硬盘上)。前文已强调,RDD是应用程序中核心的元数据结构,其中保存了逻辑分区与物理数据块之间的映射关系,以及父辈RDD的依赖转换关系。

2.3 Spark算子 本节介绍Spark算子的分类及其功能。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Albert陈凯

4.0Spark编程模型RDD

Spark核心技术与高级应用 第4章 编程模型 不自见,故明;不自是,故彰;不自伐,故有功;不自矜,故能长。 ——《道德经》第二十二章 在面对自我的问题上,不...

3039
来自专栏xingoo, 一个梦想做发明家的程序员

Structured Streaming教程(1) —— 基本概念与使用

在有过1.6的streaming和2.x的streaming开发体验之后,再来使用Structured Streaming会有一种完全不同的体验,尤其是在代码设...

1431
来自专栏Albert陈凯

Spark系列课程-00xxSpark RDD持久化

我们这节课讲一下RDD的持久化 ? RDD的持久化 这段代码我们上午已经看过了,有瑕疵大家看出来了吗? 有什么瑕疵啊? 大家是否还记得我在第二节课的时候跟大...

4088
来自专栏行者悟空

Spark RDD的Shuffle

1873
来自专栏Albert陈凯

Spark概要掌握情况自我核查

1、Spark目前只持哪哪种语言的API? Java, Scala, Python, R. Ref: http://spark.apache.org/ 2、R...

2603
来自专栏悦思悦读

Spark为什么比Hadoop快那么多?

在2014年11月5日举行的Daytona Gray Sort 100TB Benchmark竞赛中,Databricks 用构建于206个运算节点之上的spa...

51411
来自专栏北京马哥教育

Spark:一个高效的分布式计算系统

马哥linux运维 | 最专业的linux培训机构 ---- 概述 什么是Spark Spark是UC Berkeley AMP lab所开源的类Hado...

4486
来自专栏about云

spark零基础学习线路指导

问题导读 1.你认为spark该如何入门? 2.你认为spark入门编程需要哪些步骤? 3.本文介绍了spark哪些编程知识? ? spark...

3985
来自专栏斑斓

大数据 | 理解Spark的核心RDD

与许多专有的大数据处理平台不同,Spark建立在统一抽象的RDD之上,使得它可以以基本一致的方式应对不同的大数据处理场景,包括MapReduce,Streami...

3929
来自专栏Albert陈凯

3.6 Shuffle机制

3.6 Shuffle机制 在MapReduce框架中,Shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过Shuff...

2914

扫码关注云+社区

领取腾讯云代金券