> 文章列表 > spark

spark

spark

Spark笔记
分区
●1.spark按偏移量按行读取 2.底层使用的是hadoop读取的方法,其不会重复读取一行
●数据源为多个文件,计算分区按文件为单位进行分区
●RDD方法 =>算子
●转换:功能的补充和封装(RDD\\flatMap…)
●行动:触发任务和作业的执行
●算子的由来:认知心理学认为问题的解决是将问题的状态进行改变:
●问题(初始)=》操作operator(算子)=》问题(审核中)=》操作(算子)=》问题(完成)
●RDD分区内是串行顺序执行
●不同分区间,执行顺序是无序的
●mapPartition 类似IO中缓冲流的优化手段,拿到所有分区内数据再执行 ,缺点是不释放内存
●自简化原则
●当函数的代码只有一行时,{}可以省略
●如果参数列表中的参数只有一个,()可以省略
●参数在逻辑中只出现一次且按顺序,可 _ 代替,如 num=>num2 变为 _2
●Nil空迭代器
●distinct实现方式是由分布式map操作得到,而非SET
●各种算子
●groupByKey,分组功能
●reduceByKey聚合,会提前在Map端聚合,性能更好
●aggregatedByKey解决分区内和分区间计算规则不同的问题
●匿名函数闭包检测
●闭包检测:spark运行时涉及到算子内外的数据使用,而算子外是在Driver端,算子内是在Executor端,scala函数式编程会导致算子内经常使用到算子外的数据,形成了闭包的效果,如果算子外的数据无法序列化,那么就无法传值给executor执行,所以在任务执行前先检测闭包内的对象是否可以序列化,即闭包检测。
●如果方法中含有匿名函数,执行时会先做闭包检测是否序列化(closer),则如果没有序列化,在这一步会直接抛出异常,无需等到runjob
●scala tips
●类的构造方法其实是类的成员属性
●spark使用RDD保留血缘关系实现容错机制
●toDebugString()
●dependencies()
●新的RDD的一个分区依赖于旧RDD的一个分区,称为oneTooneDenpendency (窄依赖,继承NarrowDenpendency)
●窄依赖不同RDD之间可以用一个task完成
●新的RDD的一个分区依赖于旧RDD的多个分区,称为shuffle依赖(宽依赖)
●宽依赖不同RDD之间涉及Shuffle,需要分阶段用不同的task完成
●只要有shuffle,就会创建一个新的阶段stage(shuffleMapStage)
●阶段的数量=shuffle依赖数量+ 1(resultStage,只有一个,最后执行)
●任务阶段源码
●任务提交是两条线:一条是计算,一条是资源,互相独立,都准备好了就可以执行了
●一个SparkContext就会有一个Application
●一个行动算子(Action算子)就会有一个Job
●RDD不存储数据,每次collect都会从头开始执行一遍
●解决方法:rdd.cache() 持久化,默认保存数据到内存,在行动算子执行时完成
●cache会在血缘关系中添加新的依赖,一旦出现问题,可以从头执行
●用途:1重用 2数据执行链路长,重要,也可以用
●persists:临时保存在磁盘中,有磁盘IO,作业执行结束就没有了,cache底层调用的也是persists
●checkpoint:需要落盘,一般放在HDFS中,一般会独立执行作业,故增加了资源使用,通常与cache配合使用提高效率
●会切断原有的血缘关系,新建数据源,提高效率
●累加器Acc(分布式共享(多个exe副本)只写(每个exe只能访问自己的,不能访问其它exe,driver可以)累加)
●用来把executor端的变量信息聚合到Driver端 sc.longAccumulator()
●多加:多次执行collect()
●少加:没有执行collect()行动算子
●executor是一个JVM,启动时会分配内存,可以将闭包数据放到executor内存中从而达到共享的目的->广播变量 sc.broadcast()
●applicationMaster:将计算任务和资源解耦
●SQL的两个分支
●SparkSQL是Spark对于结构化数据处理的一个模块
●Hive on Spark
●SparkStreaming
●准实时(秒,分钟),微批量(时间)
●(由RDD所组成的序列)DStream 离散化流 采集器隔一段时间,接受一些RDD,传给Spark-core处理
●WCount
●StreamingContext需要两个参数,第一个参数是环境,第二个参数批量处理的周期(采集周期)
●获取端口数据,socketTextStream
●不能关,不能写 ssc.stop(),main方法完成也会关闭应用程序,所有main方法也不可以停
●故ssc.start()启动采集器 ssc.awaitTermination() 等待采集器关闭
●工作中SparkStream主要与Kafka作对接 KafkaUtils
●LocationStrategies:采集节点与计算节点分配策略
●DS状态转换
●flatmap,map等等都是无状态转换算子
●有状态转换算子updateStatsByKey:第一个参数,相同key的value,第二个参数缓冲区中相同key的value
●使用有状态操作是,需要设定检查点路径
●无状态操作 transform, RDD->RDD RDD套RDD,外层RDD会在Driver端周期性的执行
●无状态 join
●window(第一个参数,第二个参数)无状态 ,多个采集周期当做一个整体计算
●窗口的周期(时长)应是采集周期的整数倍(第1参数)
●窗口可以滑动,默认一个周期进行滑动
●避免重复数据,改变滑动的步长(第2参数)
●有状态reduceBYkeyAndWindow(),当窗口比较大时,可以使用增加和减少函数