目录
1、RDD属于Spark Core
spark核心:RDD
2、RDD的创建
文件加载
通过SparkContext对象的textFile()读取文件生成RDD
file:///表示读取本地文件
每一行都是RDD的一个元素
hdfs://localhost:9000/也可以简写为/
通过并行集合(数组)创建RDD
调用sc的parallelize方法
3、RDD的操作(Transformation)
当对一个RDD进行Trans操作时只会记录下操作,只有遇到action时才会真正执行程序
filter(func):高阶函数→参数是函数
map(func):一对一的映射
每个元素经过map操作后都生成了新的元素
flatmap(func):
groupByKey():应用于键值对
reduceByKey(func)
对分组得到的值列表再次进行func操作
4、RDD的操作(action)
动作类型操作才会执行真正的计算(包括加载)
count()
统计当前RDD的元素个数
collect()
以数组的方式把执行结果返回到driver端(程序发起的终端)
first()
take(n)
以数组形式返回
reduce(func)
foreach(func)
惰性机制
转换类型操作在遇到动作类型操作时才会进行从头到尾的计算
5、持久化
spark是基于内存的计算
用户可以把可能需要反复使用的数据集持久化到内存中,不持久化就是用完就扔,所以持久化可以大大提升程序运行效率。
两次动作操作导致整个程序被从头到尾计算了两次,数据被重复生成。
缓存的意义:第二次动作操作时只需要去使用第一次动作操作时缓存起来的值,避免重复计算。
?可以解释下图:
Job里有很多stage,stage里有很多task。
每一个动作类型都会生成一个Job
persist():对RDD标记持久化
并不会马上计算生成RDD并把它持久化
只有在遇到动作类型操作时才会真正持久化
.persist(n)
n有多个缓存级别
只放内存(会有新老更替)
其他缓存级别自行百度
移除持久化:unpersist
完整实例:
6、分区(作用和原则)
作用
分区原则
分区数=集群中的CPU核心数目
CPU的核数为8,分区也为8,对应产生8个线程,正好可以处理8个分区。
spark.default.parallelism
本地模式
默认为本地机器CPU的数目
local[N]为N
apache Mesos
没有设置时默认为分区数为8
standalone yarn
集群中所有核心数目总和与该参数的默认值比较,取较大值
7、设置分区的方法
重分区
.repartiton
分区类型
自定义分区方法
继承Partitioner并重写其以下几个方法
根据Key值的最后一位数字,写到不同的文件。
RDD自定义分区类只支持对键值对重分区,所以要把单RDD转成键值对RDD
分区后的文件数目等于分区数
8、综合实例
词频统计