某厂大数据面试问题总结(补充)

以下是我总结的一些大数据面试问题,如有不当之处,还请多多指教

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 三个类型是什么关系?
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值