概要
看了同事分享的面经,自己做点总结
面经网址: https://www.iteblog.com/archives/10040.html
Hadoop
Hadoop写流程
- Client上传请求。NameNode检查权限,文件重名
- Client文件切分。默认block 128MB
- 向NameNode获得DataNode地址
- 和DataNode建立连接,进行传送
- 一个block传送完毕后重复3,4过程
Hadoop写失败处理
- DataNode写完会返回ack确认。如果没有ack确认,NameNode会复制DataNode,然后下线DataNode
Hadoop读过程
- Client向NameNode请求block位置
- NameNode检查DataNode然后提供最近的活的DataNode地址
- block的读取是并行的
- 每次读完一个block,进行checksum验证。如果有问题会通知NameNode
- 合并全部block
Hadoop读失败处理
- Checksum验证。发现错误会通知NameNode,并且获取下一个block副本的DataNode地址
NameNode启动
首次启动
- 格式化文件系统,生成fsimage
- 读取fsimage进内存,等待DataNode注册
- 启动DataNode
- 出现文件操作时生成edit
二次启动
- 读取fsimage和edits文件
- 合并成新的fsimage
- 创建新的edit
- 启动DataNode
DataNode的添加
- Install jdk和ssh
- 修改Hosts,添加NameNode的IP
- 修改Config文件
- 启动DataNode进程
- 设置Load Balance
Secondary NameNode
- 用于合并NameNode的edit logs到fsimage
Kerberos
高可用结构
高可用结构里面不需要Secondary NameNode
log的更新由JournalNode担当
MapReduce
大图: http://4.bp.blogspot.com/_j6mB7TMmJJY/SS0CEJLklnI/AAAAAAAAAGQ/ogPGJ3WYpt4/s1600-h/P4.png
Map过程
- split。切割split文件
- spill(溢出写入) to disk
- sort
- combine。局部汇总,适用于求和类,不适用于求平均值
- merge
Reduce过程
- copy
- sort
- reduce
shuffle
- map的2,3和reduce的1,2
- 压缩机制。
- 为了减少IO
- snappy最常用
Tez
Tez vs MapReduce
YARN
- 管理节点
- Resource Manager
- 工作节点
- NodeManager
- Application Master
- Container
三种调度模型
- FIFO Scheduler
- Capacity Scheduler
- Fair Scheduler
怎么限制不同的用户的资源使用量
Queue: unfunded, schedule
Hive
Hive内部表和外部表
- 内部表由Hive管理,外部表(external)由HDFS管理
- 内部表删除。metadata+object
- 外部表删除。metadata only
Hive支持索引吗
- Hive有索引。用于制定HDFS文件路径和偏移量
- Hive索引不支持主键或者外键
文件存储类型
ORC/Parquest
- 压缩
- 二进制文件
Metastore
- 是个service
- 通过metastore获得metadata
- 多个client可以同时访问metastore并不需要知道保存metadata的mysql的用户名和密码
如何提高Hive效率
- Partition
- 合理分割, 防止数据倾斜
- Map
- 适当增大分割文件大小
- Map前进行合并
- 增加Map的数量
- Reduce
- 提高每个reduce的数据处理量
- 调整reduce数量(并不是越多越好,消耗资源)
- Query
- 用group by代替distinct等