2.6.0分布式单机环境搭建HDFS讲解Mapreduce示例

Hadoop安装使用 1.1 Hadoop简介 1.2 HDFS分布式存储系统 1.3 单机安装 1.4 Mapreduce 案例 1.5 伪分布式安装 1.6 课后作业 1.1 Hadoop简介 了解Hadoop的简介以及生态圈,更多Hadoop相关信息见Hadoop 专题页面 ?tid=13  1.2 HDFS分布式存储系统(Hadoop Distributed File System)

HDFS优点

高容错性

数据自动保存多个副本

副本都时候会自动恢复

适合批量处理

移动计算而非数据

数据位置暴露给计算框架

适合大数据处理

GB/TB/甚至PB级数据

百万规模以上文件数量

10k+

可构建廉价的机器上

不管机器人有多么的垃圾,只要有空间内存就可以搭建Hadoop

*HDFS缺点*

低延迟数据访问

比如毫秒级

低延迟与高吞吐率

小文件存取

占用NameNode大量内存

寻道时间超过读取时间

并发写入/文件随机修改

一个文件只能有一个写者

只支持append

HDFS架构

HDFS架构图

如图所示,HDFS是按照Master和Slave的结构

NameNode:类似项目经理职位 下达需求,监控团队进度,工作分配。
管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS的名称空间;

NameNode的主要功能:接受客户端的读写服务。 上传文件 读取文件都要联系NameNode Namenode保存了metadate信息,而metadate保存着datanode的元数据 包含了block的位置信息(路径),以及datanode的详细信息。 Namenode的metadate信息启动后会加载到内存,metadate存储到磁盘的文件名;"fsimage",但是其中不包含Block的位置信息,而block的位置信息是在每一次Datanode启动的时候将block的位置信息发送给NameNode 内存中。 **edits**记录对metadate的操作日志。

SecondaryNameNode:类似经理助理的职位 分担领导(Namenode)的工作量;

SecondaryNameNode他不是主节点也不是从节点,它是用来辅助NameNode来完成editslog操作日志的。 合并edits的操作可以配置: 设置fs.checkpoint.period 默认3600秒 设置edits log大小fs.checkpoint.size规定edits文件的最大默认64MB

NN合并流程

DataNode: 程序员干活的,上头(NameNode)下达一个需求功能需要你(DataNode)实现。存储client发来的数据块block;执行数据块的读写操作。

dataNode(block)它是数据存储单元,就是数据真正存储的地方。每一个block都会被固定大小的数 据块,默认数据块的大小是64MB**可配置**。 问:我这个文件大小没有达到64MB怎么办呢? 答:如果该文件还不到64MB的时候,则单独成一个block 问:那如果大于64MB怎么办? 答:如果大了就在切分一个block出来,就像我们切肉/切菜一样,想把他们切的均衡(64MB),假如肉切的1厘米,到最后还剩下3厘米怎么办?那就继续再切分。

datanode设计思想


如图所示

假如我上传文件大小为"50G"-->切分为多个block。

每一个Block都会有一个3个副本(可配置)

每一个block的3个副本都存在不同的节点(机器)上,如图"block1"。

HDFS写流程

简单易懂

1.HDFS Client-->NameNode:我要上次新文件 2.NameNode检查DataNode空间,检查出: xxx机器上的节点可以存储 3.NameNode上传 4.记录log日志

下面是专业术语

客户端调用create()来创建文件 DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件。 元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。 DistributedFileSystem返回DFSOutputStream,客户端用于写数据。 客户端开始写入数据,DFSOutputStream将数据分成块,写入data queue。 Data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。 Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。 DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。 如果数据节点在写入的过程中失败: 关闭pipeline,将ack queue中的数据块放入data queue的开始。 当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。 失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。 元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。 当客户端结束写入数据,则调用stream的close函数。此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完毕。

写原理

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/3612f5f5fe8f2db7b0dddb37d5d8791b.html