欢迎关注我的CSDN: https://blog.csdn.net/bingque6535
一. HDFS概述
1. HDFS产出背景及定义
- HFDS产生的背景
随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。 - HDFS的定义
HDFS(Hadoop Distributed File System),它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
2. HDFS的优缺点
- 优点
- 高容错性
数据自动保存多个副本. 可以通过增加副本的形式, 提高容错性.
某一个副本丢失以后, 它可以自动恢复. - 适合批处理
计算向数据移动 - 适合处理大数据
数据规模: 处理数据规模可达TB, 甚至是PB级别
文件规模: 处理文件数量可达百万级别 - 可构建在廉价机器上, 通过多副本机制, 提高可靠性
- 高容错性
- 缺点
- 不适合低延时数据访问
- 无法高效的对大量小文件进行存储,
占用NameNode大量的内存来存储文件目录和块信息
寻道时间超过读取时间,就违反了HDFS的设计目标。
- 不支持并发写入和文件随机修改
一个文件只能有一个写, 不允许多个线程同时写
仅支持数据append(追加), 不支持文件的随机修改.
3. HDFS的组成架构
1. NameNode(NN)
- 基于内存存储, 不与磁盘发生交换
- NameNode主要功能
- 收集DataNode汇报的Block列表信息
- 处理客户端读写请求
- 管理HDFS的命名空间
- 配置副本策略
- NameNode保存metadata信息包括:
- 文件owership 和 permissions
- 文件大小, 时间
- Block列表: 偏移量, 位置信息(持久化不存)
- Block每个副本的位置, 由DataNode上报
- NameNode持久化
- NameNode的metadata信息在启动后会加载到内存
- metadata存储到磁盘文件名为”fsimage”(时点备份)
- Block的位置信息不会保存到fsimage
- edits记录对metadata的操作日志 -> Redis
- 二者的产生时间和过程?(format)
2. DataNode(DN)
- 存储实际的Block
- 存储Block的元数据信息文件
- 启动DataNode是会向NameNode汇报block信息
- 执行数据库的读/写操作
- DataNode与NameNode保持心跳, 提交Block列表
3. Client
- 文件切分, 文件上传HDFS时, Client将文件切分成一个一个的Block, 然后上传
- 与NameNode交互, 获取文件的位置信息
- 与DataNode交互, 读取或写入数据
4. Secondary NameNode
- 并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务
- 帮助NameNode合并edits log, 减少NameNode的启动时间
- 在紧急情兄下,可辅助恢复NarmeNode
- SNN执行合并的时机
- 根据配置文件设置的时间间隔fs.checkpoint.period 默认3600秒
- 根据配置文件设置edits log大小 fs.checkpoint.size 规定edits文件的最大值默认是64MB
-
SNN合并流程
5. 架构图
4. HDFS Block块的大小
Block块大小的设置
HDFS中的文件在物理上是分块存储(Block), 块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在Hadoop2.x版本中是128M。单一文件的Block大小一致, 不同文件的Block大小不一致
Block如果设置太小, 文件数量会增多,会增加寻址时间
Block如果设置太大, 从磁盘传输数据的时间会明显大于定位这个Block开始位置所需的时间, 导致程序处理这块数据时, 会非常慢
总结: HDFS block的大小设置主要取决于磁盘传输速率
5. HDFS写流程
声明: 这部分内容引用的 https://www.cnblogs.com/qingyunzong/p/8548806.html , 侵权删
1. 流程步骤
- 使用 HDFS 提供的客户端 Client,向远程的 namenode 发起 RPC 请求
- namenode 会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会 为文件创建一个记录,否则会让客户端抛出异常;
- 当客户端开始写入文件的时候,客户端会将文件切分成多个 packets,并在内部以数据队列“data queue(数据队列)”的形式管理这些 packets,并向 namenode 申请 blocks,获 取用来存储 replicas 的合适的 datanode 列表,列表的大小根据 namenode 中 replication 的设定而定;
- 开始以 pipeline(管道)的形式将 packet 写入所有的 replicas 中。客户端把 packet 以流的 方式写入第一个 datanode,该 datanode 把该 packet 存储之后,再将其传递给在此 pipeline 中的下一个 datanode,直到最后一个 datanode,这种写数据的方式呈流水线的形式。
- 最后一个 datanode 成功存储之后会返回一个 ack packet(确认队列),在 pipeline 里传递 至客户端,在客户端的开发库内部维护着"ack queue",成功收到 datanode 返回的 ack packet 后会从"data queue"移除相应的 packet。
- 如果传输过程中,有某个 datanode 出现了故障,那么当前的 pipeline 会被关闭,出现故 障的 datanode 会从当前的 pipeline 中移除,剩余的 block 会继续剩下的 datanode 中继续 以 pipeline 的形式传输,同时 namenode 会分配一个新的 datanode,保持 replicas 设定的 数量。
- 客户端完成数据的写入后,会对数据流调用 close()方法,关闭数据流;
- 只要写入了 dfs.replication.min(最小写入成功的副本数)的复本数(默认为 1),写操作 就会成功,并且这个块可以在集群中异步复制,直到达到其目标复本数(dfs.replication 的默认值为 3),因为 namenode 已经知道文件由哪些块组成,所以它在返回成功前只需 要等待数据块进行最小量的复制。
2. 流程图
6. HDFS的读操作
声明: 这部分内容引用的 https://www.cnblogs.com/qingyunzong/p/8548806.html , 侵权删
1. 流程步骤
- 客户端调用FileSystem 实例的open 方法,获得这个文件对应的输入流InputStream。
- 通过RPC 远程调用NameNode ,获得NameNode 中此文件对应的数据块保存位置,包括这个文件的副本的保存位置( 主要是各DataNode的地址) 。
- 获得输入流之后,客户端调用read 方法读取数据。选择最近的DataNode 建立连接并读取数据。
- 如果客户端和其中一个DataNode 位于同一机器(比如MapReduce 过程中的mapper 和reducer),那么就会直接从本地读取数据。
- 到达数据块末端,关闭与这个DataNode 的连接,然后重新查找下一个数据块。
- 不断执行第2 - 5 步直到数据全部读完。
- 客户端调用close ,关闭输入流DF S InputStream。
2. 流程图
二. HDFS的shell操作
-
-ls
: 查看指定路径下的文件或文件夹-R: 表示查询子目录下的文件
hdfs dfs -ls /hadoop hadoop fs -ls /hadoop hdfs dfs -ls -R /hadoop hadoop fs -ls -R /hadoop
-
-mkdir
: 创建文件夹hdfs dfs -mkdir -p /hadoop hadoop fs -mkdir -p /hadoop
-p
: 表示循环创建, 创建多级目录时需要该参数
-
-put
: 文件上传hadoop fs -put words.txt /hadoop hdfs dfs -put zookeeper.out /hadoop
-
-get
: 文件下载hdfs dfs -get /hadoop/words.txt ~/data hadoop fs -get /hadoop/zookeeper.out ~/data
-
-cp
: 拷贝文件到指定目录hdfs dfs -cp /hadoop/zookeeper.out /hadoop/a/zookeeper.out
-
-mv
: 移动文件hdfs dfs -mv /hadoop/a/zookeeper.out /hadoop/b/zookeeper.out
-
-rm
: 删除文件/目录hdfs dfs -rm /hadoop/b/zookeeper.out
如果删除非空目录, 需要加上:
-r
hdfs dfs -rm -r /hadoop/a -
-cat
: 查看文件内容hdfs dfs -cat /hadoop/words.txt
-
查询集群工作状态
hdfs dfsadmin -report
三. HDFS 2.x
1. 产生背景
- Hadoop 1.0中HDFS和MapReduce在高可用、扩展性等方面存在问题
- HDFS存在的问题(2个)
- NameNode单点故障,难以应用于在线场景 HA
- NameNode压力过大,且内存受限,影响扩展性F
- MapReduce存在的问题响系统
- JobTracker访问压力大,影响系统扩展性
- 难以支持除MapReduce之外的计算框架,比如Spark、Storm等
2. HDFS 2.x特点
- 解决HDFS1.0中单点故障和内存受限问题。
- 解决单点故障
- HDFS HA:通过主备NameNode解决
- 如果主NameNode发生故障,则切换到备NameNode上
- 解决内存受限问题
- HDFS Federation(联邦)
- 水平扩展,支持多个NameNode;
每个NameNode分管一部分目录;
所有NameNode共享所有DataNode存储资源
- 2.x仅是架构上发生了变化,使用方式不变
- 对HDFS使用者透明
- HDFS1.x中的命令和API仍可以使用
3. HDFS 2.0 HA
1. 相关概念
- 主备NameNode
- 解决单点故障
- 主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换
- 所有DataNode同时向两个NameNode汇报数据块信息(位置)
- JNN:集群(属性)
- standby:备,完成了edits.log文件的合并产生新的image,推送回ANN
- 两种切换选择
- 手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合
- 自动切换:基于Zookeeper实现
- 基于Zookeeper自动切换方案
- ZooKeeper Failover Controller:监控NameNode健康状态,
- 并向Zookeeper注册NameNode
- NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC 锁的NameNode变为active
2. 流程图
再次声明: HDFS读写流程的内容引用的 https://www.cnblogs.com/qingyunzong/p/8548806.html , 侵权删
欢迎关注我的CSDN: https://blog.csdn.net/bingque6535