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

了解Spark的中心RDD(spark机构)  Spark RDD 数据 第1张

与许多专有的大数据处理渠道不同,Spark建立在共同笼统的RDD之上,使得它能够以根本共同的方法应对不同的大数据处理场景,包括MapReduce,Streaming,SQL,Machine Learning以及Graph等。这即Matei Zaharia所谓的“规划一个通用的编程笼统(Unified Programming Abstraction)。这正是Spark这朵小火花让人入神的当地。要了解Spark,就需得了解RDD。

RDD是什么?

RDD,全称为Resilient Distributed Datasets,是一个容错的、并行的数据结构,能够让用户显式地将数据存储到磁盘和内存中,并能操控数据的分区。一起,RDD还供给了一组丰厚的操作来操作这些数据。在这些操作中,比如map、flatMap、filter等转化操作完成了monad方法,很好地符合了Scala的调集操作。

除此之外,RDD还供给了比如join、groupBy、reduceByKey等更为便利的操作(留意,reduceByKey是action,而非transformation),以支撑常见的数据运算。 一般来讲,针对数据处理有几种常见模型,包括:Iterative Algorithms,Relational Queries,MapReduce,Stream Processing。例如Hadoop MapReduce选用了MapReduces模型,Storm则选用了Stream Processing模型。

RDD混合了这四种模型,使得Spark能够应用于各种大数据处理场景。RDD作为数据结构,本质上是一个只读的分区记载调集。一个RDD能够包括多个分区,每个分区便是一个dataset片段。RDD能够相互依靠。 假如RDD的每个分区最多只能被一个Child RDD的一个分区运用,则称之为narrow dependency;若多个Child RDD分区都能够依靠,则称之为wide dependency。不同的操作依据其特性,或许会发生不同的依靠。

例如map操作会发生narrow dependency,而join操作则发生wide dependency。Spark之所以将依靠分为narrow与wide,依据两点原因。 首要,narrow dependencies能够支撑在同一个cluster node上以管道方法履行多条指令,例如在履行了map后,紧接着履行filter。相反,wide dependencies需求一切的父分区都是可用的,或许还需求调用相似MapReduce之类的操作进行跨节点传递。 其次,则是从失利康复的视点考虑。

narrow dependencies的失利康复更有用,因为它只需求从头核算丢掉的parent partition即可,并且能够并行地在不同节点进行重核算。而wide dependencies牵涉到RDD各级的多个Parent Partitions。下图说明晰narrow dependencies与wide dependencies之间的差异:

了解Spark的中心RDD(spark机构)  Spark RDD 数据 第2张

本图来自Matei Zaharia编撰的论文An Architecture for Fast and General Data Processing on Large Clusters。图中,一个box代表一个RDD,一个带暗影的矩形框代表一个partition。RDD怎么保证数据处理功率?RDD供给了两方面的特性persistence和patitioning,用户能够经过persist与patitionBy函数来操控RDD的这两个方面。RDD的分区特性与并行核算才能(RDD界说了parallerize函数),使得Spark能够更好地使用可弹性的硬件资源。若将分区与耐久化二者结合起来,就能愈加高效地处理海量数据。 例如:

了解Spark的中心RDD(spark机构)  Spark RDD 数据 第3张

partitionBy函数需求承受一个Partitioner目标,如:

了解Spark的中心RDD(spark机构)  Spark RDD 数据 第4张

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目标罢了。 例如:

了解Spark的中心RDD(spark机构)  Spark RDD 数据 第5张

这些承继自RDD的类都界说了compute函数。该函数会在action操作被调用时触发,在函数内部是经过迭代器进行对应的转化操作:

了解Spark的中心RDD(spark机构)  Spark RDD 数据 第6张

RDD对容错的支撑

支撑容错一般选用两种方法: 数据仿制或日志记载。关于以数据为中心的体系而言,这两种方法都十分贵重,因为它需求跨集群网络复制很多数据,究竟带宽的数据远远低于内存。RDD天然生成是支撑容错的。首要,它本身是一个不变的(immutable)数据集,其次,它能够记住构建它的操作图(Graph of Operation),因而当履行任务的Worker失利时,完全能够经过操作图取得之前履行的操作,进行从头核算。

因为无需选用replication方法支撑容错,很好地降低了跨网络的数据传输本钱。不过,在某些场景下,Spark也需求使用记载日志的方法来支撑容错。例如,在Spark Streaming中,针对数据进行update操作,或许调用Streaming供给的window操作时,就需求康复履行进程的中心状态。 此刻,需求经过Spark供给的checkpoint机制,以支撑操作能够从checkpoint得到康复。

针对RDD的wide dependency,最有用的容错方法相同仍是选用checkpoint机制。不过,好像Spark的***版别依然没有引进auto checkpointing机制。总结RDD是Spark的中心,也是整个Spark的架构根底。 它的特性能够总结如下:

  • 它是不变的数据结构存储
  • 它是支撑跨集群的分布式数据结构
  • 能够依据数据记载的key对结构进行分区
  • 供给了粗粒度的操作,且这些操作都支撑分区
  • 它将数据存储在内存中,然后供给了低推迟性
转载请说明出处
知优网 » 了解Spark的中心RDD(spark机构)

发表评论

您需要后才能发表评论