1、Spark有几种部署模式,分别简要论述
2、Spark用什么提交
shell 脚本
3、Spark 提交作业的参数
4、简述Spark架构,以及作业提交的流程
5、如何理解spark中的血统概念
6、简述Spark中的宽窄依赖,以及spark中如何划分stage,每个stage又按照什么决定task的个数?
7、列举Spark中的转换算子,并简述其功能
8、列举Spark中的行动算子,并简述其功能
9、列举一些Spark中能引起shuffle的算子,并简述其功能
10、简述Spark两种核心shuffle的工作流程(未优化的hashshuffle,优化的hashshuffle,sortshuffle,byPassshuffle,tunsten-sortshuffle)
11、spark中groupByKey和reduceByKey的区别
12、repartition 和coalesce的关系和区别
13、简述Spark中共享变量的基本原理和用途
广播变量
累加器
14、当Spark涉及到数据库的操作,如何减少Spark中的数据库连接数
使用foreachPartition算子替代foreach算子
15、简述Spark中RDD,DataFrame,DataSet的区别和联系
16、Spark 中join和left join,left semi join的区别
17、SparkStreaming有哪几种方式消费kafka数据,他们之间的区别是什么?
18、简述SparkSteaming中窗口函数的原理
窗口函数就是在原来定义的 SparkStreaming 计算批次大小的基础上再次进行封装, 每 次计算多个批次的数据, 同时还需要传递一个滑动步长的参数, 用来设置当次计算任务完成 之后下一次从什么地方开始计算。
图中 time1 就是 SparkStreaming 计算批次大小, 虚线框以及实线大框就是窗口的大小, 必须为批次的整数倍。 虚线框到大实线框的距离(相隔多少批次) , 就是滑动步长。
19、手写spark 的wordcount代码(Scala)
val conf: SparkConf = new SparkConf().setMaster("local[* ]").setAppName("WordCount")
val sc = new SparkContext(conf)
sc.textFile("/input")
.flatMap(_.split(" "))
.map((_,1))
.reduceByKey(+)
.saveAsTextFile("/output")
sc.stop()
20、如何使用spark实现topN
21、调优之前和调优之后的性能对比
例如调整 map个数, map 个数之前多少、 之后多少, 有什么提升
21、Spark缓存的级别,以及缓存的操作和释放缓存
22、Spark shuffle默认的并行度
200,也就是reduce的分区数
23、kryo序列化
24、broadcast join的原理以及使用场景
25、控制spark shuffle过程中的缓冲区大小,map阶段和reduce阶段
两个参数:
spark.reducer.maxSizeInFilght reduce端缓冲区大小,默认值是48M
spark.shuffle.file.buffer map端的缓冲区大小,默认是32kb
26、SparkStreaming 第一次运行不丢失数据
kafka 参数 auto.offset.reset 参数设置成 earliest 从最初始偏移量开始消费数据
27、SparkStreaming 精准一次消费
28、SparkStreaming控制每秒消费的速度
29、SparkStreaming 背压机制
把 spark.streaming.backpressure.enabled 参数设置为 ture,开启背压机制后 Spark Streaming 会 根据延迟动态去 kafka 消费数据,上限由 spark.streaming.kafka.maxRatePerPartition 参数控制, 所以两个参数一般会一起使用