HDFS(hadoop distributed File System)详解

HDFS(hadoop distributed File System)分布式文件系统

    特点:高容错性(多个文本副本存储),价格低,高吞吐量。

    常见的系统  gfs,HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS、FastDFS。

    Hdfs总体上采用了master/slave 架构,主要由以下几个组件组成:Client 、NameNode 、Secondary namenode 和DataNode

HDFS结构图

一个HDFS集群是有一个 Namenode和一定数目的 Datanode组成。 Namenode是一个中心服务器,负责管理文件系统的 namespace和客户端对文件的访问。

Namenode:执行nameSpace,一个文件会被分为多个block,nameNode决定block会被映射到那个datanode, Datanode Namenode的指挥下进行 block的创建、删除和复制。

HDFS读写原理

1. 客户端要向HDFS写数据,首先要跟namenode通信以确认可以写文件并获得接收文件block的datanode,然后,客户端按顺序将文件逐个block传递给相应datanode,并由接收到block的datanode负责向其他datanode复制block的副本 

发送过程是以流式写入,文件会被分为Block块。

1. 客户端将要读取的文件路径发送给namenode,namenode获取文件的元信息(主要是block的存放位置信息)返回给客户端,客户端根据返回的信息找到相应datanode逐个获取文件的block并在客户端本地进行数据追加合并从而获得整个文件 

HFDS架构

核心目标,因为硬件的错误是常态,而非异常情况,hdfs由上千个节点组成,所以hdfs的核心目标是错误检测和快速,自动的恢复。

主要以流式读取,做批处理。

1 master和slave架构

主要角色:NameNode,dataNode,scendaryNameNode。

NameNode是master节点,大领导,负责管理整个hdfs,以及文件目录树和文件和目录。和数据块的映射,处理客户端的读写请求,具体包括namespace(文件目录)和block管理( 其中包括 filename->block,block->datanode list的对应关系)。

NameNode提供的是始终被动接收服务的server,主要有三类协议接口:ClientProtocol接口、DatanodeProtocol接口、NamenodeProtocol接口。

dataNode slave节点,用来干活,主要是用来存取数据,(一个是块管理(datanode之间的联系),一个物理存储)。hdfs将文件拆分为多个block,block存在一个或者多个datanode中。执行数据块的读写操作。

secondaryNameNode 是NameNode的冷备份。

合并fsimage和fsedits然后再发给namenode。默认是1小时,定期查询,减少Namenode的负担。

 NameNode的核心是FSNamesysem,包括Fsdirectory(管理目录),blocksMAP(维护块信息), LeaseManagr维护租约信息;此外,还通过DatanodeDescriptor、corruptReplicas等维护数据结点(DN)状态、坏副本等信息;

fsname->block列表的映射

所有有效blocks集合

block与其所属的datanodes之间的映射(该映射是通过block reports动态构建的,维护在namenode的内存中。每个datanode在启动时向namenode报告其自身node上的block)

每个datanode与其上的blocklist的映射

采用心跳检测根据LRU算法更新的机器(datanode)列表

FSNamesystem体系结构

FSDirectory

FSDirectory用于维护当前系统中的文件树,存储整个文件系统的目录状态 FSDirectory通过FSImage及FSEditLog保存目录结构的某一时刻镜像及对镜像的修改(从namenode本地磁盘读取元数据信息和向本地磁盘写入元数据信息,并登记对目录结构所作的修改到日志文件);另外,FSDirectory保存了文件名和数据块的映射关系。

blocksMAP  namenode中是通过block->datanode list的方式来维护一个block的副本是保存在哪几个datanodes上的对应关系的。

hdfs工作原理

a. Client将FileA按64M分块。分成两块,block1和Block2;

b. Client向nameNode发送写数据请求,如图蓝色虚线①------>。

c. NameNode节点,记录block信息。并返回可用的DataNode,如粉色虚线②--------->。

    Block1: host2,host1,host3

    Block2: host7,host8,host4

---------------------

原理:

        NameNode具有RackAware机架感知功能,这个可以配置。

        若client为DataNode节点,那存储block时,规则为:副本1,同client的节点上;副本2,不同机架节点上;副本3,同第二个副本机架的另一个节点上;其他副本随机挑选。

        若client不为DataNode节点,那存储block时,规则为:副本1,随机选择一个节点上;副本2,不同副本1,机架上;副本3,同副本2相同的另一个节点上;其他副本随机挑选。

d. client向DataNode发送block1;发送过程是以流式写入。

流式写入过程,

        1>将64M的block1按64k的package划分;

        2>然后将第一个package发送给host2;

        3>host2接收完后,将第一个package发送给host1,同时client想host2发送第二个package;

        4>host1接收完第一个package后,发送给host3,同时接收host2发来的第二个package。

        5>以此类推,如图红线实线所示,直到将block1发送完毕。

        6>host2,host1,host3向NameNode,host2向Client发送通知,说“消息发送完了”。如图粉红颜色实线所示。

        7>client收到host2发来的消息后,向namenode发送消息,说我写完了。这样就真完成了。如图黄色粗实线

        8>发送完block1后,再向host7,host8,host4发送block2,如图蓝色实线所示。

        9>发送完block2后,host7,host8,host4向NameNode,host7向Client发送通知,如图浅绿色实线所示。

        10>client向NameNode发送消息,说我写完了,如图黄色粗实线。。。这样就完毕了。

---------------------

Hadoop文件的常用操作:

 查看文件命令,可以列出path目录下的内容,包括文件名,权限,所有者,大小和修改时间等。

 命令格式 

 hdfs dfs -ls path    查看文件列表 

 hdfs dfs -lsr path   递归查看文件列表

 hdfs dfs -du path   查看path下的磁盘情况,单位字节 

 使用示例 hdfs dfs -ls /   查看当前目录 hdfs dfs -lsr /   递归查看当前目录

 创建文件夹

 命令格式 hdfs dfs -mkdir path 

 使用示例 hdfs dfs -mkdir /user/trunk

 创建文件

 命令格式: 

 hdfs dfs -touchz path 使用示例: hdfs dfs -touchz /user/test1.txt 

赋予权限

命令格式 hdfs dfs –chmod [权限参数][拥有者][组] path 使用示例 hdfs dfs –chmod 777 /user/test.txt 权限: 

读(r):4; 写(w):2; 执行(x):1

上传文件

命令格式 hdfs dfs - put 源文件夹  目标文件夹 

使用示例 hdfs dfs -put /home/hadoop/data/record     /guide/todayData 

 上传record整个文件夹(含文件夹) 

hdfs dfs -put /home/hadoop/data/record/*   /guide/todayData  

上传record中的所有文件(不含文件夹) 

类似命令 hdfs dfs -copyFromLocal 源文件夹  目标文件夹  

作用同put hdfs dfs -moveFromLocal 源文件夹  目标文件夹  上传后删除本地

下载文件

命令格式 hdfs dfs -get 源文件夹  目标文件夹 

类似上传命令 

类似命令 hdfs dfs -copyToLocal 源文件夹  目标文件夹 

作用同get hdfs dfs -moveToLocal 源文件夹  目标文件夹  get后删除源文件

查看文件

内容命令格式 hadoop fs -cat path 

从头查看这个文件

 hadoop fs -tail path 从尾部查看最后1K 

使用示例 

 hadoop fs -cat /user/trunk/test.txt

 hadoop fs -tail /user/trunk/test.txt

fs  VS  dfs从两个命令的定义中可以看到这两者之间似乎没有什么区别。

 fs涉及到一个通用的文件系统,使用面最广,可以指向任何的文件系统,如local,hdfs等。 

但是dfs仅是针对hdfs的,只能操作HDFS文件系统相关,包括与Local FS间的操作。 什么时候用dfs,什么时候用fs? 

绝大部分都可以使用dfs命令。 仅在本地与hadoop分布式文件系统的交互操作中,可以考虑使用fs命令。

 hadoop fs  VS  hdfs dfs 两者的相同和不同。

猜你喜欢

转载自blog.csdn.net/qq_40586924/article/details/83927797
今日推荐