RDD
RDD就是一个集合,在使用的时候,就当做为Scala 集合类中List列表
实质
分布式存储数据集合
abstract class RDD [T:ClassTag]
A Resilient(弹性) Distributed(分布式) Dataset(RDD)
Represents(代表) an immutable(不可变) partitoned(分区) 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, fifter,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,//内存
//JVM内存中tachyon(基于内存的分布式文件系统)
private var _useOffHeap:Boolean,
private var _deserializde:Boolean,//反序列化
prvate var _replication:Int = 1) //副本个数
extends Externalizable
RDD 数据的持久化
1)某个RDD数据,被多次使用
重复RDD
2)某个RDD数据来之不易,使用超过一次
经过复杂的处理得到RDD
3)通常选择的策略
MEMORY_ONLY_2 -如果内存足够
MEMORY_AND_DISK_SER_2 -如果内存不够,先内存后磁盘
补充
数据结构RDD(类比于Scala中List)
数据储存在内存中,分区存储(partition)
对数据的处理:调用集合中高阶函数
shuffle
Rdd直接是有依赖的
宽依赖:产生shuffle ,数据会存储在磁盘中
reduceByKey , groupByKey
窄依赖:不会产生shuffle
map, filter , union
这里所讲的shuffle 和我们的MapReduce的shuffle的过程,前面的Task数据将会被打乱,在分发给下一个stage 的各个Task进程处理
spark分析数据3步走
1.读取数据
val inputRDD = sc.textFile (SparkContext)
val inputDF = spark.read.textFile //spark 2.X SparkSession
2.分析数据
inputRDD. Transformation
调用转换函数Transformation函数,都是高级函数
groupby,map,reduceByKey,filter,groupbyKey,flatMap,reduce,sorted,
distinct,union,join
3.结果输出
resultRDD.action
调用动作函数,调用以后不会返回一个RDD,触发一个job执行
第一类action函数:有返回值
返回值,返回给Driver
top、take、first、count、collect
第二类Action函数:无返回值
没有返回值,直接将数据存储到外部文件系统中或者直接控制打印
foreach\saveAsTextFile