RDD是什么
就是一个集合, 在使用的时候,就当做为Scala集合类中List列表
实质
分布式 存储数据 集合
abstract class RDD[T: ClassTag]
A Resilient(弹性) Distributed(分布式) Dataset (RDD)
Represents(代表) an immutable(不可变), partitioned(分区) collection of elements that can be operated(处理) on in parallel(并行)
将数据划分为很多分区(partitioned),不同分区的数据存在在不同的机器里面,每个分区的数据可以被一个Task进程处理分析
This class contains the basic operations available on all RDDs, such as `map`, `filter`, and `persist`
所有的RDD都一些基本的操作,比如map,filter,persist
PairRDDFunctions contains operations available only on RDDs of key-value pairs, such as `groupByKey` and `join`;
RDD中的类型是键值对(二元组),RDD隐式转换PairRDDFunctions,PairRDDFunctions方法我们就可以用,比如有groupByKey,reduceByKey,join
* Internally, each RDD is characterized by five main properties:
* - A list of partitions 分区列表
* - A function for computing each split 每一个分片可以被一个函数处理(并行)
* - A list of dependencies on other RDDs
一个RDD依赖于其他RDD(RDD怎么来)
查看依赖
println(wordCountRDD.toDebugString)
* - Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
可选,如果RDD的值是二元组,你可以指定分区
* - Optionally, a list of preferred(最优) locations to compute each split on (e.g. block locations for an HDFS file)
可选,最优的路径中读取分片数据
RDD创建方式
RDD创建方式
转换函数Tansformation
一个RDD调用函数之后 转换为另外一个RDD
map,filter,reducBykey
action函数
一个RDD调用函数之后,不会转换为一个RDD,触发一个Job的执行
比如
count ->Long
first -> 第一条数据
take ->获取前几条数据
top->获取前几条数据(排序)
foreach ->打印所有的数据
saveAsTextFile ->保存数据到文件
持久化persisitent
def persist(newLevel: StorageLevel)
def unpersist(blocking: Boolean = true)
class StorageLevel private(
private var _useDisk: Boolean, //磁盘
private var _useMemory: Boolean, //内存
private var _useOffHeap: Boolean, //JVM内存中tachyon(基于内存的分布式文件系统)
private var _deserialized: Boolean, 反序列化
private var _replication: Int = 1) //副本个数
extends Externalizable
什么情况下,RDD数据需要进行持久化呢???
(1)某个RDD数据,被多次使用
重复RDD
(2)某个RDD数据来自不易,使用超过1次
经过复杂的处理得到RDD
(3)通常选择的策略
MEMORY_ONLY_2 -如果内存足够
MEMORY_AND_DISK_SER_2 -如果内存不够,先内存后磁盘,