1.Spark 数据倾斜的解决方案
发生现象:绝大多数task非常快,个别task执行慢。
发生原理:进行shuffle时,必须将各个节点上相同的key拉取到某个节点上的一个task进行处理,按照key进行聚合或者join操作,若某个key的数据量特别大,就会发生数据倾斜
解决思路:拆---合
总体发生倾斜概括: join group by count(distinct)
MapReduce hash(key)%numReduce
Spark Task 默认重试三次===》然后发生数据倾斜
定位数据倾斜:
通过spark web Ui 查看报错的那个stage 的各个task 的运行时间以及分配的数据量,才能确定是否是由于数据倾斜导致的内存溢出。
查看导致数据倾斜的key的数据分布情况
rdd.CountByKey() 统计出各个Key出现的次数Collect/take到客户端 打印一下。
a)少数几个key导致数据倾斜,且字段不参与业务统计,可以直接过滤掉 1%
select domain ,count(distinct domain) from tb where domain !=null group by domain
b)提高shuffle操作的并行度 2%
没有改变数据分布情况,只是减少每个task处理的数据量
思路:可以将原本分配给一个task的多个key分配给多个 task,从而让每个task处理比原来更少的数据,举例来说,如果原本5个key,每个key对应10条数据,这5个key都是分配给一个task的,那么这个task就要处理50条数据,而增加了shuffle read task 以后,每个task就分配到一个key,即每个task处理10条数据。
c)两阶段聚合(局部聚合 全局聚合) group by 50%
实现思路:第一次局部聚合,先给每个key打一个随机数,比如10以内的随机数,此时原先一样的key就变得不一样了,比如
(hello,1)(hello,1),(hello,1)就会变成(1_hello,1),(2_hello,2),接着对打上随机数后的数据进行reduceByKey等聚合操作进行局部聚合,变成(1_hello,1),(2_hello,2),然后将各个key的前缀丢掉,就会变成(hello,2),(hello,3),再进行全局聚合,得到结果。
2.Spark源代码阅读过没
3 spark reducebykey groupbykey
4 repartition coalesce区别
5 spark streaming+kafka 2.4.0之下 bug
版本多少?官网的1:1看过没有 什么意思?offset如何管理?
消费语义选择哪种?多少秒一个批次?一个批次处理多少条数据
一个批次处理时间多少?
怎样监控job的是否有堆积消息 batch未处理?
假如mysql-->kafka--有序数据 请问如何保证spark streaming消费全局有序?
6 Spark Sql 外部数据源哪几种?源代码看过没?如何自定义外部数据源?
7 Structured streaming 的流join流
8 Structured streaming的水印 watermark了解吗
9 flink 如何保证Exactly-once state