【Spark】(二) Spark Core

一、数据结构——RDD

什么是RDD?

  RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。

RDD的属性

1)一组分区(Partition),即数据集的基本组成单位;
2)一个计算每个分区的函数;
3)RDD之间的依赖关系;
4)一个Partitioner,即RDD的分片函数;
5)一个列表,存储存取每个Partition的优先位置(preferred location)。

特点

二、RDD实现World Count

Spark: World Count

//读本地文件
val rdd = sc.textFile("file:///opt/soft/data/e.txt")
//读hdfs上文件
val rdd = sc.textFile("hdfs://192.168.56.171:9000/wc/e.txt")
//world Count
rdd.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect

三、算子

1、转化算子transcation

1)map
2)mapPartitions
3)reduceByKey
4)aggregateByKey
5)combineByKey

2、动作算子action

1)reduce:
2)collect:
3)first:
4)take:
5)aggregate:
6)countByKey:
7)foreach:
8)saveAsTextFile:

3、引起shuffle过程的Spark算子

reduceByKey:
groupBykey:
各种Bykey
reduceByKey:按照 key 进行聚合,在 shuffle 之前有 combine(预聚合)操作,返回结
果是 RDD[k,v]。
groupByKey:按照 key 进行分组,直接进行 shuffle。
建议使用reduceByKey

四、宽窄依赖

  依赖关系: RDD只支持粗粒度转换,即在大量记录上执行的单个操作。将创建RDD的一系列Lineage(血统)记录下来,以便恢复丢失的分区。RDD的Lineage会记录RDD的元数据信息和转换行为,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。
  宽依赖: 宽依赖指的是多个子RDD的Partition会依赖同一个父RDD的Partition,会引起shuffle,宽依赖我们形象的比喻为超生。
像map,filter,union等
  窄依赖: 窄依赖指的是每一个父RDD的Partition最多被子RDD的一个Partition使用,窄依赖我们形象的比喻为独生子女.
像join,groupByKey,reduceByKey

任务划分:
RDD任务切分中间分为:Application、Job、Stage和Task
1)Application:初始化一个SparkContext即生成一个Application
2)Job:一个Action算子就会生成一个Job
3)Stage:根据RDD之间的依赖关系的不同将Job划分成不同的Stage,遇到一个宽依赖则划分一个Stage。
4)Task:Stage是一个TaskSet,将Stage划分的结果发送到不同的Executor执行即为一个Task。
PS: Application->Job->Stage->Task每一层都是1对n的关系

五、RDD缓存

1、级别

在这里插入图片描述
  RDD通过persist方法或cache方法可以将前面的计算结果缓存,默认情况下 persist() 会把数据以序列化的形式缓存在 JVM 的堆空间中。

2、cache()、persist()、checkpoint()区别

cache()&persist()
cache和persist的区别:cache只有一个默认的缓存级别MEMORY_ONLY ,而persist可以根据情况设置其它的缓存级别。
checkpoint()
检查点的机制,检查点(本质是通过将RDD写入Disk做检查点)是为了通过lineage做容错的辅助,lineage过长会造成容错成本过高,这样就不如在中间阶段做检查点容错,如果之后有节点出现问题而丢失分区,从做检查点的RDD开始重做Lineage,就会减少开销。在checkpoint的过程中,该RDD的所有依赖于父RDD中的信息将全部被移除。对RDD进行checkpoint操作并不会马上被执行,必须执行Action操作才能触发。

六、广播变量和累加器

广播变量常用来高效分发较大的对象,而累加器用来对信息进行聚合。

1、广播变量

使用原则
1)不能将RDD用做变量广播出去,RDD是不存储数据的,可以将RDD的结果广播出去。
2)广播变量只能在Driver端定义,不能在Executor端定义,Executor端只能使用。
3)广播变量的值只能在Driver端修改,在Executor端不能修改
使用场景
日常工作中对来访url、ip等过滤业务,就可以使用广播变量

2、累加器

使用原则
累加器在Driver端定义赋初始值,累加器只能在Driver端读取,在Excutor端更新。
使用场景
对来源的访客进行统计

发布了27 篇原创文章 · 获赞 19 · 访问量 1285

猜你喜欢

转载自blog.csdn.net/weixin_42804692/article/details/105708249
今日推荐