- HDFS 是什么?
HDFS 名称是(Hadoop Distributed File System )首字母缩写,即分布式文件存储系统,是Hadoop 大数据项目的一个子项目。是基于流数据模型访问和处理超大文件数据的需求而开发。具有高容错性,高可扩展性,高吞吐率等特性,为大数据集的应用提供了良好的应用。
另外 HDFS 来源于google 2003年发表的一篇论文,严格来说就是GFS(Google File System) 的克隆版。
- HDFS 的优点
1,高容错性
数据块Block 默认有3个副本 ,会自动保存数据,即使有丢失也会自动恢复。
2,大数据处理
能够处理超大数据 GB ,TB ,PB 量的数据。百万规模以上的文件数量。10k+节点
3,对机器要求低可以构建在廉价的机器上
通过多副本提高了可靠性,提供了容错和恢复机制。
4,流式访问
一次写入多次读取,文件一旦写入就不能修改只能追加。
5,适合批处理
通过移动计算而不是移动数据
把数据位置暴露给计算框架。
- HDFS 缺点
1,低延时数据场景访问不能用
只适合高吞吐的场景,也就是在某一段时间内读取大量的数据,但是在毫秒级内无法完成这么大的读取量。
2,小文件存储的场景不能用
小文件存储的寻道时间会比读取的时间长,这样就违背 了hdfs 的设计目标了。
过多的小文件会占用大量的nameNode 内存,这样得不偿失。
3,并发写入,随机修改场景不能用
一个文件只能有一个文件写入者,不能多线程写入,并且追加只能用 append.
- HDFS 系统架构
按我的理解可以分为4个角色:1,Client 客户端 2,NameNode 主管 3,SecondaryNameNode 辅助员 4,DataNode 执行员
1,客户端 Client
主要负责对上次道系统的文件进行切分成block 然后存储。
并且与NameNode 和 DataNode 交互文件的位置信息并写入数据。
提供一下命令管理hdfs 系统并关闭系统。
2, 主管 NameNode
处理客户端的请求
管理数据块block 的 映射信息 。
配置block 副本的策略
3, 辅助员 secondary NameNode
辅助主管完成其他的工作量
定期合并 fsimage 和 fsedits 并推送给 主管
4,执行员 DataNode
存储实际的数据块,完成读写文件操作
他们的关系如图:
- HDFS 如何读取文件
简单来说 就是, 打开 DistributedFileSystem 实例 向 NameNode获得文件的第一批block的locations
通过FSDataInputStream对象 Client 的read 方法 读取dataNode 数据。
- 放副本的策略
- DataNode(DN)
– 存储数据(Block) – 启动DN线程的时候会向NN汇报block信息 – 通过向NN发送心跳保持与其联系(3秒一次),如果NN 10分钟没有收 到DN的心跳,则认为其已经lost,并copy其上的block到其它DN
- NameNode(NN)
– NameNode主要功能:接受客户端的读写服务 – NameNode保存metadate信息包括 • 文件owership和permissions • 文件包含哪些块 • Block保存在哪个DataNode(由DataNode启动时上报) – NameNode的metadate信息在启动后会加载到内存 • metadata存储到磁盘文件名为”fsimage” • Block的位置信息不会保存到fsimage
• edits记录对metadata的操作日志
- HDFS 数据存储单元(block)
– 文件被切分成固定大小的数据块 • 默认数据块大小为64MB ,可配置 • 若文件大小不到64MB ,则单独存成一个block – 一个文件存储方式 • 按大小被切分成若干个block ,存储到不同节点上 • 默认情况下每个block都有三个副本 – Block大小和副本数通过Client端上传文件时设置,文件上传成功后副本 数可以变更,Block Size不可变更