HDFS(Hadoop Distributed File System ) 是Hadoop 项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件而开发的,可以运行于廉价商用服务器上。它具有高容错、高可靠性、高可扩展性、搞获得性、高吞吐率等特征为海量数据提供了不怕故障的存储,为超大数据集(Large Data Set)的应用处理带来了很多便利。
原理
-
存储方式:
- HDFS采用 Master/Slave 的架构来存储数据,这种架构主要由四个部分组成:HDFS Client、NameNode、DataNode和 Secondary NameNode
- Client:
- 文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行存储。
- 与NameNode交互,获取文件的位置信息。
- 与DataNode交互,读取或写入数据。
- Client提供一些命令来管理HDFS,比如启动或者关闭HDFS。
- Client可以通过命令来访问HDFS。
- NameNode:就是master,是一个主管、管理者
- 管理HDFS的名称空间
- 管理数据块(Block)映射信息
- 配置副本策略
- 处理客户端读写请求
- DataNode:就是Slave。NameNode下达命令,Data执行实际的操作。
- 存储实际的数据块。
- 执行数据块的读/写操作。
- Sencondary NameNode:并非NameNode热备。当NameNode挂掉的时候,它并不能马上替换 NameNode 并提供服务。
- 辅助NameNode,分担其工作量。
- 定期合并 fsimage和fsedits,并推送给NameNode。
- 在紧急情况下,可辅助恢复NameNode。
-
图片
-
优点:
- 高容错:
- 数据自动保存多个副本,通过增加副本的形式,提高容错性。
- 某个副本丢失后,它可以自动恢复。
- 适合批处理:
- 处理数据达到 GB、TB、PB级别
- 处理百万规模以上的文件数量,数量相当之大
- 处理10K节点的规模。
- 流式文件访问:
- 一次写入,多次读取。文件一旦写入不能修改们只能追加。
- 保证数据的一致性
- 可构建在廉价机器上:
- 通过多副本机制,提高可靠性
- 提供了容错和恢复机制。比如某一副本丢失,可以通过其它副本来恢复。
- 高容错:
-
缺点:
- 做不到低延时数据访问:
- 比如毫秒级访问数据
- 适合高吞吐率的场景,就是在某一时间内写入大量的数据。
- 小文件存储:
- 存储大量小文件(这里的小文件是指小于HDFS系统的Block大小的文件默认64M)的话,它会占用NameNode大量的内存来存储文件、目录和快信息。这样是不可取的,因为NameNode的内存总是有限的。
- 小文件存储的寻道时间会超过读取时间,它违反了HDFS的设计目标。
- 并发写入、文件随机修改
- 一个文件只能有一个写,不允许多个线程同时写。
- 仅支持数据append(追加),不支持文件的随机修改。
- 做不到低延时数据访问:
读写操作:
-
读操作
- Client调用FileSystem对象的open()方法,获取一个DistributedFileSystem实例。
- DistributedFileSystem 通过RPC(远程过程调用)获取文件的第一批block的locations,同一Block安装重复数会返回多个locations,这些locations安装Hadoop拓扑结构排序,举例客户端近的牌子前面。
- 前两步会返回一个 FSDataInputStream对象,该对象被封装成DFSInputStream对象,DFSInputStream可以方便的管理 datanode和 namenode数据流。
- 客户端调用read方法,DFSInputStream就会找出力客户端最近的datanode并连接datanode。
- 数据从datanode流向客户端。
- 如果一个block的数据读完了,就会关闭指向第一个block块的datanode连接,接着读取下一个block块。(这些操作对客服端来说是透明的,从客户端的解读来看只是读一个持续不端的流)
- 如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的locations,然后继续读。
- 读完所有block块,关闭流。
-
写操作
- 客服端通过调用 DistributedFileSystem 的create()方法,创建一个新的文件。
- DistributedFileSystem通过 RPC(远程过程调用)调用NameNode,去创建一个没有blocks关联的新文件。
- 创建前,NameNode会做各种校验,比如文件是否存在,客户端有无关系去创建等。
- 如果校验通过,NameNode就会记录下新文件,否则就会抛出IO异常。
- 前两步结束后返回 FSDataOutPutStream 的对象,然后被封装成DFSOutputStream,DFSOutPutStream可以协调 NameNode和DataNode。
- 客户端开始写数据到 DFSOutputStream,DFSOutputStream 会把数据切成一个一个小packet,然后排成队列 data queue。
- DataStreamer 会接受data queue
- 它先询问NameNode这个新的block 最合适存储在哪几个DataNode里,比如重复数是3,那么就找到3个最合适的DataNode,把它们排成一个Pipeline。DataStreamer 把packet 按队列输出到管道的第一个DataNode中,第一个DataNode又把packet输出到第二个DataNode中,以此类推。
- DFSOutPutStrem 还有个队列叫 ack queue,也是由 packet组成,等待DataNode的收到响应,当pipeline中的所有DataNode都表示已经收到的时候,这时 ack queue才会把对应的packet包移除掉。
- 客户端完成写数据后,调用close方法并关闭写入流。
- DataStreamer 把剩余的包都刷到pipeline里,然后等待ack信息,收到最后一个ack后,通知DataNode把文件标识为已完成。
-
HDFS的副本策略
安装
命令
'hadoop fs'
hadoop fs -ls /
hadoop fs -lsr
hadoop fs -mkdir /user/hadoop
hadoop fs -put a.txt /user/hadoop/
hadoop fs -get /user/hadoop/a.txt /
hadoop fs -cp src dst
hadoop fs -mv src dst
hadoop fs -cat /user/hadoop/a.txt
hadoop fs -rm /user/hadoop/a.txt
hadoop fs -rmr /user/hadoop/a.txt
hadoop fs -text /user/hadoop/a.txt
hadoop fs -copyFromLocal localsrc dst 与hadoop fs -put功能类似。
hadoop fs -moveFromLocal localsrc dst 将本地文件上传到hdfs,同时删除本地文件。
"hadoop fsadmin"
hadoop dfsadmin -report
hadoop dfsadmin -safemode enter | leave | get | wait
hadoop dfsadmin -setBalancerBandwidth 1000
"hadoop fsck"
"start-balancer.sh"