HDFS相关

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把文件标识为已完成。

输入图片说明

  • 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"
相关文章
相关标签/搜索