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 两者的相同和不同。