020 RDD的理解
一:源码介绍RDD
1.RDD介绍
五大特性,保证了Spark的扩展性,容错性等特性。
A list of partitions ====> 一个许多分区的集合,分区中包含数据
A function for computing each split ===> 为每个分区提供一个computing的函数
A list of dependencies on other RDDs ===> RDD会依赖其他RDDs, 这种特性叫做:lineage(生命线);特例:第一个RDD不依赖其他RDD,这个特性解决容错性
Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned) Key-Value的RDD存在一个分区器,默认是Hash分区器;分区器的作用类型MR中的Partitioner,决定上一个RDD中的数据到下一个RDD的时候是在那个分区中
Optionally, a list of preferred locations to compute each split on (e.g. block locations foran HDFS file) 数据计算本地化操作,类似MR
发现,分块后仍然是单独运算。
2.对应的五个方法
protected def getPartitions: Array[Partition]: ===> 获取当前RDD所有的分区
def compute(split: Partition, context: TaskContext): Iterator[T] ===> 对每个分区上的数据进行计算操作
protected def getDependencies: Seq[Dependency[_]]: ===> 获取依赖的RDD,依赖的RDD是一个集合
protected def getPreferredLocations(split: Partition): Seq[String] ===> 数据计算本地化专用
val partitioner: Option[Partitioner] ===> 获取分区器
二:扩张讲解
1.textFile
使用处:sc.textFile("path")
从源码中可以看到:
1.textFile函数返回的RDD最少2个分区,另一个是自己实现。
2.textFile底层调用hadoopFile函数
3.hadoopFile底层使用MapReduce旧的API读取给定path路径的数据(org.apache.hadoop.mapred.InputForamt)
4.读取HDFS文件返回的RDD具体类型是:HadoopRDD
2.hadoopRDD
关于textFile返回的RDD的讲解。
从源码中可以看到在hadoopRDD有许多函数,但是主要的函数还是下面的三个:
1.getPartitions: 使用InputFromat返回的InputSplit集合构建HadoopRDD的分区对象
2.compute:根据输入的HadoopRDD分区对象还原成为InputSplit对象,使用InputFormat的getRecordReader函数获取具体的数据读取器,并返回一个迭代器
3.getPreferredLocations:依据inputsplit对象的getLocations获取最优节点的hostname信息
3.MapPartitionsRDD
从源码中可以看到以下信息:
1.所有的参数/函数都依赖父RDD
例如:compute函数:
最终会调用第一个RDD的compute函数,这个函数依旧依赖父RDD
三:RDD创建
1.RDD构建
RDD的构建依赖于MapReduce的InputFormat类,默认使用旧的API
sc.hadoopRDD ===> 给定旧的API读取HDFS数据
sc.newAPIHadoopRDD ===> 给定使用新的InputFormat API读取HDFS上的数据
2.RDD的意思
弹性分布式数据集。
Resilient Distributed Dataset (RDD)
Spark中最基本的一个抽象
3.RDD创建方式(两种)
第一种方式:
作用:主要用于测试
序列化已经存在的一个scala的集合产生RDD
val data = Array(1, 2, 3, 4, 5)
val distData = sc.parallelize(data)
distData.map(v => (v%2,1)).reduceByKey(_+_).collect()
第二种方式
作用:生成环境中使用
读取存储在外部数据源中的数据并形成RDD返回
val distFile = sc.textFile("data.txt")
官网说法:
四:RDD函数讲解与使用
1.RDD函数类型
Transformation(算子):(在Driver中执行)
执行策略是Lazy
从一个RDD产生一个新的RDD, RDD[T] ==> RDD[U]
当一个RDD调用transfromation类型的函数的时候,只是在内部构建了一个DAG的执行图(基于RDD的依赖),当RDD被触发的时候,DAG执行图开始执行
Action(算子): (在Executors中执行)
立即执行。
当一个RDD产生的结果不是RDD的时候,认为是一个Action(动作), RDD[T] ==> OtherType
Action动作的执行会导致在transformation过程中构建的DAG图被执行(被提交到运行节点上去执行)
Spark的job的提交运行最终由SparkContext中的runJob函数负责,会将RDD构建的DAG执行图进行一系列的划分,最终提交到Executors中执行任务
Persist:
不是立即执行的,但是unPersist是立即执行的。
将RDD中的数据进行持久化或者反持久化操作
持久化级别(StorageLevel):RDD默认是内存
2.persist的类型(StorageLevel类中)
val NONE = new StorageLevel(false, false, false, false)
val DISK_ONLY = new StorageLevel(true, false, false, false)
val DISK_ONLY_2 = new StorageLevel(true, false, false, false, 2)
val MEMORY_ONLY = new StorageLevel(false, true, false, true)
val MEMORY_ONLY_2 = new StorageLevel(false, true, false, true, 2)
val MEMORY_ONLY_SER = new StorageLevel(false, true, false, false)
val MEMORY_ONLY_SER_2 = new StorageLevel(false, true, false, false, 2)
val MEMORY_AND_DISK = new StorageLevel(true, true, false, true)
val MEMORY_AND_DISK_2 = new StorageLevel(true, true, false, true, 2)
val MEMORY_AND_DISK_SER = new StorageLevel(true, true, false, false)
val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, false, 2)
val OFF_HEAP = new StorageLevel(false, false, true, false)======>(分布式文件系统)
3.persist的方法
是lazy的,只有当有action被触发的时候,才会进行持久化操作;
RDD执行的时候,会从持久化的RDD中读取数据,不会重新执行父RDD的代码逻辑
cache:内部调用persist
persist: 内部调用persist(MEMORY_ONLY)
persist(StorageLevel): 给定级别进行RDD数据缓存,要求这个RDD没有进行过缓存
反持久化:立即执行的
unpersist: 删除持久化的数据
持久化:
当调用cache函数进行持久化操作的时候,如果内存不够,不会cache所有数据,只会cache一部分数据(按照分区进行cache的)
4.持久化的级别
持久化的级别一般选择为:
MEMORY_ONLY
MEMORY_ONLY_SER
MEMORY_AND_DISK
除非数据不能丢失,而且计算过后,父RDD没法重新计算数据的,在RDD缓存的时候,才使用X2的级别
5.注意点
一般在RDD不使用的时候,要调用unpersist函数进行持久化的RDD删除
6.RDD API
map: 转换,按条进行数据转换
flatMap: 转换+结果扁平化
filter:过滤数据
mapPartitions:转换,按分区进行分区的数据转换
repartition:重置分区,内部调度coalesce
coalesce:重置分区;当分区数量减少的时候,可以将参数shuffle设置为false,与上面的不同之处在于有shuffle参数
distinct:去重用
reduceByKey:按照key进行聚合,聚合后类型和RDD的V类型必须一样
aggregateByKey:按照key进行聚合,聚合后类型和RDD的V类型可以不一样
groupByKey:按照Key进行数据聚合,防止出现OOM异常
sortByKey: 按照key进行数据排序
zip: 拉链操作,将两个RDD合并
zipPartitions:zip底层实现,按照分区进行RDD的合并
zipWithIndex:RDD的数据和序列号进行拉链操作及合并
zipWithUniqueId:RDD和一个唯一的id进行拉链操作
foreach: 对每条数据进行操作,一般不用
foreachPartition: 对每个分区的数据进行操作,常用
top:获取topN
take:获取前多少个
saveXXXX: 将数据通过Hadoop的OutputFormat类进行数据输出
7.Transformation的API
8.action的API
五:spark快的原因
1.spark快的原因
SparkRDD不进行cache操作,后面的操作也比前面的操作快,原因是(第二次执行比第一次快):Spark对将job的执行缓存一段时间(缓存到磁盘/内存),当第二次执行的时候,会自动从磁盘/内存中获取,不需要重新执行父RDD的代码逻辑
2.RDD内部逻辑结构
除了可以从内部结构上看,也可以从源码中知道,会使用最近的盘计算。
020 RDD的理解的更多相关文章
- Spark学习之RDD的理解
转自:http://www.infoq.com/cn/articles/spark-core-rdd/ 感谢张逸老师的无私分享 RDD,全称为Resilient Distributed Dataset ...
- 【原】Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令
<Learning Spark>这本书算是Spark入门的必读书了,中文版是<Spark快速大数据分析>,不过豆瓣书评很有意思的是,英文原版评分7.4,评论都说入门而已深入不足 ...
- Spark RDD到底是个什么东西
前言 用Spark有一段时间了,但是感觉还是停留在表面,对于Spark的RDD的理解还是停留在概念上,即只知道它是个弹性分布式数据集,其他的一概不知 有点略显惭愧.下面记录下我对RDD的新的理解. 官 ...
- Spark RDD、DataFrame原理及操作详解
RDD是什么? RDD (resilientdistributed dataset),指的是一个只读的,可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用. RDD内部可以 ...
- Spark RDD深度解析-RDD计算流程
Spark RDD深度解析-RDD计算流程 摘要 RDD(Resilient Distributed Datasets)是Spark的核心数据结构,所有数据计算操作均基于该结构进行,包括Spark ...
- Spark弹性分布式数据集RDD
RDD(Resilient Distributed Dataset)是Spark的最基本抽象,是对分布式内存的抽象使用,实现了以操作本地集合的方式来操作分布式数据集的抽象实现.RDD是Spark最核心 ...
- 深入浅出理解EdgeBoard中NHWC数据格式
摘要: 在深度学习中,为了提升数据传输带宽和计算性能,经常会使用NCHW.NHWC和CHWN数据格式,它们代表Image或Feature Map等的逻辑数据格式(可以简单理解为数据在内存中的存放顺序) ...
- Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令
<Learning Spark>这本书算是Spark入门的必读书了,中文版是<Spark快速大数据分析>,不过豆瓣书评很有意思的是,英文原版评分7.4,评论都说入门而已深入不足 ...
- Spark RDD初探(一)
本文概要 本文主要从以下几点阐述RDD,了解RDD 什么是RDD? 两种RDD创建方式 向给spark传递函数Passing Functions to Spark 两种操作之转换Transformat ...
随机推荐
- python的安装和pycharm的安装
下载地址 官网:https://www.python.org/downloads/release/python-372/ Window 平台安装 Python: Add python xx to ...
- HDU2444 The Accomodation of Students【匈牙利算法】
题意: 有n个学生,有m对人是认识的,每一对认识的人能分到一间房,问能否把n个学生分成两部分,每部分内的学生互不认识,而两部分之间的学生认识.如果可以分成两部分,就算出房间最多需要多少间,否则就输出N ...
- POJ3694 Network【连通分量+LCA】
题意: 一个无向图可以有重边,下面q个操作,每次在两个点间连接一条有向边,每次连接后整个无向图还剩下多少桥(注意是要考虑之前连了的边,每次回答是在上一次的基础之上). 思路: 首先运行一次Tarjan ...
- v4l2功能列表大全【转】
一,功能参考 目录 V4L2 close() - 关闭一个V4L2设备 V4L2 ioctl() - 创建的V4L2设备 ioctl VIDIOC_CROPCAP - 视频裁剪和缩放功能信息 ioct ...
- C# 实现UDP打洞通信(一)
最近研究了一下网络打洞的相关技术,TCP的方式据说可行性不高,各种困难,因此决定采用UDP(UDP是什么就不解释了)的方式. 原理: 我们都知道局域网内的主机想要访问外网的服务器是比较容易的,比如浏览 ...
- 安装jdk的时候为什么会有两个jre文件
有些东西,你懂不懂其实并不太影响你干活,但有些人就是有疑惑就非得弄懂,不然浑身难受,我大概就是这种德性的.昨天安装javaSE的时候,看到jdk中有个jre文件夹,而根目录下又有个jre文件夹,非常困 ...
- Android主题切换
一.APK文件方式:(CM9方案) 我们知道Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户的(Android 系统是基于Linux) ...
- kerberos介绍
重要术语 1. KDC 全称:key distributed center 作用:整个安全认证过程的票据生成管理服务,其中包含两个服务,AS和TGS 2. AS 全称:authentication s ...
- PHP导出CVS格式文件
$csvContent="csvzero,csvone,csvtwo,csvthree,csvfour,csvfive"; header("Content-Type: a ...
- linux unzip 中文乱码解决方法
引自:https://blog.csdn.net/abyjun/article/details/48344379 unzip -O CP936 xxx.zip (用GBK, GB18030也可以)