Spark计算模型-RDD介绍
在Spark集群背后,有一个非常重要的分布式数据架构,即弹性分布式数据集(Resilient Distributed DataSet,RDD),它是逻辑集中的实体,在集群中的多台集群上进行数据分区。通过对多台机器上不同RDD分区的控制,能够减少机器之间的数据重排(Data Shuffle)。Spark提供了“partitionBy”运算符,能够通过集群中多台机器之间对原始RDD进行数据再分配来创建一个新的RDD。RDD是Spark的核心数据结构,通过RDD的依赖关系形成Spark的调度顺序。通过RDD的操作形成整个Spark程序。
RDD有四种创建方式,如下:
1、从Hadoop文件系统(或与Hadoop兼容的其他持久化存储系统,如Hive、Cassandra、HBase)输入(如HDFS)创建。
2、从父RDD转换得到新的RDD。
3、调用SparkContext()方法的parallelize,将Driver上的数据集并行化,转化为分布式的RDD。
4、更改RDD的持久性(persistence),例如cache()函数。默认RDD计算后会在内存中清除。通过cache()函数将计算后的RDD缓存在内存中。
RDD的两种操作算子
对于RDD可以有两种计算操作算子:Transformation(变换)与Action(行动)。
1、Transformation(变化)算子
Transformation操作是延迟计算的,也就是说从一个RDD转换生成另一个RDD的转换操作不是马上执行,需要等到有Actions操作时才真正触发运算。
2、Action(行动)算子
Action算子会触发Spark提交作业(Job),并将数据输出到Spark系统。
算子的分类:
1、Value数据类型的Transformation算子,这种变换算子不触发提交作业,针对处理的数据项是Value型的数据。
处理数据类型为Value型的Transformation算子可以根据RDD变换算子的输入分区与输出分区关系分为以下几种类型:
1、输入分区与输出分区一对一型。
2、输入分区与输入分区多对一型。
3、输入分区与输出分区多对多型。
4、输出分区为输入分区子集型。
5、一种特殊的输入与输出分区一对一的算子类型,即Cache型。Cache。
2、Key-Value数据类型的Transformation算子,这种变换算子不触发提交作业,针对处理的数据项是Key-Value型的数据对。
处理数据类型为Key-Value型的算子,大致分为以下几种类型:
1、输入分区与输出分区一对一型。
2、聚集(单个RDD聚集/多个RDD聚集)。
3、连接(对两个需要连接的RDD进行cogroup函数操作的Join/左外连接或右外连接(在Join的基础上进行))。
3、Action算子,这类算子会触发SparkContext提交Job作业。
本质上在Actions算子中通过SparkContext执行提交作业的runJob操作,触发了RDD DAG(有向无环图)的执行。根据Action算子的输出空间将Action算子分为以下几种类型:
1、无输出(对RDD中每个元素都应用f函数操作,不返回RDD和Array,而是返回Unit。即foreach。)。
2、HDFS(调用saveAsTextFile函数将数据输出存储到HDFS中;saveAsObjectFile将分区中的固定长度一组元素组成的一个Array然后将这个Array序列化,映射为Key-Value的元素写入HDFS为SequenceFile格式的文件)。
3、Scala集合和数据类型(collect;collectAsMap;reduceByKeyLocally;lookup;count;top;reduce;folt;aggregate)。
RDD的重要内部属性
1、分区列表。
2、计算每个分片的函数。
3、对父RDD的依赖列表。
4、对Key-Value数据类型RDD的分区器,控制分区策略和分区数,
5、每个数据分区的地址列表(如HDFS上的数据块的地址)。
Spark数据存储的核心是弹性分布式数据集(RDD)。RDD可以被抽象的理解为一个大的数组(Array),但这个数组是分布在集群上的。逻辑上RDD的每个分区叫一个Partition。在Spark的执行过程中,RDD经历一个个的Transformation算子之后,最后通过Action算子进行触发操作。逻辑上每经历一次变换,就会将RDD转换为一个新的RDD,RDD之间通过Lineage产生依赖关系。这个关系在容错中有很重要的作用。变换的输入和输出都是RDD。RDD会被划分成很多的分区分布到集群的多个节点中。分区是个逻辑概念,变换前后的新旧分区在物理上可能是同一块内存存储。这是很重要的优化,以防止函数式数据不变性(Immutable)导致的内存需求无限扩张。有些RDD是计算的中间结果,其分区并不一定有相应的内存或磁盘数据与之对应,如果要迭代使用数据,可以调用cache()函数缓存数据。
在物理上,RDD对象实质上是一个元数据结构,存储着Block、Node等的映射关系和其他元数据信息。一个RDD就是一组分区,在物理数据存储上,RDD的每个分区对应的就是一个Block,Block可以存储在内存,当内存不够的时候可以存储到磁盘上。每个Block中存储着RDD所有数据项的一个子集,暴露给用户的可以是一个Block的迭代器(例如用户可以通过mapPartitions获得分区迭代器进行操作),也可以就是一个数据项(例如通过map函数对每个数据项进行并行计算)。如果是从HDFS等外部存储作为输入数据源,数据按照HDFS中的数据分布策略进行数据分区,HDFS中的一个Block对应SPark的一个分区。同事Spark支持重分区,数据通过Spark默认的或者用户自定义的分区器决定数据块分布在那些节点。例如:支持hash分区(按照数据项Key值取hash值,hash值相同的元素放入同一个分区内)和Range分区(将属于同一数据范围的数据放入同一分区)的策略。
总结:Spark将应用程序整体翻译为一个DAG有向无环图进行调度和执行。相比MapReduce,Spark提供了更加优化和复杂的执行流。
Spark计算模型-RDD介绍的更多相关文章
- Spark计算模型RDD
RDD弹性分布式数据集 RDD概述 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可并行 ...
- Spark计算模型
[TOC] Spark计算模型 Spark程序模型 一个经典的示例模型 SparkContext中的textFile函数从HDFS读取日志文件,输出变量file var file = sc.textF ...
- Spark(六) -- Spark计算模型
整个Spark框架都是基于RDD算子来进行计算的. What is RDD? Resilient Distributed Dataset(RDD),分布式弹性数据集,是Spark上的一个核心抽象 表示 ...
- 重要 | Spark和MapReduce的对比,不仅仅是计算模型?
[前言:笔者将分上下篇文章进行阐述Spark和MapReduce的对比,首篇侧重于"宏观"上的对比,更多的是笔者总结的针对"相对于MapReduce我们为什么选择Spar ...
- Spark之编程模型RDD
前言:Spark编程模型两个主要抽象,一个是弹性分布式数据集RDD,它是一种特殊集合,支持多种数据源,可支持并行计算,可缓存:另一个是两种共享变量,支持并行计算的广播变量和累加器. 1.RDD介绍 S ...
- 【CDN+】 Spark入门---Handoop 中的MapReduce计算模型
前言 项目中运用了Spark进行Kafka集群下面的数据消费,本文作为一个Spark入门文章/笔记,介绍下Spark基本概念以及MapReduce模型 Spark的基本概念: 官网: http://s ...
- Spark 并行计算模型:RDD
Spark 允许用户为driver(或主节点)编写运行在计算集群上,并行处理数据的程序.在Spark中,它使用RDDs代表大型的数据集,RDDs是一组不可变的分布式的对象的集合,存储在executor ...
- Spark—RDD介绍
Spark-RDD 1.概念介绍 RDD(Resilient Distributed Dataset):弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可并行计算 ...
- Spark编程模型及RDD操作
转载自:http://blog.csdn.net/liuwenbo0920/article/details/45243775 1. Spark中的基本概念 在Spark中,有下面的基本概念.Appli ...
随机推荐
- TCP和SSL
查看TCP和SSL的握手时间: curl -w "TCP handshake: %{time_connect}, SSL handshake: %{time_appconnect}\n&qu ...
- 2015 Multi-University Training Contest 2
附上第二场比赛的链接 从5300-5309 我是链接 顺便贴出官方题解:
- C#敏感关键词过滤代码
System.Text.StringBuilder sb = new System.Text.StringBuilder(text.Length); string filter ...
- type和create type
type和create type 异同点: create type 可在库中生成一个长期有效的自定义类型对象,而type作用域仅限于语句块中: 两者都可以自定义数据类型: 各种ty ...
- 抓取锁的sql语句-第三次修改
CREATE OR REPLACE PROCEDURE SOLVE_LOCK AS V_SQL VARCHAR2(3000); --定义 v_sql 接受抓取锁的sql语句CUR_LOCK SYS_R ...
- Pythonchallenge一起来闯关
http://www.pythonchallenge.com/是一个在线的python过关游戏,一共有33关.玩这个游戏对熟悉python用法及相关库的使用都很有好处. 目前做到了第九关.python ...
- Linux文件编程实例
//捕获fopen调用中的错误 #include <stdio.h> #include <errno.h> #include <string.h> #define ...
- MySQL 缓存 Query Cache
QueryCache(下面简称QC)是根据SQL语句来cache的.一个SQL查询如果以select开头,那么MySQL服务器将尝试对其使 用QC.每个Cache都是以SQL文本作为key来存的.在应 ...
- 面向对象设计模式之Flyweight享元模式(结构型)
动机:采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行代价——主要指内存需求方面的代价.如何在避免大量细粒度对象问题的同 时,让外部客户程序仍然能够透明地使用面向对象的 ...
- python学习第十八天 --文件操作
这一章节主要讲解文件操作及其文件读取,缓存,文件指针. 文件操作 (1)文件打开:open(filepath,filemode) filepath:要打开文件的路径 filemode:文件打开的方式 ...