目录
1. 大数据的特点(4V特征)
2. 谈谈 Hadoop 的优缺点
3. 为什么 HDFS 不适合存小文件
4. Hadoop 的核心组件有哪些,并说明下功能
5. Hadoop 与关系型数据库对比
6. 如果集群中 DataNode 出现错误(比如 DataNode 进程死亡或者网络故障造成无法与 NameNode 通信),集群能否立即将宕机的DataNode下线?另外DataNode 下线后,集群将进行什么工作?
7. 简单说明下 HDFS 中,NameNode ,SecondaryNameNode 和 DataNode 的作用
8. 简单描述一下 dfs-start.sh 的启动流程(或者 NameNode 的启动流程)
9. 什么情况下集群会进入安全模式
10. HDFS 的读写执行流程
11. HDFS 的可靠性策略有哪些
12. 如果一个 DataNode 宕机了,如何做恢复
13. MapReduce 的执行流程
14. Yarn 的 Job 提交流程
15. Hadoop 中数据块(Block)大小如何确定,现有一个文件大小为260M,Block大小设定为128MB,在进行 split 操作时,会生成几个 Block
16. Block 大小设置成多少合适
17. MapReduce 中有哪些关键类
18. Mapper 中 setup 方法是干嘛的
19. Hadoop Shuffle 原理
20. MapReduce 的调优
21. Hadoop 中支持的存储格式和压缩算法
优点:
缺点:
HDFS 文件存储是以 Block 进行存储的(Hadoop 2.x 以后 Block 大小默认为128M),而 Block 元数据大小大概在 150 字节左右,Block 的元数据会在 NameNode 启动时加载到内存,也就意味着一个小文件就要占用 NameNode 150 字节内存,如果小文件过多,NameNode 内存很有可能被消耗殆尽,但整个集群存储数据的量却很小,失去了HDFS的意义,同时也会影响 NameNode 的寻址时间,导致寻址时间过长
HDFS:分布式文件系统,解决分布式存储
MapReduce:分布式计算框架
YARN:分布式资源管理系统,在 Hadoop 2.x 中引入
Common:支持所有其他模块的公共工具程序
(1)不能立即下线,NameNode不会立即把该节点判定死亡,HDFS 默认的超时时长为10分30秒,如果定义timeout为超时时长,则超时时长的计算公式为:timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval,默认的heartbeat.recheck.interval为5分钟,dfs.heartbeat.interval默认为3秒
(2)DateNode 下线后,集群将复制下线的 DataNode 管理的块,在其他 DataNode 上做备份
NameNode:
SecondaryNameNode:
DataNode:
第一阶段:NameNode 启动
第二阶段:DataNode 启动
第三阶段:SecondaryNameNode 启动
另外,在这3个阶段完成之前,集群处于安全模式
集群启动时:
由于 NameNode 在启动时加载的是所有块位置的映射信息,而非完整的块数据,所以需要各个 DataNode 向 NameNode 发送最新的块列表信息来验证块是否有效,在此期间 NameNode 的文件系统对于客户端来说是只读的
Block异常损坏:
当 NameNode 发现集群中的 Block 丢失数量大于设定阈值时,NameNode 会进入安全模式,对低于阈值的 Block 在其他 DataNode 节点上做备份
在执行负载均衡操作时需要进入安全模式:
由于在做负载均衡操作时会对Block进行复制和删除操作,所以需要进入安全模式
读数据执行流程
文件完整性:
网络或机器失效时:
NameNode 挂掉时:
其他保障可靠性机制:
将宕机的 DataNode 上的数据删除,重新当成新节点加入到集群即可
作业提交:
(1)client 调用 job.waitForCompletion 方法,想整个集群提交 MapReduce 作业。
(2)client 向 ResourceManager 申请一个作业 id
(3)ResourceManager 给 Client 返回该 job 资源的提交路径(HDFS 路径)和作业 id,每个作业都有唯一的 id
(4)client 发送 jar 包、切片信息和配置文件到指定的资源提交路径
(5)client 提交完资源后,向 ResourceManager 申请运行 ApplicationMaster
作业初始化:
(6)当 ResourceManager 收到 client 的请求后,将该 job 添加到容器调度器(Resource Scheduler)中
(7)在某一个空闲的 NodeManager 领取到该 job
(8)该 NodeManager 创建 Container,并产生 ApplicationMaster
(9)下载 Client 提交的资源到本地,根据分片信息生成 MapTask 和 ReduceTask
任务分配:
(10)ApplicationMaster 向 ResourceManager 申请运行多个 MapTask 任务资源
(11)ResourceManager 将运行 MapTask 任务分配给空闲的多个 NodeManager,NodeManager 分别领取任务并创建容器
任务运行:
(12)ApplicationMaster 向接收到任务的 NodeManager 发送程序启动脚本,每个接收到任务的 NodeManager 启动 MapTask,MapTask 对数据进行处理,并分区排序
(13)ApplicationMaster 等待所有 MapTask 运行完毕后,向 ResourceManager 申请容器运行 ReduceTask
(14)程序运行完毕后,ApplicationMaster 会向 ResourceManager 申请注销自己
(15)进度和状态更新。Yarn 中的任务将其进度和状态(包括 counter)返回给应用管理器,客户端每秒(通过 mapreduce.client.progressmonitor.pollinterval 设置)向应用管理器请求进度更新并展示给用户。可以从 Yarn WebUI 查看任务执行状态
作业完成:
除了向应用管理器请求作业进度外,客户端每5分钟都会通过调用 waitForCompletion() 方法来检查作业是否完成。时间间隔可以通过 mapreduce.client.completion.polinterval 来设置。作业完成后,应用管理器和 container 会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查
根据官网描述,Hadoop 2.7.3 版本之前,Block 默认大小为 64MB,Hadoop 2.7.3 以后,Block 默认大小为 128MB,可以通过修改hdfs-site.xml文件中的dfs.blocksize对应的值
会产生2个 Block,因为每次切片时,都要先判断剩余部分是否大于 Block 大小的1.1倍,不大于1.1倍就划分到一个 Block
GenericOptionsParser:为了 Hadoop 框架解析命令行参数的工具类
InputFormate接口可以实现的类:FileInputFormat、ComposableInputformat 等,主要用于文件为输入及切割
Mapper:将输入的 kv 对映射成中间数据 kv 对集合。Maps 将输入记录转变为中间记录
Reducer:根据 key 将中间数据集合处理合并为更小的数据结果集
Partitioner:对数据按照 key 进行分区
OutputCollecter:文件输出
Combine:本地聚合,Mapper 端的 reduce
setup 方法用于管理 Mapper 生命周期中的资源,加载一些初始化工作,每个 job 执行一次,setup 在完成 Mapper 构造,即将开始执行 map 动作前执行
定义:
把 map 方法之后 reduce 方法之前这段处理过程称之为 Shuffle
具体步骤:
MapReduce 优化方法主要从6个方面考虑:数据输入、Map 阶段、Reduce 阶段、IO 传输、数据倾斜和常用调优参数
数据输入:
Map 阶段:
Reduce 阶段:
IO传输:
存储格式:
压缩算法:
压缩算法 | 压缩比 | 压缩速度 | 解压速度 |
---|---|---|---|
gzip | 13.4% | 17.5 MB/s | 58 MB/s |
bzip2 | 13.2% | 2.4 MB/s | 9.5 MB/s |
lzo | 20.5% | 49.3 MB/s | 74.6 MB/s |
snappy | 22.2% | 59.3 MB/s | 74.0 MB/s |
特点:
hadoop 内置支持,支持native库,使用方便,压缩比高
不支持 split。
在压缩后的文件大小与 HDFS 块大小差距不大时,可使用此算法
应用场景:
一天或者一个小时的日志压缩成一个 gzip 文件,运行mapreduce程序的时候通过多个gzip文件达到并发。
特点:
hadoop 内置支持,支持 split,压缩比很高,
不支持 native 库,压缩/解压速度慢
对于历史性很大的文件,想尽可能节省磁盘空间,还要支持split
应用场景:
mapreduce 的输出,压缩存档,作为冷数据使用,通常是对大文件的压缩。
特点:
支持 native 库,压缩/解压速度也比较快,合理的压缩率;支持 split (需要建索引,文件修改后需要重新建索引),yum 安装 lzop 命令后,使用方便
hadoop 内置不支持,需要手动编译安装。
大文件的存储,作为热数据使用
应用场景:
一个大文件压缩后依然是两个或多个 HDFS 块的大小,还不希望作为冷数据使用
特点:
高速压缩速度和合理的压缩率,支持native库
hadoop 内置不支持,需要手动编译安装,不支持 split,没有 linux 命令可使用
应用场景:
mapreduce 过程中 map 的输出,reduce 或另一个 map 的输入
22. Hadoop 的资源调度器有哪些
FIFO(先入先出调度器)
Hadoop 1.x 默认调度器
只有一个队列,将一个一个 job 任务按照时间先后顺序进行服务
Capacity Scheduler(容量调度器)
hadoop 2.x 默认调度器
支持多个队列,每个队列可以配置一定量的资源,每个采用 FIFO 的方式调度
防止同一个用户的 job 任务独占队列中的资源,调度器会对同一用户提交的 job 任务所占资源进行限制
分配新的 job 任务时,首先计算每个队列中正在运行 task 个数与其队列应该分配的资源量做比值,然后选择最小的队列
其次,按照 job 任务的优先级和时间顺序,同时要考虑到用户的资源量和内存的限制,对队列中的 job 任务进行排序执行
多个队列同时按照任务队列内的先后顺序一次执行。
Fair Scheduler(公平调度器)
支持多个队列,每个队列可以配置一定资源,每个队列中的 job 任务公平共享器所在队列的所有资源
队列中的 job 任务都是按照优先级分配资源,优先级越高分配的资源越多,但是为了确保公平每个 job 任务都会分配到资源。游侠你是根据每个 job 任务的理想获取资源量减去实际获取资源量的差值决定的,差值越大优先级越高
《大数据——Java 知识点整理》
《大数据——MySQL 知识点整理》
《大数据—— Hive 知识点整理》
《大数据—— HBase 知识点整理》
《大数据—— Scala 知识点整理》
《大数据—— Spark Core 知识点整理》
《大数据——Flink 知识点整理》