Spark的认识(二)
1、主要内容
-
1、掌握RDD底层原理
-
2、掌握RDD常用的算子操作
-
3、掌握RDD的依赖关系
-
4、掌握RDD的缓存机制
-
5、掌握划分stage
-
6、掌握spark任务调度流程
2、RDD概述
2.1 RDD是什么
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。 Dataset:它就是一个集合,集合里面可以存放很多个元素 Distributed:它的数据是分布式存储的,方便于后期进行分布式计算 Resilient:弹性 它表示的含义:rdd的数据是可以保存在内存或者是磁盘中
2.2 RDD的五大属性
(1) A list of partitions 一个分区列表,也就是说一个rdd有很多个分区,分区里面才是真正的数据,而spark任务的执行是以分区为单位,一个分区就对应后期的一个task(线程)。 读取HDFS上数据文件产生的RDD分区数跟block的个数相等, 如果一个文件只有一个block块,它会产生的rdd的分区数是2个(默认最小值就是2) (2) A function for computing each split 作用在每一个分区中的函数 val rdd2=rdd1.map(x=>(x,1)) (3) A list of dependencies on other RDDs 一个rdd会依赖于其他多个rdd,这里就涉及到rdd与rdd之间的依赖关系,后期spark的容错机制就是根据这个特性而来。 (4) Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned) (可选项)对于kv类型的rdd才有分区函数概念(必须要产生shuffle),不是kv类型的RDD它的分区函数是None(就是没有)。分区函数作用:决定了数据会流入到哪里去 spark中有2种分区函数,第一种是基于哈希的hashPartitioner, key.hashcode%分区数=分区号,这个分区函数是默认值。第二种基于范围RangePartitioner (5) Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file) (可选项)一组最优的块的位置列表 表示数据的本地性和数据位置最优 spark在进行任务分配的时候,它会优先考虑存有数据的节点来计算任务。避免出现大量的网络请求。
3、创建RDD
-
1、通过一个已经存在scala集合去创建
-
sc.parallelize(List(1,2,3,4))
-
-
2、读取外部数据源去创建
-
val rdd1=sc.textFile("/words.txt")
-
-
3、通过一个rdd调用对应的方法生成一个新的rdd
-
val rdd2=rdd1.flatMap(_.split(" "))
-
4、RDD的算子分类
-
1、transformation(转换)
-
可以把一个rdd转换生成一个新的rdd,它是延迟加载,不会立即触发整个任务的运行
-
它会记录下rdd上面的转换操作行为
-
比如
-
flatMap map reduceByKey sortBy
-
-
-
2、action (动作)
-
它会触发任务真正的运行
-
collect saveAsTextFile
-
5、通过spark实现点击流日志分析
5.1 统计PV
package demo import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} //TODO:通过spark来实现点击流