HDFS相关

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"

猜你喜欢

转载自my.oschina.net/u/2246410/blog/1801961