以下是我总结的一些大数据面试问题,如有不当之处,还请多多指教
Spark面试问题:
1、常见的数据倾斜解决方法有哪些,怎么在spark中定位数据倾斜的问题?
详见本人博客
https://blog.csdn.net/qq_38705144/article/details/118366505
2、在spark 中遇到not serializable 的原因是什么,要怎么解决?
在spark运行在yarn模式下时,Driver端在AppMaster中运行,Executor在Worker中运行。
Driver作用:
1、负责将程序转成Job
2、用于任务的调度、切分、提交
3、用于任务的状态监控
4、负责Web ui
Executor的作用:
负责任务的计算,执行task任务
当Driver提交task到Executor中执行时,当类没有序列化时,无法在不同机器间通信,
所以会导致not serializable
3、如何在spark中设置缓存,应对读写热点的问题?
对于需要重复调用的RDD,需要设置缓存,
可以使用cache、persist的方式进行缓存
-- 在RDD模式下:cache的缓存方式是Memory Only,
-- 在DF模式下,cache的缓存方式是:Memory and disk
4、spark中RDD是否可以嵌套,在RDD中调用RDD?为什么?
在spark中RDD不能嵌套RDD
因为在spark运行过程中,Driver端并行式函数将以闭包的形式发送到Executor,如果在函数中还使用了其他的RDD,则需要Execuor将当前RDD以闭包的形式发送给Executor,但是只有Driver可以发送RDD对象,所以会发生错误
5、你们公司如何用spark读取hbase的数据,或者是其他数据库中的数据?
读取hbase:按照时间戳的范围扫描rowkey的方式读取hbase
写HBase:直接连接hbase,通过mapPartitions算子将本分区的put格式的迭代器中中数据转为list,通过batch的方式写入hbase中。
6、为什么说spark会比MR快?
1、spark只有使用shuffle的算子时会落盘,spark的DAG减少了shuffle操作,但MR的每次操作都会进行落盘操作
2、进程和线程的角度(一般开启进程比线程慢)
MR的job是在进程中运行的,在运行中需要不断申请释放进程,
但spark的job在开始时就分配好了资源,将job划分stage,切分成task运行在线程中,相比而言运行就比较快
3、spark使用了大量算子,减少逻辑代码,MR需要自己实现map和reduce方法,开发周期长,可能逻辑效果没有封装的算子好
7、spark使用中遇到最多的问题是什么?有什么解决方案?
1、可以从数据倾斜的角度
2、OOM:
解决:增加ececutor的个数、core数、内存数,driver的内存
3、TimeOut:
解决:增加重试次数、增加通信时间
4、空指针:
解决:查看空指针的位置,一般是解析失败
8、spark程序,可以设置哪些persist参数,什么时候需要设置?
cache只能将数据存储在内存中,当内存不够时失败。而persist存储可以选择存储的级别
存储级别:StorageLevel
1、DISK_ONLY / DISK_ONLY_2 [存两份]
2、MEMORY_ONLY / MEMORY_ONLY_2 [存两份]
3、MEMORY_ONLY_SER [序列化]
4、MEMORY_AND_DISK / MEMORY_AND_DISK_2
5、MEMORY_AND_DISK_SER / MEMORY_AND_DISK_SER_2
9、spark有哪些优化?
一、资源:
1、executor-memory :增加可以缓存更多的数据,为task提供更多内存
executor-cores、num_executor :增加可以提高task的并行度
2、RDD的filter尽量早一些,同时可以使用缓存重复使用的RDD
3、并行度调节
4、广播大变量
5、不使用java默认的序列化,使用kryo序列化
6、调节本地化等待时间:时间等待太短,task降级,task可能与数据不在同一节点,会发生数据传输。
二、算子:
1、mapPartitions可以针对一个分区的数据,建立连接时候使用
2、coalesce、repartition修改分区数
3、reduceByKey:可以预聚合
三、shuffle
1、设置map端缓冲区的大小 set("spark.shuffle.file.buffer", "64")
2、设置reduce端缓冲区的大小 set("spark.reducer.maxSizeInFlight", "96")
3、reduce端数据重试次数:.set("spark.shuffle.io.maxRetries", "6")
4、set("spark.shuffle.io.retryWait", "20s”)
基础组件使用问题:
1、hbase是怎么进行索引的,rowkey的设计为什么会影响索引的性能?
hbase通过rowkey进行索引的,可以创建二级索引(本地索引、全局索引)
rowkey按照字典序进行排序,设置不合理导致rowkey集中
rowkey设计原则:
1、长度尽量短(一般16字节以下)
2、散列原则
3、唯一性
我们的rowkey是按照 分桶id[3] + 时间戳[10] + uuid[9]
2、hbase中region 和 读写性能有什么关系,什么情况下需要预分区,什么情况下不用,预分区需要注意什么?
预分区原因:HBase默认一个分区,当客户端读取写入QPS过大时,
会导致regionserver压力过大,
当设置多个分区时,可以缓解访问的QPS,同时应该注意散列的原则,将数据分散到不同的regionserver中。
3、hdfs小文件比较多,会有什么问题?
1、占用namenode内存
2、数据处理的时候,影响maptask的数量
4、怎么提高kafka的吞吐效率,怎么提高kafka的读取效率?
提高kafka的吞吐效率:
1、可以适当的增加分区数
2、可以采用压缩的方式
5、监控kafka集群是否正常需要关注哪些指标?
1、副本同步队列 {isr} 数
2、
6、git的常用的命令
详见本人博客:https://blog.csdn.net/qq_38705144/article/details/117879294
hive问题:
1、hive sql有哪些优化?
1、自定义分区 (重写分区的方法,较少使用)
2、
Map端:
① 设置环形缓冲区的大小:mapreduce.task.io.sort.mb 默认100M,可以调高
② 设置环形缓冲区的阈值:mapreduce.map.sort.spll.percent 默认80%,可以调高到90%
③ 增加Merge合并的次数:mapreduce.task.io.sort.factor 默认10 可提高
④ 增加MapTask内存大小:mapreduce.map.memory.mb 默认1G --> 处理128M的数据,设置1G
⑤ 增加MapTask堆内存的大小:mapreduce.map.java.opts
⑥ 增加MapTask中的核数:mapreduce.map.cpu.vcores 默认MapTask的cpu核数为1
⑦ 设置重试次数:mapreduce.map.maxattempts 默认重试次数为4
⑧ set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
Reduce端
① mapreduce.reduce.shuffle.parallelcopies 拉取Map端数据的并行数 默认5
② mapreduce.reduce.shuffle.input.buffer.percent 默认0.7 提高0.8
③ mapreduce.reduce.memory.mb 默认1G
④ mapreduce.reduce.cpu.vcores 默认cpu为1个
⑤ mapreduce.task.timeout 默认10min
⑥ mapreduce.reduce.slowstart.completedmaps 默认0.05 当MapTask完成的比例到达该值后才会向ReduceTask申请资源
3、
set hive.exec.parallel=true 开启任务并行执行
Streaming问题:
1、在spark streaming中怎么控制kafka的消费速度,spark streaming的背压机制什么情况下不合适?
2、怎么设置spark streaming 的executor 参数是最优的?
一般executor中core:memeory = 1:4
3、spark streaming如何保证端到端一致性?对source端有什么要求,对sink端有什么要求?
4、spark streaming kafka offset如何进行管理,有什么好处?
可以参考这篇文章:https://www.cnblogs.com/fnlingnzb-learner/p/13429762.html
1、自动提交offset 默认
2、实际生产中手动提交offset
offset的管理:(我们公司有两种方式:都是通过手动提交的方式,一种直接将offset存储在redis中,另一种通过sparkstreaming自动管理)
1、在sparkstreaming中有专门的一个API去管理
2、也可以通过zookeeper的方式进行管理
Scala问题:
1、scala为什么能够调用java的jar包?
2、scala中的基本类型和数值类型,怎么和java的基本类型和数值类型进行转换?
3、scala使用lazy val , val, def 去定义同一个无参变量,会有什么不同?
4、scala 中 Any,AnyRef, AnyVal 三个类型是什么关系?