Spark 学习笔记

本文介绍了Spark的主要特点,如基于内存计算、DAG执行引擎和RDD数据结构。RDD是Spark处理数据的基础,不可修改且分区的分布式数据结构,支持cache和多种语言。文章详细阐述了RDD的类型、常用操作,如aggregateByKey、reduceByKey和join,并探讨了Spark的执行原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spark

spark出现的契机:
  Hadoop设计中在进行数据计算的时候要进行频繁的数据落地,因此出现磁盘IO瓶颈,在这种情况下,内存计算应运而生,spark的优势就是内存计算,在牺牲一部分内存的情况下,提高的效率是非常合算的

1. Spark的特点:

  1. 他是由scale编写,底层基于actor的模式akka框架,代码简洁
  2. 基于DAG(有向无环图)的执行引擎,减少了计算时频繁将数据写入到磁盘中,降低磁盘IO
  3. 同时建立在RDD(弹性分布式数据集)上,可以以一致的结构应对不同的大数据处理请求
  4. RDD(弹性分布式数据集,Resilient Distributed Dataset)是spark处理数据的基础,和统一的数据结构,本质上是一种分布式数据结构
  5. 提供Cache机制来实现数据缓冲进一步提升性能
  6. Spark的生态圈也越来越丰富
  7. 支持多种语言Java、Python、Scala、R
  8. 同时兼容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的解析

  1. RDD 的分类:
  1. 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执行原理

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值