大数据高频知识点总结
12.19日更新
补充部分回答样例,大家可以作为一个参考,学习锻炼一下自己的话术和做下心理建设。部分例子打的字有些多其实说起来就没那么多了,特别是理解了后脑海里就有了结构图,分点讲慢慢跟面试官唠
在牛客网上学习了各位大佬们的经验贴子,经过实习、秋招的洗礼,总结了部分大数据知识点回馈牛油🚪,希望能够帮到大家一点
点赞多的话会继续更新,给出部分知识点答题方式
Hadoop
MR
1.简述MR工作流程
2.shuffle机制
3.环形缓冲区实现细节
4.join实现原理
5.几种排序的实现底层yarn
1.结合yarn的mr工作机制
2.yarn资源调度策略
3.yarn container资源隔离概念理解
4.application master 申请资源过程
5.yarn高可用实现原理
6.hadoop 1.x 与 2.x的区别HDFS
1.读写文件实现源码层次
答:(一般我回答会带一些口语化的词)ok,hdfs读写我先说下读这块的流程,客户端调用fliesystem提供的open函数向nn请求文件所在的地方,nn返回文件副本的节点地址,这里会返回若干个地址并按照距离排序好,客户端对输入流反复调用read函数去读取数据,完成数据块的读取后会继续为下一个快寻找最佳的数据节点重复上述过程。这里可能有个问题就是在客户端读取数据节点出错时,它会尝试读取这个块的其他相近节点同时会把出错的节点记录下来避免之后再进行无效尝试。 下面介绍下dhfs写文件的过程,客户端调用create函数尝试在文件系统命名空间创建新的文件,nn会对名称进行审核通过后会建立新的文件记录;客户端会把写入的数据分成一个个包,内部维护两个队列一个是数据队列用于缓存要写的数据包,另一个是确认队列来维护包的成功写入。假设有三个节点的集群,副本也就是3,数据流将包分流给数据管线中的第一个数据节点,这个节点会存储包并发送给第二个数据节点,第二个数据节点重复上述过程,只有三个节点都成功写入时确认队列才会移除刚写入的包;在写入期间若发生节点故障那么整个管线会被关闭,确认队列中的包会重新添加到数据队列头部,并将出错的节点记录下来联系nn,以便后期此节点正常后将数据删除,后期nn检测到副本数量不一致会自动处理。客户端数据写完后会调用close,向名称节点发送节点地址信息并将余下所有包放回数据队列并等待确认。至此结束。2.HDFS各组件职责
3.HDFS各组件通信原理
4.nn高可用实现原理其他
1.hadoop序列化和java序列化
2.hadoop压缩方式spark
1.RDD的理解
2.spark运行流程,stanlone、yarn模式
3.spark TaskSchedule实现
4.RDD容错机制
5.shuffle过程
6.对比mr shuffle和spark shuffle
7.groupby 、reduceby区别
8.spark任务划分过程
9.宽窄依赖划分
10.spark sql join实现原理
11.spark streaming 窗口
12.spark streaming容错机制
13.spark steaming反压机制
14.spark内存管理、优化
答:这个问题一般不会直接问而是会问你项目里做了哪些优化时,我引导出来的,这里不仅和spark相关而且涉及到jvm、os,是个综合的知识点。spark是基于jvm去执行的所以进程都是运行在jvm上,spark内存因此分为堆内、堆外内存,先说下堆内内存,堆内内存最开始是静态内存管理,划分为sotorage内存用于缓存rdd、broacast数据、execution内存区域用于缓存shuffle过程中的中间数据、其他内存用户定义的数据结构或spark内部元数据。stroage内存、execution内存都有预留空间,防止oom因为spark内存大小记录是不准确的,需要留出保险区域。Spark对堆内内存的管理是一种逻辑上的”规划式”的管理,因为对象实例占用内存的申请和释放都由JVM完成,Spark只能在申请后和释放前记录这些内存。JVM 的对象可以以序列化的方式存储,序列化的过程是将对象转换为二进制字节流,本质上可以理解为将非连续空间的链式存储转化为连续空间或块存储,在访问时则需要进行序列化的逆过程——反序列化,将字节流转化为对象,序列化的方式可以节省存储空间,但增加了存储和读取时候的计算开销。
对于Spark中序列化的对象,由于是字节流的形式,其占用的内存大小可直接计算,而对于非序列化的对象,其占用的内存是通过周期性地采样近似估算而得,即并不是每次新增的数据项都会计算一次占用的内存大小,这种方法降低了时间开销但是有可能误差较大,导致某一时刻的实际内存有可能远远超出预期。此外,在被Spark标记为释放的对象实例,很有可能在实际上并没有被JVM回收,导致实际可用的内存小于Spark记录的可用内存。所以 Spark并不能准确记录实际可用的堆内内存,从而也就无法完全避免内存溢出(OOM, Out of Memory)的异常。
为了进一步优化内存的使用以及提高Shuffle时排序的效率,Spark引入了堆外(Off-heap)内存,使之可以直接在工作节点的系统内存中开辟空间,存储经过序列化的二进制数据。堆外内存意味着把内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理而不是虚拟机。这样做的结果就是能保持一个较小的堆,以减少垃圾收集对应用的影响。spark利用JDK Unsafe API可以直接操作系统堆外内存,减少了不必要的内存开销,以及频繁的 GC 扫描和回收,提升了处理性能,堆外内存之所以能够被精确的申请和释放,是由于内存的申请和释放不再通过JVM机制,而是直接向操作系统申请,JVM对于内存的清理是无法准确指定时间点的,因此无法实现精确的释放),而且序列化的数据占用的空间可以被精确计算,所以相比堆内内存来说降低了管理的难度,也降低了误差。
堆外内存简单分为stroage内存、exeution内存,所占空间大小可由参数设定,由于堆外内存占用的空间可以被精确计算,所以无需再设定保险区域。之后spark发展出统一内存管理,与静态内存管理的区别在于存储内存和执行内存共享同一块空间,可以动态占用对方的空闲区域。
15.spark解决数据倾斜flink
1.对比flink 与 spark
2.flink window机制
3.flink容错机制
4.flink运行流程
5.flink设计理念hive
1.hive概念的理解
2.hive与mr、spark等引擎的联系
3.hive sql执行实现
4.hive join原理
5.hive和传统数据库区别
6.内部表、外部表
7.分区、分桶kafka
1.kafka各组件、角***r>2.kafka为什么那么快
3.kafka副本如何确定
4.消息系统如何保持有序(生产者、中间件、消费者)
5.如何解决消息重复、丢失
6.kafka容错机制hbase
1.hbase作用、解决什么样的场景问题
2.hbase读写原理
3.region 分裂过程
4.唯一键rowkey设计原则zookeeper
1.分布式一致性协议
2.zk选举过程
3.zk使用场景
4.zk中的ZAB协议
5.zk实现分布式锁clickhouse
1.ck使用场景
2.ck为什么那么快
3.对比ck、hbaseredis
1.基本数据结构
2.为什么那么快
3.为什么用单线程
4.持久化、过期策略
5.缓存雪崩、缓存击穿、缓存穿透数据仓库
1.数仓概念
2.事实表、维度表以及各自的类型
3.建模方式以及过程
4.星型模型、雪花模型概念以及场景、优劣