HDFS工作流程与机制和MapReduce
NameNode
- NameNode:Hadoop分布式文件系统的核心,架构中的主角色
- NameNode维护和管理文件系统元数据,包括名称空间目录数结构、文件和块的位置信息、访问权限的信息
- NameNode成为了访问HDFS的唯一入口
- NameNode内部通过内存和磁盘文件两种方式管理元素据
DataNode
- DataNode是Haddop HDFS中的从角色,负责具体的数据块存储
- DataNode的数量决定了HDFS集群的数据存储能力。通过和NameNode配合维护着数据块
Secondary Name Node
- Secondary NameNode充当Namenode的辅助节点,但不能替代Namenode,主要是帮助主角色进行元数据文件的合并动作
写数据完整流
Pipeline管道。
- 这是HDFS在上传文件写数据过程中采用的一种数据传输方式
- 客户端将数据块写入第一个数据节点,第一个数据节点保存数据后再将复制到第二个数据节点,后者保存后将其复制到第三个数据节点
为什么datanode之间采用线性传输,而不是一次给三个datanode拓扑式传输?
因为数据以管道的方式,顺序的沿着一个方向传输,这样能够充分利用每个机器的带宽,避免网络连接和高延迟时的连接。最小化推送所有数据的延时。
默认3副本存储策略
- 第一块副本:优先客服端本地,否则随机
- 第二块副本:不同于第一块副本的不同机架
- 第三块副本:第二块副本相同机架不同机器
ACk校验
- ACK即使确认字符,在数据通信中,接收方给发送方的一种传输类控制字符。表示发来的数据已确认无误
- 在HDFS管道传输数据对 过程中,传输的反方向会进行ACK校验,确保数据传输安全。
Hadoop MapReduce(分布式计算框架)
分而治之
mapreduce的思想核心是“分而治之”
- 分而治之:就是把一个复杂的问题,按照一定的“分解”方法分为等价的规模较小的若干部分,然后在逐个解决,分别找出各部分的结果,然后把各部分的结果组成整个问题的最终结果。
- Map:表示第一阶段,负责“拆分”,即把复杂的任务分解为若干个“简单的子任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此之间没有依赖关系。
- Reduce表示第二个阶段,负责“合并”,即对map阶段的结果进行全局汇总
这两个阶段合起来正是MapReduce思想的体现
设计构思
- 应对相互间不具有依赖关系的大数据计算任务
- MapReduce处理的数据类型是<key,value>键值对
- MapReduce最大的亮点在于通过计算机框架需要做什么与具体怎么做分来了,为程序员提供了一个抽象和高层的编程接口和框架
MapReduce优点
- 易于编程
- 良好的扩展性
- 高容错性
- 适合海量数据的离线处理
MapReduce缺点
MapReduce虽然有很多优势,也有相对局限性,局限性不代表不能做,而是在有些场景下实现的效果比较差,并不适合MapReduce来处理,主要表现在以下结果方面:
- 实时计算性能差
mapreduce主要应用与离线作业,无法做到秒级或者亚秒级得数据响应 - 不能进行流失计算
流失计算特点的数据是源源不断得计算,并且数据是动态的;而mapreduce作为一个离线计算框架,主要是针对静态数据集得,数据是不能动态变化的
MapReduce实例进程
一个完整的MapReduce程序在分布式运行时有三类
- MRAPPMaster:负责整个MR程序的过程调度及其状态协调
- MapTask:负责map阶段的整个数据处理流程
- ReduceTask:负责reduce阶段的整个数据处理流程
阶段组成
- 一个MapReduce编程模型中只能包含一个Map阶段和一个Reduce阶段,或者只有Map阶段
- 不能有诸多个Map阶段、多个Reduce阶段的情景出现
- 如果用户的业务逻辑非常复杂,那就只能多个Mapreduce程序串行运行
MapReduce数据类型
- 整个MapReduce程序中,数据都是以KV键值对的形式流转的
- 在实际编程解决各种业务问题中,需要考虑每个阶段的输入输出KV分别是什么
- MapReduce内置了很多默认属性,比如排序,分组,都和数据的K有关,所以说KV的类型数据确定及其重要的
案例
示例1:评估案例Π(PI)的值:
/export/server/hadoop-3.3.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar
hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 2 2
//结果:Estimated value of Pi is 4.00000000000000000000
示例2:wordcount单词词频统计:
先将带有英语单词的文档进行上传
jar hadoop-mapreduce-examples-3.3.0.jar wordcount /input /output
//结果: File Input Format Counters
Bytes Read=105
File Output Format Counters
Bytes Written=53
<注意>输出位置要求是一个空文件
Map阶段执行过程
- 逻辑切片(128M)
- 按行读数据
- 调用Mapper类中的map方法处理数据
每读取解析出来一个<key,value>,调用一次map方法 - 分区partition
- Map输出数据写入内存缓冲区,达到比例溢出到磁盘上。溢出spill的时候根据key进行排序sort
- 对溢出文件进行最终的merge合并,成为一个文件
Reduce阶段执行过程
- ReduceTask会主动从MapTask复制拉取属于需要自己处理的数据
- 把拉取来的数据,全部进行合并,即把分散的数据合并成一个大的数据,在对合并后的数据排序
- 对排序后的键值对调用reduce方法。键相等的键值调用一次reduce方法。最后把这些输出的键值对写入HDFS文件中。
Shuffle机制
Shuffle:将map端的无规则输出按指定的规则“打乱”具有一定规则的数据,以便reduce端接收处理
- 一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称为shuffle
Map端Shuffle
- collect 2.spill 3.merge
Reduce端Shuffle
1.copy 2.merge 3.sort
shuffle机制弊端
- shuffle是MapReduce程序的核心和精髓,是MapReduce的灵魂所在
- shuffle也是MapReduce被诟病最多的地方所在,MapReduce相较于Spark、Flink计算引擎慢的原因,跟shuffle机制有很大关系
- shuffle中频繁涉及到数据在内存、磁盘之间的多次往复