HDFS(Hadoop Distributed File System ) 是Hadoop 项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件而开发的,能够运行于廉价商用服务器上。它具备高容错、高可靠性、高可扩展性、搞得到性、高吞吐率等特征为海量数据提供了不怕故障的存储,为超大数据集(Large Data Set)的应用处理带来了不少便利。node
原理
-
存储方式:服务器
- 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节点的规模。
- 流式文件访问:
- 一次写入,屡次读取。文件一旦写入不能修改们只能追加。
- 保证数据的一致性
- 可构建在廉价机器上:
- 经过多副本机制,提升可靠性
- 提供了容错和恢复机制。好比某一副本丢失,能够经过其它副原本恢复。
-
缺点:app
- 作不到低延时数据访问:
- 好比毫秒级访问数据
- 适合高吞吐率的场景,就是在某一时间内写入大量的数据。
- 小文件存储:
- 存储大量小文件(这里的小文件是指小于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把文件标识为已完成。


安装
命令
'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"