HDFS文件系统

一、HDFS概念

1.1 概念

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

HDFS的设计适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。

1.2 组成

1)HDFS集群包括,NameNode和DataNode以及Secondary Namenode。

2)NameNode负责管理整个文件系统的元数据,以及每一个路径(文件)所对应的数据块信息。

3)DataNode 负责管理用户的文件数据块,每一个数据块都可以在多个datanode上存储多个副本。

4)Secondary NameNode用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。

1.3 HDFS 文件块大小

HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M

HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。因而,传输一个由多个块组成的文件的时间取决于磁盘传输速率。

如果寻址时间约为10ms,而传输速率为100MB/s,为了使寻址时间仅占传输时间的1%,我们要将块大小设置约为100MB。默认的块大小实际为64MB,但是很多情况下HDFS使用128MB的块设置。

二、HDFS操作

2.1 基本语法

hadoop fs 具体命令

2.2 参数大全

bin/hadoop fs

img

2.3 常用命令实操

(1)-help:输出这个命令参数

​ hdfs dfs -help rm

(2)-ls: 显示目录信息

hadoop fs -ls /

(3)-mkdir:在hdfs上创建目录

hadoop fs -mkdir -p /aaa/bbb/cc/dd

(4)-moveFromLocal从本地剪切粘贴到hdfs

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

(5)-moveToLocal:从hdfs剪切粘贴到本地

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

(6)–appendToFile :追加一个文件到已经存在的文件末尾

hadoop fs -appendToFile ./hello.txt /hello.txt

(7)-cat :显示文件内容

(8)-tail:显示一个文件的末尾

hadoop fs -tail /weblog/access_log.1

(9)-text:以字符形式打印一个文件的内容

hadoop fs -text /weblog/access_log.1

(10)-chgrp 、-chmod、-chown:linux文件系统中的用法一样,修改文件所属权限

hadoop fs -chmod 666 /hello.txt

hadoop fs -chown someuser:somegrp /hello.txt

(11)-copyFromLocal:从本地文件系统中拷贝文件到hdfs路径去

hadoop fs -copyFromLocal ./jdk.tar.gz /aaa/

(12)-copyToLocal:从hdfs拷贝到本地

hadoop fs -copyToLocal /aaa/jdk.tar.gz

(13)-cp :从hdfs的一个路径拷贝到hdfs的另一个路径

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

(14)-mv:在hdfs目录中移动文件

hadoop fs -mv /aaa/jdk.tar.gz /

(15)-get:等同于copyToLocal,就是从hdfs下载文件到本地

hadoop fs -get /aaa/jdk.tar.gz

(16)-getmerge :合并下载多个文件,比如hdfs的目录 /aaa/下有多个文件:log.1, log.2,log.3,…

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

(17)-put:等同于copyFromLocal

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

(18)-rm:删除文件或文件夹

hadoop fs -rm -r /aaa/bbb/

(19)-rmdir:删除空目录

hadoop fs -rmdir /aaa/bbb/ccc

(20)-df :统计文件系统的可用空间信息

hadoop fs -df -h /

(21)-du统计文件夹的大小信息

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

(22)-count:统计一个指定目录下的文件节点数量

hadoop fs -count /aaa/

(23)-setrep:设置hdfs中文件的副本数量

hadoop fs -setrep 3 /aaa/jdk.tar.gz

三、HDFS客户端操作

3.1 eclipse准备环境

(1)jar包准备

1)解压hadoop-2.7.2.tar.gz到非中文目录

2)进入share文件夹,查找所有jar包,并把jar包拷贝到_lib文件夹下

3)在全部jar包中查找.source.jar,并剪切到_source文件夹。

4)在全部jar包中查找tests.jar,并剪切到_test文件夹。

(2)eclipse准备

1)配置HADOOP_HOME环境变量

2)创建第一个java工程

img

然后把jar都拷贝到java工程中,然后进行Build Path

​ 3)创建java类

img

​ 4)执行程序

客户端去操作hdfs时,是有一个用户身份的。默认情况下,hdfs客户端api会从jvm中获取一个参数来作为自己的用户身份:-DHADOOP_USER_NAME=atguigu,atguigu为用户名称。

这是一种方式:

img

另一种方式:

FileSystem fs = FileSystem.get(new URI(“hdfs://192.168.181.128:9000”), conf, “root”);

img

四、通过API操作HDFS

4.1 HDFS获取文件系统

img

4.2 上传文件

img

4.3 下载文件

img

4.4 创建目录

img

4.5 删除文件夹

img

4.6 修改文件名

img

4.7 文件详细查看

img

4.8 文件夹查看

img

五、通过IO流操作HDFS

5.1 文件上传

img

5.2 文件下载

img

六、HDFS的数据流

6.1 剖析文件写入

img

1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。

2)NameNode返回是否可以上传。(如果已经存在,会返回already exist)

3)客户端请求第一个 Block上传到哪几个DataNode服务器上。

4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。(距离近,负载小)

5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。

6)dn1、dn2、dn3逐级应答客户端。

7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。

8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。

6.2 网络拓扑-节点距离计算

在HDFS写数据的过程中,NameNode会选择距离待上传数据最近距离的DataNode接收数据。

节点距离:两个节点到达最近的共同祖先的距离总和。

img

http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Data_Replication

集群上默认的副本数是3,第一个和第二个,同一个机架,IO传输距离短,可以快速备份,考虑的是速度的问题;如果机架r1崩溃,所以必须在不同的机架上备份一个,考虑的是安全性的问题。

6.3 HDFS读数据流程

img

1)客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。

2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。

3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)

4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!