解析:
1)基于Receiver的⽅式
这种⽅式使⽤Receiver来获取数据。Receiver是使⽤Kafka的⾼层次Consumer API来实现的。receiver从Kafka中获取的数据都是存储在Spark Executor的内存中的,然后Spark Streaming启动的job会
去处理那些数据。
www.aboutyun.com/thread-24246-1-1.html 12/57
2019/4/24 spark相关的⾯试题跟答案,带着问题学习效果更佳哟。?)-⾯试区-about云开发
2)基于Direct的⽅式
这种新的不基于Receiver的直接⽅式,是在Spark 1.3中引⼊的,从⽽能够确保更加健壮的机制。替代掉使⽤Receiver来接收数据后,这种⽅式会周期性地查询Kafka,来获得每个topic+partition的最
新的offset,从⽽定义每个batch的offset的范围。当处理数据的job启动时,就会使⽤Kafka的简单consumer api来获取Kafka指定offset范围的数据
解析:
1)前提是定位数据倾斜,是OOM了,还是任务执⾏缓慢,看⽇志,看WebUI
2)解决⽅法,有多个⽅⾯
· 避免不必要的shuffle,如使⽤⼴播⼩表的⽅式,将reduce-side-join提升为map-side-join
·分拆发⽣数据倾斜的记录,分成⼏个部分进⾏,然后合并join后的结果
·改变并⾏度,可能并⾏度太少了,导致个别task数据压⼒⼤
·两阶段聚合,先局部聚合,再全局聚合
·⾃定义paritioner,分散key的分布,使其更加均匀
详细解决⽅案参考博⽂《Spark数据倾斜优化⽅法》
解析:
1).使⽤程序中的集合创建rdd
2).使⽤本地⽂件系统创建rdd
3).使⽤hdfs创建rdd,
4).基于数据库db创建rdd
5).基于Nosql创建rdd,如hbase
6).基于s3创建rdd,
7).基于数据流,如socket创建rdd
如果只回答了前⾯三种,是不够的,只能说明你的⽔平还是⼊⻔级的,实践过程中有很多种创建⽅式。
解析:
答:spark并⾏度,每个core承载2~4个partition,如,32个core,那么64~128之间的并⾏度,也就是
设置64~128个partion,并⾏读和数据规模⽆关,只和内存使⽤量和cpu使⽤
时间有关
解析:
www.aboutyun.com/thread-24246-1-1.html 13/57
2019/4/24 spark相关的⾯试题跟答案,带着问题学习效果更佳哟。?)-⾯试区-about云开发
答:每个数据分⽚都对应具体物理位置,数据的位置是被blockManager,⽆论
数据是在磁盘,内存还是tacyan,都是由blockManager管理