前言
上篇文章给大家分享了前10个spark的企业面试题2020年最新Spark企业级面试题【上】,今天后续来了,来分享剩下的那个几个面试题。也祝大家找到自己喜欢的工作,一起加油,编写不易 请给老哥一个一键三连
吧。
一、手写Spark-WordCount
在这里就有好多小伙吧说了,手写wordCount不简单吗?一点逻辑都没有,虽然你在idea中写的非常熟练,但是真到了面试的时候就有好多小伙伴写不出来了,往往越简单越容易忽视
。
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()
二、如何使用Spark实现TopN的获取(实现思路)
方式一、
- 按照key对数据进行聚合(groupByKey)
- 将value转换为数组,利用scala的sortBy或者sortWith进行排序(mapValues)数据量太大,会OOM。
方式二、
- 取出所有的key
- 对key进行迭代,每次取出一个key利用spark的排序算子进行排序
方式三、
- 自定义分区器,按照key进行分区,使不同的key进到不同的分区
- 对每个分区运用spark的排序算子进行排序
三、Spark中的数据倾斜
Spark中的数据倾斜,包括Spark Streaming和Spark Sql,表现主要有下面几种:
- Executor lost,OOM,Shuffle过程出错;
- Driver OOM
- 单个Executor执行时间特别久,整体任务卡在某个阶段不能结束;
- 正常运行的任务突然失败;
四、数据倾斜产生原因
当在做数据运算的时候会涉及到,count
distinct
、group by
、join on
等操作,这些都会触发Shuffle动作。一旦触发Shuffle
,所有相同key的值就会被拉到一个或几个Reducer节点上,容易发生单点计算问题,导致数据倾斜
。一般来说,数据倾斜原因有以下几方面:
- key分布不均匀
- 业务数据激增 比如订单场景,我们在某一天在北京和上海两个城市多了强力的推广,结果可能是这两个城市的订单量增长了10000%,其余城市的数据量不变。然后我们要统计不同城市的订单情况,这样,一做group操作,可能直接就数据倾斜了。
五、解决数据倾斜思路
很多数据倾斜的问题,都可以用和平台无关的方式解决,比如更好的数据预处理
,异常值的过滤
等。因此,解决数据倾斜的重点在于对数据设计和业务的理解,这两个搞清楚了,数据倾斜就解决了大部分了。
- 业务逻辑 我们从业务逻辑的层面上来优化数据倾斜,比如上面的两个城市做推广活动导致那两个城市数据量激增的例子,我们可以单独对这两个城市来做count,单独做时可用两次MR,第一次打散计算,第二次再最终聚合计算。完成后和其它城市做整合。
- 程序层面先说一个笨方法,抽样统计key的个数,然后将倾斜的过滤掉 1.对聚合类算子进行两次操作,第一次给key加上一个随机数,然后聚合一次,第二次将加上的随机数取消掉再聚合一次 2.将reduce Join转换成 map join 将小表广播出去,然后再大表操作时,使用map算子获取数据进行合并
- 调参方面Spark都自带了很多的参数和机制来调节数据倾斜,合理利用它们就能解决大部分问题。
- 从业务和数据上解决数据倾斜很多数据倾斜都是在数据的使用上造成的。我们举几个场景,并分别给出它们的解决方案。1、 有损的方法:找到异常数据,比如ip为0的数据,过滤掉 2、 无损的方法:对分布不均匀的数据,单独计算 3、 先对key做一层hash,先将数据随机打散让它的并行度变大,再汇集 4、 数据预处理
六、Spark Streaming精准一次消费
- 手动维护偏移量
- 处理完业务数据后,再进行提交偏移量操作极端情况下,如在提交偏移量时断网或停电会造成spark程序第二次启动时重复消费问题,所以在涉及到金额或精确性非常高的场景会使用事物保证精准一次消费
七、简述SparkStreaming窗口函数的原理
窗口函数就是在原来定义的SparkStreaming计算批次大小的基础上再次进行封装,每次计算多个批次的数据,同时还需要传递一个滑动步长的参数,用来设置当次计算任务完成之后下一次从什么地方开始计算。
八、Spark的内存分布
堆内内存在使用对堆内内存的时候,如果我们设置的堆内内存是2个G,读取的数据也是两个G,然后又来了两个G的数据,这样就会出现OOM内存溢出的情况,因为你处理完2G的数据,空间并不会马上进行GC回收堆外内存这样我们就可以使用堆外内存,也就是物理内存,堆外内存可以精准的申请和释放空间,不需要GC,性能比较高,提升了任务执行的效率。
九、 Spark的落盘场景
- 在shuffle中会进行落盘操作
- shuffle分为shuffle write和shuffle read
- 在这期间会进行一个数据落盘的操作
十、怎样避免SparkOOM
- 使用mapPartitions代替大部分map操作,或者连续使用的map操作
- broadcast join和普通join
- 先filter在join
- partitonBy优化
- combineByKey的使用
- 参数优化
总结