在成功启动HDFS集群之后,我们就该考虑如何使用HDFS了,这里我们分两块来讲,先说查看HDFS集群状态和常用命令介绍。再讲一下HDFS的工作机制。

一、查看整个HDFS集群状态。我们有两个办法可以查看。

1.使用命令行:

hdfs  dfsadmin  –report

效果如图:

Java链接Hadoop查询 hadoop 查询_HDFS

2.Web控制台,打开浏览器输入:

http://namenodeIP:50070/

效果如图:

Java链接Hadoop查询 hadoop 查询_HDFS常用操作_02

二、常用命令介绍:

1.查看HDFS中的目录信息
hadoop  fs  –ls  /
2.上传文件到hdfs
hadoop  fs  -put(等于copyFromLocal)  filename  to  /
3.从hdfs下载文件
hadoop  fs  -get(等于copyToLocal)  /filename
4.在hdfs上创建目录
hadoop fs  -mkdir  -p  /aaa/bbb/cc/dd
5.追加一个文件到已经存在的文件末尾
hadoop  fs  -appendToFile  ./filename  /filename
6.显示文件内容
hadoop fs -cat  /filename
7.显示一个文件的末尾
hadoop  fs  -tail  /filename
8.以字符形式打印一个文件的内容
hadoop  fs  -text  /filename
9.修改文件权限
hadoop  fs  -chmod  777  /filename
10.从hdfs的一个路径拷贝hdfs的另一个路径
hadoop fs -cp  /path  /path
11.在hdfs目录中移动文件
hadoop fs -mv  /path  /path
12.合并下载多个文件
hadoop fs -getmerge /src /dest
13.删除文件或文件夹
hadoop fs -rm -r /filename
14.删除空目录
hadoop  fs  -rmdir   /path
15.统计文件系统的可用空间信息
hadoop fs -df  -h  /
16.统计文件夹的大小信息
hadoop  fs  -du  -s  -h /path
17.统计一个指定目录下的文件节点数量
hadoop fs -count /path
18.设置hdfs中文件的副本数量
hadoop fs -setrep num /filename

掌握了这些常用命令,应对一般的操作应该就没有问题了。

三、HDFS的工作机制。

首先介绍一下它的特性:

1.    HDFS集群分为两大角色:NameNode、DataNode
2.    NameNode负责管理整个文件系统的元数据
3.    DataNode 负责管理用户的文件数据块
4.    文件会按照固定的大小(blocksize)切成若干块后分布式存储在若干台datanode上
5.    每一个文件块可以有多个副本,并存放在不同的datanode上
6.    Datanode会定期向Namenode汇报自身所保存的文件block信息,而namenode则会负责保持文件的副本数量
7.    HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向namenode申请来进行

HDFS写流程:
1、client跟namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在
2、namenode返回是否可以上传
3、client请求第一个 block该传输到哪些datanode服务器上
4、namenode返回3个datanode服务器ABC
5、client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将真个pipeline建立完成,逐级返回客户端
6、client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答
7、当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。

HDFS读流程:
1、client跟namenode通信查询元数据,找到文件块所在的datanode服务器
2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流
3、datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验)
4、客户端以packet为单位接收,现在本地缓存,然后写入目标文件

Namenode职责:
1.负责客户端请求的响应
2.元数据的管理(查询,修改)
我们主要说说元数据的管理,namenode对数据的管理采用了三种存储形式:
1.内存元数据(metedata)--内存中有一份完整的元数据
2.磁盘元数据镜像文件(fsimage)--磁盘有一个“准完整”的元数据镜像
3.数据操作日志文件(edits文件)用于衔接内存metadata和持久化元数据镜像fsimage之间的操作日志,可通过日志运算出元数据
当客户端对hdfs中的文件进行新增或者修改操作,操作记录首先被记入edits日志文件中,当客户端操作成功后,相应的元数据会更新到内存meta.data中。
元数据的checkpoint:
每隔一段时间,会由secondary namenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行merge,这个过程称为checkpoint。
由于namenode和secondary namenode的工作目录存储结构完全相同,所以,当namenode故障退出需要重新恢复时,可以从secondary namenode的工作目录中将fsimage拷贝到namenode的工作目录,以恢复namenode的元数据

Datanode职责:
1.存储管理用户的文件块数据
2.通过心跳消息机制,定期向namenode汇报自身所持有的block信息
需要注意的是Datanode掉线判断时限参数
datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长。HDFS默认的超时时长为10分钟+30秒。如果定义超时时间为timeout,则超时时长的计算公式为:
    timeout  = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval。
    而默认的heartbeat.recheck.interval 大小为5分钟,dfs.heartbeat.interval默认为3秒。
    需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。所以,举个例子,如果heartbeat.recheck.interval设置为5000(毫秒),dfs.heartbeat.interval设置为3(秒,默认),则总的超时时间为40秒。