Spark
spark出现的契机:
Hadoop设计中在进行数据计算的时候要进行频繁的数据落地,因此出现磁盘IO瓶颈,在这种情况下,内存计算应运而生,spark的优势就是内存计算,在牺牲一部分内存的情况下,提高的效率是非常合算的
1. Spark的特点:
- 他是由scale编写,底层基于actor的模式akka框架,代码简洁
- 基于DAG(有向无环图)的执行引擎,减少了计算时频繁将数据写入到磁盘中,降低磁盘IO
- 同时建立在RDD(弹性分布式数据集)上,可以以一致的结构应对不同的大数据处理请求
- RDD(弹性分布式数据集,Resilient Distributed Dataset)是spark处理数据的基础,和统一的数据结构,本质上是一种分布式数据结构
- 提供Cache机制来实现数据缓冲进一步提升性能
- Spark的生态圈也越来越丰富
- 支持多种语言Java、Python、Scala、R
- 同时兼容HDFS作为存储结构,可以使用YARN作为协调框架
2. RDD(弹性分布式数据集)
RDD,是Spark的核心抽象,表示用于并行计算,不可修改,对数据集合进行分区的分布式数据结构。不同来源的数据都可以经过变换变为RDD再进行Spark处理
RDD数据集全部或者部分缓冲到内存中,多次计算简重用。也是Spark的一个特殊的集合,再整个Spark计算中均是进行分布式计算
主要组成部分:
1. 数据分片
2. 计算函数
3. RDD依赖(RDD的数据血缘关系),在数据处理过程中出现宕机的情况,可以根据RDD依赖进行数据的恢复,保证数据的安全
sc.parallelize(List(1,2,3))
sc.parallelize(List(1,2,3),2)
val rdd = sc.parallelize(List(1,2,3,4),2)
sc.collect
//查看spark分区结构
import org.apache.spark.rdd.RDD
import scala.reflect.ClassTag
object su{
def debug[T:ClassTag](rdd:Rdd[T])={
rdd,mapPartitionsWithIndex((i:Int,iter:Iterator[T])=>{
val m = scala.collection.mutable.Map[Int,List[T]]()
var list = List[T]()
while(iter.hasNext){
list = list :+ iter.next
}
m(i) = list
m.iterator
}).collect().foreach((x:Tuple2[Int,List[T]])=>{
val i = x._1
println(s"partition:[$i]")
x._2.foreach{println}
})
}
}
3.Spark中RDD的解析
- RDD 的分类:
- PairRDD
键值对类型的RDD
提供的方法:
1. aggregateByKey(zeroValue)(func1,func2)
zeroValue表示初始值,初始值会参与func1的计算在分区内,按照key值进行分区,把每组的值进行fun1的计算,再将每个分区组的计算结果按fun2进行计算
2. groupByKey
rdd.groupByKey
3. reduceByKey
rdd.reduceByKey
4. join
rdd.join(rdd1)
5. partitionBy
创建RDD是指定分区规则将会导致数据数据自动分区
通过paratitionBy方法进行人为的指定分区
常见的分区器有:
HassParatitioner
RangeParatitioner
import org.apache.spark._
var rdd = sc.makeRDD(List((2,“aaa”),(9,“bbb”),(7,“ccc”),(9,“ddd”),(3,“eee”),(2,“fff”)),2);
rdd.partitionBy(new HashPartitioner(2))
2. RDD
普通类型的RDD
1. 集合之间的操作
distinct 去重
union 并集
intersection 交集
subtract 差集
2. collect 收集
将rdd分布式存储在集群中的不同分区中数据获取到一起形成一个新数组
正常情况下不允许使用
3. take 获取前几个数据
var add = sc.makeRDD(List(12,34,43,43,23,23))
rdd.take(2)
4. takeOrdered(n)
先将rdd中的数据进行升序排序,然后获取前n个
5. top(n)
先将数据进行降序排序然后取前n个
6. map
将函数应用到rdd中每个元素中
7. flatMap
扁平map处理
8. filter
用来iguolu掉rdd中不符合条件的数据
9. cache
可以为rdd设置缓存
rdd.cache()
这样当未来需要重新获取rdd中的数据时 不需要重新创建 直接可以从缓存中得到数据从而提升效率
这个缓存信息可以在spark的ui管理界面中查看到
10. persist
支持压缩,支持选择缓存的位置
11. cartesian
笛卡尔积
12. coalesce(n,true/false)
扩大或者缩小分区
13. repartition(n)
等价于coalesce(n,true/false)
14. count 统计rdd中元素个数
15. countApprox
统计rdd元素个数,计算一个近似值
传入一个毫秒值,时间越长计算精度越高
16. mapPartitions 分别遍历分区做不同的处理
17. saveAsTextFile 按照文本方式保存分区数据
18. textFile 读取文件数据为rdd
19. sortBy 将rdd中的数据经过函数处理根据处理结果原始数据进行排序
20. zip 拉链操作
Spark执行原理
未完待续