Hadoop入门2--HDFS

本文介绍了Hadoop分布式文件系统(HDFS)的基本概念、设计目标和重要特性,包括NameNode和DataNode的角色,以及HDFS的写入和读取流程。HDFS适用于大数据存储,支持一次写入、多次读出的访问模型,具有副本机制以保证容错性。

HDFS入门

1.HDFS基本概念

1.1    HDFS介绍

HDFS是 Hadoop Distribute File System的简称,意为: Hadoop分布式文件系统。是 Hadoop核心组件之一,作为最底层的分布式存储服务而存在。

分布式文件系统解决的问题就是大数据存储。它们是横跨在多台计算机上的存储系统。分布式文件系统在大数据时代有着广泛的应用前景,它们为存储和处理超大规模数据提供所需的扩展能力。    

1.2    HDFS设计目标

1)硬件故障是常态,HDFS将有成百上千的服务器组成,每一个组成部分都有可能出现故障。因此故障的检测和自动快速恢复是HDFS的核心架构目标。


2)HDFS上的应用与一般的应用不同,它们主要是以流式读取数据。HDFS被设计成适合批量处理,而不是用户交互式的。相较于数据访问的反应时间,更注重数据访问的高吞吐量。


3)典型的HDFS文件大小是GB到TB的级别。所以,HDFS被调整成支持大文件。它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件。


4)大部分HDFS应用对文件要求的是 write-one-read-many访问模型。一个文件一旦创建、写入、关闭之后就不需要修改了。这一假设简化了数据一致性问题,使高吞吐量的数据访问成为可能。


5)移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效,这在数据达到海量级别的时候更是如此。将计算移动到数据附近,比之将数据移动到应用所在显然更好。

 

6)在异构的硬件和软件平台上的可移植性,这将推动需要大数据集的应用更广泛的采用HDFS作为平台。

 

2.HDFS 的重要特性  

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

 

2.1.     master/ slave架构

HDFS采用 master/ slave架构。一般一个HDFS集群是有一个 Namenode和一定数目的 Datanode组成。 Namenode是HDFS集群主节点, Datanode是HDFS集群从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。

2.2.    分块存储

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

 

 

2.3.    名字空间( NameSpace)

HDFS支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。

Namenode负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被 Namenode记录下来。

HDFS会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如: hdfs: //namenode: port/dir-a/dir-b/dir-c/file.data.

 

2.4.    Namenode元数据管理

我们把目录结构及文件分块位置信息叫做元数据。 Namenode负责维护整个hdfs文件系统的目录树结构,以及每一个文件所对应的 block块信息( block的id,及所在的 datanode服务器)

 

2.5.     Datanode数据存储

文件的各个 block的具体存储管理由 datanode节点承担。每一个 block都可以在多个 datanode上。 Datanode需要定时向 Namenode汇报自己持有的 block信息。

存储多个副本(副本数量也可以通过参数设置dfs. replication,默认是3)。

 

2.6.    副本机制

为了容错,文件的所有 block都会有副本。每个文件的 block大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变.

 

2.7.    一次写入,多次读出

HDFS是设计成适应一次写入,多次读出的场景,且不支持文件的修改。

正因为如此,HDFS适合用来做大数据分析的底层存储服务,并不适合用来做.网盘等应用,因为,修改不方便,延迟大,网络开销大,成本太高。

 

3.HDFS基本操作

3.1.     Shell命令行客户端

Hadoop提供了文件系统的 shell命令行客户端,使用方法如下:

hadoop    fs     <args>

文件系统shell包括与 Hadoop分布式文件系统(HDFS)以及 Hadoop支持的其他文件系统(如本地FS, HFTP FS,S3  FS等)直接交互的各种类似 shell的命令。所有 FS shell命令都将路径URI作为参数。

URI格式为 scheme:// authority/path。对于HDFS,该 scheme是hdfs,对于本地FS,该 scheme是file, scheme和 authority是可选的。如果未指定,则使用配置中指定的默认方案。

对于HDFS,命令示例如下:

hadoop fs -ls hdfs: //namenode: host/parent/child        这个是完整的写法

hadoop fs -ls /parent/ child                                 fs.defaultFS中有配置

对于本地文件系统,命令示例如下

hadoop fs -Is file: ///root/

如果使用的文件系统是HDFS,则使用 hdfs dfs也是可以的,此时
hadoop fs <args>= hdfs  dfs  <args>

 

3.2.    shell命令选项

3.3. Shell常用命令介绍

-ls

使用方法: hadoop fs-ls [-h] [-R] <args>
功能:显示文件、目录信息。
示例: hadoop fs -ls /user/ hadoop/file


-mkdir
使用方法: hadoop fs  -mkdir  [-p] < paths>
功能:在hdfs上创建目录,-p    表示会创建路径中的各级父目录。
示例: hadoop fs -mkdir -p /user/ hadoop/dir1


-put
使用方法: hadoop  fs  -put  [-f]  [-p]  [-|< localsrc1>..]. <dst>
功能:将单个src或多个srcs从本地文件系统复制到目标文件系统。
        -p:    保留访问和修改时间,所有权和权限。
        -f:    覆盖目的地(如果已经存在)
示例: hadoop fs -put -f  localfile1  localfile2  /user/hadoop/hadoopdir

 

-get
使用方法: hadoop fs-get  [- Ignorecrc] [-crc] [-p] [-f] <src>  <localdst>
        -Ignorecrc:    跳过对下载文件的CRC检查。
        -crc:    为下载的文件写CRC校验和。
功能:将文件复制到本地文件系统。

示例: hadoop fs -get hdfs: //host: port/user/hadoop/file   localfile

-appendToFile
使用方法: hadoop fs -appendToFile < locals>...<dst>
功能:追加一个文件到已经存在的文件末尾

示例: hadoop  fs  -appendTofile  localfile  /hadoop/hadoopfile

-cat
使用方法: hadoop fs -cat  [-ignoreCrc]  URI  [URI..]
功能:显示文件内容倒 stdout

示例: hadoop fs  -cat  /hadoop/hadoopfile

-tail
使用方法: hadoop fs  -tail  [-f]  URI
功能:将文件的最后一千字节内容显示到 stdout
        -f:    将在文件增长时输出附加数据。

示例: hadoop fs -tail  /hadoop/hadoopfile

-chgrp
使用方法: hadoop fs -chgrp [-R] GROUP URI [URI..]
功能:更改文件组的关联。用户必须是文件的所有者,否则是超级用户。
        -R:    将使改变在目录结构下递归进行。

示例: hadoop fs -chgrp othergroup  /hadoop/hadoopfile

-chmod
功能:改变文件的权限。使用-R将使改变在目录结构下递归进行。

示例: hadoop fs- chmod  666  /hadoop/ hadoopfile

-chown
功能:改变文件的拥有者。使用-R将使改变在目录结构下递归进行。
示例: hadoop fs -chown someuser: somegrp  /hadoop/hadoopfile

-cp
功能:从hdfs的一个路径拷贝hdfs的另一个路径
示例: hadoop fs -cp  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz.2

 

- mv
功能:在hdfs目录中移动文件
示例: hadoop fs- mv  /aa/jdk.tar.gz   /


-getmerge
功能:合并下载多个文件
示例:比如hdfs的目录/aaa/下有多个文件:log.1,log.2,log.3,
hadoop fs -getmerge /aaa/log.*  /log.sum


-rm
功能:删除指定的文件。只删除非空目录和文件。-r递归删除。
示例: hadoop fs -rm -r   /aa/bbb/

 

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

示例: hadoop fs -df  -h

-du
功能:显示目录中所有文件大小,当只指定一个文件时,显示此文件的大小。

示例: hadoop fs  -du  /user/ hadoop/dir1

-setrep
功能:改变一个文件的副本系数。-R选项用于递归改变目录下所有文件的副本
系数。

示例: hadoop fs -setrep -w 3 -R   /user/hadoop/dir1

 

4.HDFS基本原理

4.1.     NameNode概述

a、 Namenode是HDFS的核心。
b、 NameNode也称为 Master
c、 Namenode仅存储HDFS的元数据:文件系统中所有文件的目录树,并跟踪整个集群中的文件
d、 NameNode不存储实际数据或数据集。数据本身实际存储在 DataNodes中
e、 NameNode知道HDFS中任何给定文件的块列表及其位置。使用此信息NameNode知道如何从块中构建文件。
f、 Name Node并不持久化存储每个文件中各个块所在的 DataNode的位置信息,这些信息会在系统启动时从数据节点重建
g、 Name Node对于HDFS至关重要,当 NaneNode关闭时,HDFS/ Hadoop集群无法访问。
h、 NameNode是 Hadoop集群中的单点故障。

i、 NameNode所在机器通常会配置有大量内存(RAM)。

 

4.2.     DataNode概述

a、 DataNode负责将实际数据存储在HDFS中。
b、 DataNode也称为 Slave
c、 NameNode和 DataNode会保持不断通信。
d、 DataNode启动时,它将自己发布到 NameNode并汇报自己负责持有的块列表。当某个 DataNode关闭时,它不会影响数据或群集的可用性。 NameNode将安排由其他 DataNode管理的块进行副本复制。
f、 Datanode所在机器通常配置有大量的硬盘空间。因为实际数据存储在DataNode中。
g、 DataNode会定期( dfs.heartbeat. interval配置项配置,默认是3秒)向NameNode发送心跳,如果 Name Node长时间没有接受到 DataNode发送的心跳, NameNode就会认为该 DataNode失效。

h、 block汇报时间间隔取参数dfs. blockreport. intervalMsec,参数未配置的话默认为6小时

 

4.3.    HDFS的工作机制

NameNode负责管理整个文件系统元数据; DataNode负责管理具体文件数据块存储: Secondary Name Node协助 NameNode进行元数据的备份

HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向NameNode申请来进行。

 

4.4.HDFS写数据流程

详细步骤解析:
1、 client发起文件上传请求,通过RPC与 NameNode建立通讯, NameNode检查目标文件是否已存在,父目录是否存在,返回是否可以上传
2、 client请求第一个 block该传输到哪些 DataNode服务器上;
3、 NameNode根据配置文件中指定的备份数量及机架感知原理进行文件分配,返回可用的 DataNode的地址如:A,B,C:
注: Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份,同机架内其它某一节点上一份,不同机架的某一节点上一份。
4、 client请求3台 DataNode中的一台A上传数据(本质上是一个RPC调用,建立 pipeline),A收到请求会继续调用B,然后B调用C,将整个pipeline建立完成,后逐级返回 client;
5、 client开始往A上传第一个 block(先从磁盘读取数据放到一个本地内存缓存),以 packet为单位(默认64K),A收到一个 packet就会传给B,B传给C;A每传一个 packet会放入一个应答队列等待应答。
6、数据被分割成一个个 packet数据包在 pipeline上依次传输,在pipeline反方向上,逐个发送ack(命令正确应答),最终由 pipeline中第一个 DataNode节点A将 pipeline ack发送给 client;

7、当一个 block传输完成之后, client再次请求 NameNode上传第二个block到服务器。

 

4.5.    HDFS读数据流程

详细步骤解析:
1、 Client向 NameNode发起RPC请求,来确定请求文件 block所在的位置
2、 Name Node会视情况返回文件的部分或者全部 block列表,对于每个 block,NameNode都会返回含有该 block副本的 DataNode地址;
3、这些返回的DN地址,会按照集群拓扑结构得出 DataNode与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client近的排靠前:心跳机制中超时汇报的DN状态沟 STALE,这样的排靠后
4、 Client选取排序靠前的 DataNode来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据
5、底层上本质是建立 Socket stream( FSDataInputStream),重复的调用父类 DataInputStream的read方法,直到这个块上的数据读取完毕;
6、当读完列表的 block后,若文件读取还没有结束,客户端会继续向NameNode获取下一批的 block列表;
7、读取完一个 block都会进行 checksum验证,如果读取 DataNode时出现错误,客户端会通知NameNode,然后再从下一个拥有该block副本的DataNode继读。
8、read方法是并行的读取 block信息,不是一块一块的读取: NameNode只是返回 Client请求包含块的 DataNode地址,并不是返回请求块的数据

9、最终读取来所有的 block会合并成一个完整的最终文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值