程序员的金三银四求职宝典
随着春天的脚步渐近,对于许多程序员来说,一年中最繁忙、最重要的面试季节也随之而来。金三银四,即三月和四月,被广大程序员视为求职的黄金时期。在这两个月里,各大公司纷纷开放招聘,求职者们则通过一轮又一轮的面试,力争心仪的职位。而如何在这关键的时期脱颖而出,成为每个求职者关注的焦点。
接下来给各位即将进行面试的求职者一些经典的大数据面试例题
1.请简述你对大数据的特点的理解
大数据特点总的来说就五个字: 大多值快信
数据体量大, 种类,来源多样化, 价值密度低, 速度快, 数据的质量高(准确性,可信赖度)
2.请简述你对分布式 和 集群的理解
分布式: 多台机器做不同的事情, 然后组成1个整体.
集群: 多台机器做相同的事情.
3.请简述你对HDFS架构的理解
namenode:主节点
1.管理整个HDFS集群
2.维护和管理元数据
SecondaryNameNode:辅助节点
辅助namenode管理元数据的
datanode:从节点
1.维护和管理源文件
2.负责数据的读,写操作
3.定时向namenode报活
4.请简述HDFS特点
HDFS文件系统可存储超大文件,时效性稍差。
HDFS具有硬件故障检测和自动快速恢复功能。
HDFS为数据存储提供很强的扩展能力。
HDFS存储一般为一次写入,多次读取,只支持追加写入,不支持随机修改。
HDFS可在普通廉价的机器上运行。
5.请简述你对Yarn架构的理解
ResourceManager:主节点
1.负责任务的接收
2.负责资源的调度和分配
nodemanager:从节点
负责接收并执行ResourceManager分配过来的计算任务
6.请简述namenode是如何管理datanode的
心跳机制:
1.datanode会定时3秒向namenode发送心跳包,告知namenode我还活着
2.如果超过一定时间630秒,namenode没有收到datanode的心跳包,就会认为它宕机了,此时就会将该datanode的块信息交由给其他活跃的datanode来存储
3.所有的datanode会定时6小时,向namenode汇报一次自己完整的块信息,让namenode校验更新
负载均衡:
namenode会保证所有的datanode的资源使用率尽量保持一致
副本机制:
可以提高容错率,默认的副本数是3
如果当前副本总数>默认的副本数,namenode会自动删除某个副本
如果当前副本总数<默认的副本数,namenode会自动增加该副本
如果当前活跃的机器总数<默认的副本数,就会强制进入到安全模式,在安全模式下只能读不能写
7.请简述你对Hive架构的理解
Hive的客户端
SQL解析器: 解析SQL语法的, 就将其转成MR任务
元数据管理服务: 维护和管理元数据的, 且要能存储元数据
8.数据库 和 数据仓库 之间的区别是什么
OLTP: 数据库
面向事务,采集数据,操作的是在线数据(实时),增删改查,数据量相对较小,对数据的安全性(事务性),时效性要求相对较高
OLAP: 数据仓库
面向主题,分析数据,操作的是离线数据(历史),查, 数据量相对较大,对数据的安全性(事务性),时效性要求相对较低
9.分区表和分桶表的区别是什么
不同点:
1.作用不同
分区 = 分文件夹
分桶 = 分文件
2.字段要求不同
分区字段必须是表中没有的字段
分桶字段必须是表中已有的字段
3.本质不同
分区 = 避免全表扫描,降低扫描次数,提高查询效率,分文件夹也便于维护管理
分桶 = 减少join次数,提高查询效率,另一个角度是:方便我们进行数据采样
相同点
殊途同归,最终目的都是为了提高查询效率
10.内部表和外部表的区别是什么
1. 建表格式不同.
内部表: 直接创建即可, 默认就是内部表.
外部表: 建表是需要加 external关键字.
2. 权限不同, 是否会删除源文件.
内部表: 也叫受管理表, 删除内部表时, 不仅会删除元数据(Hive中查不到了), 还会删除源文件(HDFS也查不到了)
外部表: 只会删除元数据(Hive中查不到了), 不会删除源文件(HDFS中还在)
11.请简述你对Hive调优的理解?
1. 改硬件.
2. 开启或者增大某些设置(配置). 负载均衡, 严格模式(禁用低效SQL), 动态分区数...
3. 关闭或者减小某些设置(配置). 严格模式(动态分区), 推测执行...
4. 减少IO传输. Input(输入)/Output(输出), 列存储orc, 压缩协议snappy, join优化
12.SecondaryNameNode是如何辅助namenode管理元数据的
1. SecondaryNameNode会间隔60s(秒), 询问一次namenode, edits文件是否满足了阈值(1个小时, 或者100W次)
2. 如果满足条件, 就通知namenode创建新的Edits文件, 继续往里写入元数据信息.
3. 根据http协议, 从namenode上把要合并的edits文件 和 fsimage文件拉取到本地进行合并.
4. 将合并后的新的FSImage文件推送给namenode, 用来替换之前旧的FsImage文件.
细节: 旧的FSImage文件并不会被立即删除, 而是达到一定的阈值后, 才会被删除.
5. 对于Edits文件和FSImage文件的合并操作, 是由SecondaryNameNode独立完成的, 全程namenode不参与.
6. 实际开发中, namenode 和 SecondaryNameNode会被部署到不同的服务器上, 配置几乎一致, 只不过SecondaryNameNode的内存要稍大一些.
7. 在紧急情况下, SecondaryNameNode可以用来恢复namenode的元数据
13.HDFS的读数据流程
1. Client(客户端)请求namenode, 上传文件.
2. namenode接收到客户端请求后, 会校验权限, 并告知客户端是否可以上传.
校验: 客户端是否有写的权限, 及文件是否存在.
3. 如果可以上传, 客户端会按照128MB(默认)对文件进行切块.
4. Client(客户端)再次请求namenode, 第1个Block块的上传位置.
5. namenode会根据副本机制, 负载均衡, 机架感知原理及网络拓扑图, 返回给客户端存储该Block块的DataNode列表.
例如: node1, node2, node3
6. Client(客户端)会先连接就近的datanode机器, 然后依次和其他的datanode进行连接, 形成: 传输管道(Pipeline)
7. 采用数据报包(DataPacket)的形式传输数据, 每个包的大小不超过: 64KB, 并建立: 反向应答机制(ACK机制)
8. 具体的上传动作: node1 -> node2 -> node3, ACK反向应答机制: node3 => node2 => node1
9. 重复上述的步骤, 直至第1个Block块上传完毕.
10. 返回第4步, 客户端(Client)重新请求第2个Block的上传位置, 重复上述动作, 直至所有的Block块传输完毕
14.HDFS的写数据流程
1. Client(客户端)请求namenode, 读取文件.
2. namenode校验该客户端是否有读权限, 及该文件是否存在, 校验成功后, 会返回给客户端该文件的块信息.
3. Client(客户端)会连接上述的机器(节点), 并行的从中读取块的数据.
4. Client(客户端)读取完毕后, 会循环namenode获取剩下所有的(或者部分的块信息), 并行读取, 直至所有数据读取完毕.
5. Client(客户端)根据Block块编号, 把多个Block块数据合并成最终文件即可.
15.简述MR执行流程
1. MR任务分为MapTask任务 和 ReduceTask任务两部分, 其中: MapTask任务负责: 分, ReduceTask任务负责: 合.
1个切片(默认128MB) = 1个MapTask任务 = 1个分好区, 排好序, 规好约的磁盘文件.
1个分区 = 1个ReduceTask任务 = 1个结果文件.
2. 先切片, 每个切片对应1个MapTask任务, 任务内部会逐行读取数据, 交由MapTask任务来处理.
3. MapTask对数据进行分区,排序,规约处理后, 会将数据放到1个 环形缓冲区中(默认大小: 100MB, 溢写比: 0.8), 达到80MB就会触发溢写线程.
4. 溢写线程会将环形缓冲区中的结果写到磁盘的小文件中, 当MapTask任务结束的时候, 会对所有的小文件(10个/次)合并, 形成1个大的磁盘文件.
1个切片(默认128MB) = 1个MapTask任务 = 1个分好区, 排好序, 规好约的磁盘文件.
5. ReduceTask任务会开启拷贝线程, 从上述的各个结果文件中, 拉取属于自己分区的数据, 进行: 分组, 统计, 聚合.
6. ReduceTask将处理后的结果, 写到 结果文件中.
1个分区 = 1个ReduceTask任务 = 1个结果文件.