【spark 深入学习 03】Spark RDD的蛮荒世界
RDD真的是一个很晦涩的词汇,他就是伯克利大学的博士们在论文中提出的一个概念,很抽象,很难懂;但是这是spark的核心概念,因此有必要spark rdd的知识点,用最简单、浅显易懂的词汇描述。不想用学术话的语言来阐述RDD是什么,用简单、容易理解的方式来描述。
一、什么是RDD,RDD出现的背景
Mapreduce计算模型的出现解决了分布式计算的诸多难题,但是由于MR对数据共享的解决方案比较低效,导致MR编程模型效率不高,将数据写到一个稳定的外部存储系统,如HDFS,这个会引起数据复写、磁盘IO、磁盘序列化和反序列化等操作。RDD可以指定策略,能不写入的到磁盘的就不写入。总结起来,MR经常和磁盘交互,中间结果不复用,导致中途做很多无用功。
二、RDD概念
RDD,residenta distributed dataset,弹性分布式数据集
1)数据集
如果你熟悉数据库,那么RDD从表现形式上讲最类似于数据库的视图(View)去除这个RDD在物理结构上的特色,单从逻辑上的表现来说,他就是一个数据集合。什么是数据集合?可以理解为Java中的一个list,或者是数据库里的一张表(或者视图)等等。既然是一张表,我们可以理解Spark对RDD的操作,其实类似于SQL里面对表的一些操作。每个RDD有5个主要的属性:
·一组分片(partition),即数据集的基本组成单位
·一个计算每个分片的函数
·对parent RDD的依赖,这个依赖描述了RDD之间的lineage
·对于key-value的RDD,一个Partitioner
·一个列表,存储存取每个partition的preferred位置。对于一个HDFS文件来说,存储每个partition所在的块的位置。
2)弹性
最开始的时候我说RDD最类似数据库的视图,那为什么是视图而不是表呢?这就要说说RDD里面的这个R(弹性),什么叫弹性呢,就是一个RDD的数据并不一定是物理上真是存在的,注意是不一定,就像数据库里的视图(view),只有你在query的时候他才会真正计算出这些数据。RDD里的数据也一样,比如一张全是大写地名的表-- {S: SHANGHAI, BEIJING, ...},可能在RDD里是这样一种形式 {S = S1:{Shanghai, BEIJing, ...}. toUPPERcase }. 前面提到的两个数集合在物理上的内容其实是不一样的,但是你能看到的两个集合是一样的。在Spark里面,类似于toUPPERcase 这样的操作我们叫算子。好了,这样你就理解了这个R,也是RDD最难懂的一个地方。
3)分布式
再说说中间的那个D(分布式),这个很好理解,就是一个数据集分别放在几个机器上,而RDD只要存储这些数据的元信息(如那一片在哪个机器上)即可。这样也就不难理解之前“仲晟”的回答:“RDD,包含一组分区列表(实际上是分区到block的映射,具体数据可以是分布式的存储在HDFS各个节点上)以及一组transformation或action算子等。”
4)容错
不过这样解释似乎缺了些什么,就是为什么RDD要如此麻烦呢?这里我说最明显的两个亮点。1,容错:比如你有一个表,里面是一个公司12个月的平均销售额,存储在12个机器上,突然存储8月数据的机器坏了,那么你通常选择的做法是把整一年的销售资料拿出来,再以月份分组,再把8月的算出来,存在一个好的机器里。而RDD存储8月的数据可能就是(select avg(sales)from t where month = 8) ,在你需要的时侯,如果发现8月数据不在了,可以自动从原数据里把这个数据恢复出来。(这个例子并不是特别真实,只不过很简单的帮你理解容错这个特性)。
5)执行效率优化
一个优点是执行效率优化。假设有这么一个情况,有一个数据表,先把里面的数据都+1,再-1,再+1,再-1.这样显然数据应该都是不变的。如果你每次都把这个数据表都算出来,这样就要执行4次O(n)效率的查找。然而用RDD的思路,{S'} = {S}+1-1+1-1 => {S'} = {s} + 0, 这样就大大提高了效率。(同样这个例子很弱智,但是能帮助你理解RDD为什么要用数据+算子的形式去描述一个数据集).
在所有解释中我忽略了Spark平台,HDFS等因为穿在一起真的很难讲的通俗易懂。只是尽可能的用大白话来讲。若要深入了解还需要结合Spark的运行机制,Hadoop的HDFS,Scala的语法共同来理解RDD这样东西。
【spark 深入学习 03】Spark RDD的蛮荒世界的更多相关文章
- Spark菜鸟学习营Day3 RDD编程进阶
Spark菜鸟学习营Day3 RDD编程进阶 RDD代码简化 对于昨天练习的代码,我们可以从几个方面来简化: 使用fluent风格写法,可以减少对于中间变量的定义. 使用lambda表示式来替换对象写 ...
- 【Spark 深入学习 07】RDD编程之旅基础篇03-键值对RDD
--------------------- 本节内容: · 键值对RDD出现背景 · 键值对RDD转化操作实例 · 键值对RDD行动操作实例 · 键值对RDD数据分区 · 参考资料 --------- ...
- spark SQL学习(spark连接 mysql)
spark连接mysql(打jar包方式) package wujiadong_sparkSQL import java.util.Properties import org.apache.spark ...
- 【spark 深入学习 05】RDD编程之旅基础篇-01
---------------- 本节内容 1.RDD的工作流程 2.WordCount解说 · shell版本WordCount · java版本WordCount -------------- ...
- 【spark 深入学习 06】RDD编程之旅基础篇02-Spaek shell
--------------------- 本节内容: · Spark转换 RDD操作实例 · Spark行动 RDD操作实例 · 参考资料 --------------------- 关于学习编程方 ...
- spark SQL学习(spark连接hive)
spark 读取hive中的数据 scala> import org.apache.spark.sql.hive.HiveContext import org.apache.spark.sql. ...
- 【原】Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令
<Learning Spark>这本书算是Spark入门的必读书了,中文版是<Spark快速大数据分析>,不过豆瓣书评很有意思的是,英文原版评分7.4,评论都说入门而已深入不足 ...
- Spark菜鸟学习营Day1 从Java到RDD编程
Spark菜鸟学习营Day1 从Java到RDD编程 菜鸟训练营主要的目标是帮助大家从零开始,初步掌握Spark程序的开发. Spark的编程模型是一步一步发展过来的,今天主要带大家走一下这段路,让我 ...
- Spark学习笔记3——RDD(下)
目录 Spark学习笔记3--RDD(下) 向Spark传递函数 通过匿名内部类 通过具名类传递 通过带参数的 Java 函数类传递 通过 lambda 表达式传递(仅限于 Java 8 及以上) 常 ...
随机推荐
- poj 1160 Post Office 【区间dp】
<题目链接> 转载于:>>> 题目大意: 一条高速公路,有N个村庄,每个村庄均有一个唯一的坐标,选择P个村庄建邮局,问怎么选择,才能使每个村庄到其最近邮局的距离和最小?最 ...
- window下mongodb安装和配置
mongodb安装和配置 1.下载:https://www.mongodb.com 2.解压到盘的根目录下,本人解压到D盘根目录 3.在软件根目录下新建一个文件夹data 4.再新建两个文件夹db.l ...
- Python + Selenium + AutoIt 模拟键盘实现另存为、上传、下载操作详解
前言 在web页面中,可以使用selenium的定位方式来识别元素,从而来实现页面中的自动化,但对于页面中弹出的文件选择框,selenium就实现不了了,所以就需引用AutoIt工具来实现. Auto ...
- vue-particles粒子动画效果
1.安装vue-particles依赖包 npm install vue-particles --save-dev 2.在main.js文件中引入并使用 import Vue from 'vue' i ...
- 水晶报表Win10(64bit)VS2013安装成功
windows 10 64 VS2013安装 CR For VS 13_0_18 安装过程没有报错 安装成功http://downloads.businessobjects.com/akdlm/cr4 ...
- 深入学习webpack
webpack配置是标准的Node.js CommonJS模块,webpack中的绝对路径指"/src/css/file",相对路径指"../css/file" ...
- 618大促微服务、web、redis等的超时时间
1. 最近因为大促原因线上服务不稳定,不稳定主要是redis经常超时并且数据为定时mGet方式获得 节点一多,所有服务节点同时获取数据访问量变大导致get取数据变慢因mGet会对数据进行锁住操作, 此 ...
- BZOJ.1009.[HNOI2008]GT考试(KMP DP 矩阵快速幂)
题目链接 设f[i][j]为当前是第i位考号.现在匹配到第j位(已有j-1位和A[]匹配)的方案数 因为假如当前匹配j位,如果选择的下一位与A[j+1]不同,那么新的匹配位数是fail[j]而不是0, ...
- POJ.3537.Crosses and Crosses(博弈论 Multi-SG)
题目链接 \(Description\) 有一个一行n列的棋盘,每个人每次往上放一个棋子,将三个棋子连在一起的人赢.问是否有必胜策略. \(Solution\) 首先一个人若在\(i\)处放棋子,那么 ...
- SpringMybatisMapper
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" ...