1.HDFS的概念和特性

  首先,它是一个文件系统,用于存储文件,通过统一的命名空间——目录树来定位文件其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色;

重要特性如下:

  1. HDFS中的文件在物理上是分块存储(block,块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M
  2. HDFS文件系统会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
  3. 目录结构及文件分块信息(元数据)的管理由namenode节点承担,namenode是HDFS集群主节点,负责维护整个hdfs文件系统的目录树,以及每一个路径(文件)所对应的block块信息(block的id,及所在的datanode服务器)
  4. 文件的各个block的存储管理由datanode节点承担,datanode是HDFS集群从节点,每一个block都可以在多个datanode上存储多个副本(副本数量也可以通过参数设置dfs.replication)
  5. HDFS是设计成适应一次写入,多次读出的场景,且不支持文件的修改

(注:适合用来做数据分析,并不适合用来做网盘应用,因为,不便修改,延迟大,网络开销大,成本太高)

 2.常用命令参数介绍

-help            

功能:输出这个命令参数手册

-ls                 

功能:显示目录信息

示例: hadoop fs -ls hdfs://hadoop-server01:9000/

备注:这些参数中,所有的hdfs路径都可以简写

-->hadoop fs -ls /   等同于上一条命令的效果

-mkdir             

功能:在hdfs上创建目录

示例:hadoop fs  -mkdir  -p  /aaa/bbb/cc/dd

-moveFromLocal           

功能:从本地剪切粘贴到hdfs

示例:hadoop  fs  - moveFromLocal  /home/hadoop/a.txt  /aaa/bbb/cc/dd

-moveToLocal             

功能:从hdfs剪切粘贴到本地

示例:hadoop  fs  - moveToLocal   /aaa/bbb/cc/dd  /home/hadoop/a.txt

--appendToFile 

功能:追加一个文件到已经存在的文件末尾

示例:hadoop  fs  -appendToFile  ./hello.txt  hdfs://hadoop-server01:9000/hello.txt

可以简写为:

Hadoop  fs  -appendToFile  ./hello.txt  /hello.txt

 

-cat 

功能:显示文件内容

示例:hadoop fs -cat  /hello.txt

 

-tail                

功能:显示一个文件的末尾

示例:hadoop  fs  -tail  /weblog/access_log.1

-text                 

功能:以字符形式打印一个文件的内容

示例:hadoop  fs  -text  /weblog/access_log.1

-chgrp

-chmod

-chown

功能:linux文件系统中的用法一样,对文件所属权限

示例:

hadoop  fs  -chmod  666  /hello.txt

hadoop  fs  -chown  someuser:somegrp   /hello.txt

-copyFromLocal   

功能:从本地文件系统中拷贝文件到hdfs路径去

示例:hadoop  fs  -copyFromLocal  ./jdk.tar.gz  /aaa/

-copyToLocal     

功能:从hdfs拷贝到本地

示例:hadoop fs -copyToLocal /aaa/jdk.tar.gz

-cp             

功能:从hdfs的一个路径拷贝hdfs的另一个路径

示例: hadoop  fs  -cp  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz.2

 

-mv                    

功能:在hdfs目录中移动文件

示例: hadoop  fs  -mv  /aaa/jdk.tar.gz  /

-get             

功能:等同于copyToLocal,就是从hdfs下载文件到本地

示例:hadoop fs -get  /aaa/jdk.tar.gz

-getmerge            

功能:合并下载多个文件

示例:比如hdfs的目录 /aaa/下有多个文件:log.1, log.2,log.3,...

hadoop fs -getmerge /aaa/log.* ./log.sum

-put               

功能:等同于copyFromLocal

示例:hadoop  fs  -put  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz.2

 

-rm               

功能:删除文件或文件夹

示例:hadoop fs -rm -r /aaa/bbb/

 

-rmdir                 

功能:删除空目录

示例:hadoop  fs  -rmdir   /aaa/bbb/ccc

-df              

功能:统计文件系统的可用空间信息

示例:hadoop  fs  -df  -h  /

 

-du

功能:统计文件夹的大小信息

示例:

hadoop  fs  -du  -s  -h /aaa/*

 

-count        

功能:统计一个指定目录下的文件节点数量

示例:hadoop fs -count /aaa/

 

-setrep               

功能:设置hdfs中文件的副本数量

示例:hadoop fs -setrep 3 /aaa/jdk.tar.gz

<这里设置的副本数只是记录在namenode的元数据中,是否真的会有这么多副本,还得看datanode的数量>

 

 

3.HDFS原理篇

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

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

  

hdfs 目录存在副本 hdfs目录结构_hdfs

    1、根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的服务器。

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

   

hdfs 目录存在副本 hdfs目录结构_hdfs_02

 

    1、跟namenode通信查询元数据,找到文件块所在的datanode服务器

    2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流

    3、datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验)

    4、客户端以packet为单位接收,现在本地缓存,然后写入目标文件

  3.NAMENODE工作机制:
    
学习目标:理解namenode的工作机制尤其是元数据管理机制,以增强对HDFS工作原理的理解,及培养hadoop集群运营中“性能调优”、“namenode”故障问题的分析解决能力

NAMENODE职责:负责客户端请求的响应。元数据的管理(查询,修改)

   元数据管理:namenode对数据的管理采用了三种存储形式:

   内存元数据(NameSystem) 元数据存放在内存这样才高效,

   磁盘元数据镜像文件  其次要有备份才安全,所以在namenode节点所对应的磁盘上有相应的备份

   数据操作日志文件(可通过日志运算出元数据) ,但是如果内存中一有数据变动就跟新到磁盘效率必然很低,所以需要弄个操作日志文件

元数据存储机制:

A、内存中有一份完整的元数据(内存meta data)

B、磁盘有一个“准完整”的元数据镜像(fsimage)文件(在namenode的工作目录中)

C、用于衔接内存metadata和持久化元数据镜像fsimage之间的操作日志(edits文件注:当客户端对hdfs中的文件进行新增或者修改操作,操作记录首先被记入edits日志文件中,当客户端操作成功后,相应的元数据会更新到内存meta.data

元数据的checkpoint:每隔一段时间,会由secondary namenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行merge(这个过程称为checkpoint),checkpoint的作用:namenode和secondary namenode的工作目录存储结构完全相同,所以,当namenode故障退出需要重新恢复时,可以从secondary namenode的工作目录中将fsimage拷贝到namenode的工作目录,以恢复namenode的元数据。

hdfs 目录存在副本 hdfs目录结构_hdfs_03

4.DATANODE的工作机制:Datanode工作职责:存储管理用户的文件块数据定期向namenode汇报自身所持有的block信息(通过心跳信息上报)这点很重要,因为,当集群中发生某些block副本失效时,集群如何恢复block初始副本数量的问题)

5.HDFS的java操作:hdfs在生产应用中主要是客户端的开发,其核心步骤是从hdfs提供的api中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件

 具体实现见文档大数据离线计算2

接下来查看hdfs的目录树:首先需要给linux安装tree命令:

yum install gcc 
yum install gcc-c++ 
# 下载
wget http://mama.indstate.edu/users/ice/tree/src/tree-1.7.0.tgz
tar zxvf tree-1.7.0.tgz 
cd tree-1.7.0
make
cp tree /bin
给linux安装telnet命令:
Sudo yum install xinetd
yum install telnet
yum install telnet-server

 查询hdfs下的文件夹hadoop fs –ls /

 创建hdfs下的文件夹  hadoop fs -mkdir /test

 

hdfs 目录存在副本 hdfs目录结构_客户端_04

 问题:没有找到主机路由:

hdfs 目录存在副本 hdfs目录结构_hdfs_05

 防火墙没有关的原因:
查看防火墙是否开启:sudo  service iptables status

hdfs 目录存在副本 hdfs目录结构_客户端_06

关闭防火墙:sudo service iptables stop

hdfs 目录存在副本 hdfs目录结构_hdfs_07

hdfs 目录存在副本 hdfs目录结构_hadoop_08

删除文件系统根目录下的文件:

hadoop fs -rmr /a.txt

创建文件夹:

hadoop fs -mkdir -p /aaa/bbb

用tree命令查看hdfs的树结构:

hdfs 目录存在副本 hdfs目录结构_hdfs 目录存在副本_09

查看文件的大小:

hdfs 目录存在副本 hdfs目录结构_hdfs_10

 案例:没有name ,尝试从SecondaryNameNode恢复数据

 把name干掉:rm –rf name

hdfs 目录存在副本 hdfs目录结构_客户端_11

hdfs 目录存在副本 hdfs目录结构_hdfs 目录存在副本_12

再把namenode的进程杀掉:

hdfs 目录存在副本 hdfs目录结构_hdfs 目录存在副本_13

Hadoop不能运行了:

hdfs 目录存在副本 hdfs目录结构_客户端_14

尝试恢复:SecondaryNameNode里面有的才能恢复,没有就不能恢复

hdfs 目录存在副本 hdfs目录结构_hdfs 目录存在副本_15

更安全的做法是让edits操作日志写到多个磁盘上去 namenode的工作目录

配置文件:

hdfs 目录存在副本 hdfs目录结构_hadoop_16

查看集群的状态:

hdfs dfsadmin –report

hdfs 目录存在副本 hdfs目录结构_客户端_17