RDD机制
分布式弹性数据集,简单的理解成一种数据结构,是spark框架上的通用货币
所有算子都是基于rdd来执行的
rdd执行过程中会形成dag图,然后形成lineage保证容错性等
从物理的角度来看rdd存储的是block和node之间的映射
RDD的弹性表现在哪几点?
自动的进行内存和磁盘的存储切换;
基于Lingage的高效容错;
task如果失败会自动进行特定次数的重试;
stage如果失败会自动进行特定次数的重试,而且只会计算失败的分片;
checkpoint和persist,数据计算之后持久化缓存
数据调度弹性,DAG TASK调度和资源无关
数据分片的高度弹性,a.分片很多碎片可以合并成大的,b.par
RDD有哪些缺陷?
不支持细粒度的写和更新操作(如网络爬虫)
spark写数据是粗粒度的,所谓粗粒度,就是批量写入数据 (批量写)
但是读数据是细粒度的也就是说可以一条条的读 (一条条读)
不支持增量迭代计算,Flink支持
什么是RDD宽依赖和窄依赖?
RDD和它依赖的parent RDD(s)的关系有两种不同的类型
窄依赖:每一个parent RDD的Partition最多被子RDD的一个Partition使用 (一父一子)
宽依赖:多个子RDD的Partition会依赖同一个parent RDD的Partition (一父多子)
cache和pesist的区别
cache和persist都是用于缓存RDD,避免重复计算
.cache() == .persist(MEMORY_ONLY)
cache后面能不能接其他算子,它是不是action操作?
可以接其他算子,但是接了算子之后,起不到缓存应有的效果,因为会重新触发cache
cache不是action操作
什么场景下要进行persist操作?以下场景会使用persist
某个步骤计算非常耗时或计算链条非常长,需要进行persist持久化
shuffle之后为什么要persist,shuffle要进性网络传输,风险很大,数据丢失重来,恢复代价很大
shuffle之前进行persist,框架默认将数据持久化到磁盘,这个是框架自动做的。
rdd有几种操作类型?三种!!
transformation,rdd由一种转为另一种rdd
action
cronroller,控制算子(cache/persist) 对性能和效率的有很好的支持
reduceByKey是不是action?
不是,很多人都会以为是action,reduce rdd是action
collect功能是什么,其底层是怎么实现的?
driver通过collect把集群中各个节点的内容收集过来汇总成结果
collect返回结果是Array类型的,合并后Array中只有一个元素,是tuple类型(KV类型的)的。
map与flatMap的区别
map:对RDD每个元素转换,文件中的每一行数据返回一个数组对象
flatMap:对RDD每个元素转换,然后再扁平化,将所有的对象合并为一个对象,会抛弃值为null的值
列举你常用的action?collect,reduce,take,count,saveAsTextFile等
union操作是产生宽依赖还是窄依赖?
窄依赖
Spark累加器有哪些特点?
全局的,只增不减,记录全局集群的唯一状态
在exe中修改它,在driver读取
executor级别共享的,广播变量是task级别的共享
两个application不可以共享累加器,但是同一个app不同的job可以共享
spark hashParitioner的弊端
分区原理:对于给定的key,计算其hashCode
弊端是数据不均匀,容易导致数据倾斜
RangePartitioner分区的原理
尽量保证每个分区中数据量的均匀,而且分区与分区之间是有序的,也就是说一个分区中的元素肯定都是比另一个分区内的元素小或者大
分区内的元素是不能保证顺序的
简单的说就是将一定范围内的数映射到某一个分区内
Spark中的HashShufle的有哪些不足?
shuffle产生海量的小文件在磁盘上,此时会产生大量耗时的、低效的IO操作;
容易导致内存不够用,由于内存需要保存海量的文件操作句柄和临时缓存信息
容易出现数据倾斜,导致OOM