问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

HDFS相关

创作时间:
作者:
@小白创作中心

HDFS相关

引用
1
来源
1.
https://www.cnblogs.com/fxl-xyz/p/18255265

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"
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号