目录
概述:
主要组件和架构:
文件操作流程:
读文件:
写文件:
HDFS命令:
创建目录:
查看文件列表:
上传文件到HDFS:
下载文件到本地:
查看HDFS文件内容:
HDFS即Hadoop分布式文件系统(Hadoop Distributed File System),它的设计目标是把超大数据集存储到网络中的多台普通商用计算机上,并提供高可靠性和高吞吐率的服务。分布式文件系统要比普通磁盘文件系统复杂,因为它要引入网络编程;分布式文件系统要容忍节点失效,这也是一个很大的挑战。
HDFS的设计前提和目标如下。
(1)专为存储超大文件而设计:HDFS应该能够支持GB级别大小的文件;它应该能够提供很大的数据带宽并且能够在集群中拓展到成百上千个节点;它的一个实例应该能够支持千万数量级别的文件。
(2)适用于流式的数据访问:HDFS适用于批处理的情况而不是交互式处理;它的重点是保证高吞吐量而不是低延迟的用户响应。
(3)容错性:完善的冗余备份机制。
(4)支持简单的一致性模型:HDFS需要支持一次写入多次读取的模型,而且写入过程文件不会经常变化。
(5)移动计算优于移动数据:HDFS提供了使应用计算移动到离它最近数据位置的接口。
(6)兼容各种硬件和软件平台。
HDFS不适合的场景如下。
(1)大量小文件:文件的元数据都存储在NameNode内存中,大量小文件意味着元数据的增加,会占用大量内存。
(2)低延迟数据访问:HDFS是专门针对高数据吞吐量而设计的。
(3)多用户写入:因为会导致一致性维护的困难。
HDFS主要由3个组件构成,分别是Name Node、SecondaryNameNode和DataNode, HDFS是以Master/Slave(主从)模式运行的,其中NameNode、SecondaryNameNode运行在Master节点,DataNode运行Slave节点上。NameNode和DataNode架构如图所示。
HDFS有一个文件系统实例,客户端通过调用这个实例的open()方法就可以打开系统中希望读取的文件。HDFS通过RPC调用NameNode获取文件块的位置信息,对于文件的每一个块,NameNode会返回含有该块副本的DataNode的节点地址。另外,客户端还会根据网络拓扑来确定它与每一个DataNode的位置信息,从离它最近的那个DataNode获取数据块的副本,最理想的情况是数据块就存储在客户端所在的节点上。HDFS会返回一个FSDataInputStream对象,FSDataInputStream类转而封装成DFSDataInputStream对象,这个对象管理着与DataNode和NameNode的I/O,具体过程是:
当FSDataInputStream与DataNode通信时遇到错误,它会选取另一个较近的DataNode,并为出故障的DataNode做标记以免重复向其读取数据。FSDataInputStream还会对读取的数据块进行校验和确认,发现块损坏时也会重新读取并通知NameNode。这样设计的巧妙之处有:
HDFS有一个分布式文件系统(Distribute File System,DFS)实例,客户端通过调用这个实例的create()方法就可以创建文件。DFS会发送给NameNode一个RPC调用,在文件系统的命名空间创建一个新文件,在创建文件前NameNode会做一些检查,看看文件是否存在,客户端是否有创建权限等。若检查通过,NameNode会为创建文件写一条记录到本地磁盘的EditLog;若不通过会向客户端抛出IOException。创建成功之后DFS会返回一个FSDataOutputStream对象,客户端由此开始写入数据。同读文件过程一样,
FSDataOutputStream类转而封装成DFSDataOutputStream对象,这个对象管理着与DataNode和NameNode的I/O,具体过程是:
创建目录用mkdir命令。在Hadoop上创建目录与在Linux上创建目录类似,根目录用“/”表示。下面是一些应用示例。
hadoop fs -mkdir /test
#创建文件及其子目录
hadoop fs -mkdir -p /dira/dirb
与Linux的ls命令类似,Hadoop也有一条查看文件列表的命令,其完整用法是hadoop fs ls <args>,其中<args>表示可选参数。
#显示文件及其子目录
hadoop fs -ls /
将文件从本地复制到HDFS集群称为文件上传。有两种命令可以使用,一种是“hadoop fs -put”,另一种是“hadoop fs -copyFromLocal”。
#将a.data上传到HDFS /test/input目录下
hadoop fs -put /home/a.data /test/input
将文件从HDFS集群复制到本地称为文件下载。有两种命令可以使用,一种是“hadoop fs -get”,另一种是“hadoop fs -copyToLocal”。
#将HDFS上的/test/input/a.data 下载到 /home/hadoop目录下
Hadoop fs - get /test/input/a.data /home/hadoop
hadoop fs -text /input/a.txt
hadoop fs -cat /input/b.txt
hadoop fs -tail /input/c.txt
删除HDFS文件:
可以用“hadoop fs -rm”删除HDFS集群中的文件。
hadoop fs -rm /test/input/a.txt