一. HDFS概述

1. HDFS产出背景及定义

  1. HFDS产生的背景
    随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。
  2. HDFS的定义
    HDFS(Hadoop Distributed File System),它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。

2. HDFS的优缺点

  1. 优点
  • 高容错性
    数据自动保存多个副本. 可以通过增加副本的形式, 提高容错性.
    某一个副本丢失以后, 它可以自动恢复.
  • 适合批处理
    计算向数据移动
  • 适合处理大数据
    数据规模: 处理数据规模可达TB, 甚至是PB级别
    文件规模: 处理文件数量可达百万级别
  • 可构建在廉价机器上, 通过多副本机制, 提高可靠性
  1. 缺点
  • 不适合低延时数据访问
  • 无法高效的对大量小文件进行存储,
    占用NameNode大量的内存来存储文件目录和块信息
    寻道时间超过读取时间,就违反了HDFS的设计目标。
  1. 不支持并发写入和文件随机修改
    一个文件只能有一个写, 不允许多个线程同时写
    仅支持数据append(追加), 不支持文件的随机修改.

3. HDFS的组成架构

1. NameNode(NN)
  1. 基于内存存储, 不与磁盘发生交换
  2. NameNode主要功能
  • 收集DataNode汇报的Block列表信息
  • 处理客户端读写请求
  • 管理HDFS的命名空间
  • 配置副本策略
  1. NameNode保存metadata信息包括:
  • 文件owership 和 permissions
  • 文件大小, 时间
  • Block列表: 偏移量, 位置信息(持久化不存)
  • Block每个副本的位置, 由DataNode上报
  1. NameNode持久化
  • NameNode的metadata信息在启动后会加载到内存
  • metadata存储到磁盘文件名为”fsimage”(时点备份)
  • Block的位置信息不会保存到fsimage
  • edits记录对metadata的操作日志 -> Redis
  • 二者的产生时间和过程?(format)
2. DataNode(DN)
  1. 存储实际的Block
  2. 存储Block的元数据信息文件
  3. 启动DataNode是会向NameNode汇报block信息
  4. 执行数据库的读/写操作
  5. DataNode与NameNode保持心跳, 提交Block列表
3. Client
  1. 文件切分, 文件上传HDFS时, Client将文件切分成一个一个的Block, 然后上传
  2. 与NameNode交互, 获取文件的位置信息
  3. 与DataNode交互, 读取或写入数据
4. Secondary NameNode
  1. 并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务
  2. 帮助NameNode合并edits log, 减少NameNode的启动时间
  3. 在紧急情兄下,可辅助恢复NarmeNode
  4. SNN执行合并的时机
  • 根据配置文件设置的时间间隔fs.checkpoint.period 默认3600秒
  • 根据配置文件设置edits log大小 fs.checkpoint.size 规定edits文件的最大值默认是64MB
  1. SNN合并流程
5. 架构图

hadoop dfs容量 hadoop fs dfs_linux

4. HDFS Block块的大小

  1. Block块大小的设置
    HDFS中的文件在物理上是分块存储(Block), 块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在Hadoop2.x版本中是128M。
  2. 单一文件的Block大小一致, 不同文件的Block大小不一致
  3. Block如果设置太小, 文件数量会增多,会增加寻址时间
  4. Block如果设置太大, 从磁盘传输数据的时间会明显大于定位这个Block开始位置所需的时间, 导致程序处理这块数据时, 会非常慢
  5. 总结: HDFS block的大小设置主要取决于磁盘传输速率

5. HDFS写流程

声明: 这部分内容引用的 , 侵权删

1. 流程步骤
  1. 使用 HDFS 提供的客户端 Client,向远程的 namenode 发起 RPC 请求
  2. namenode 会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会 为文件创建一个记录,否则会让客户端抛出异常;
  3. 当客户端开始写入文件的时候,客户端会将文件切分成多个 packets,并在内部以数据队列“data queue(数据队列)”的形式管理这些 packets,并向 namenode 申请 blocks,获 取用来存储 replicas 的合适的 datanode 列表,列表的大小根据 namenode 中 replication 的设定而定;
  4. 开始以 pipeline(管道)的形式将 packet 写入所有的 replicas 中。客户端把 packet 以流的 方式写入第一个 datanode,该 datanode 把该 packet 存储之后,再将其传递给在此 pipeline 中的下一个 datanode,直到最后一个 datanode,这种写数据的方式呈流水线的形式。
  5. 最后一个 datanode 成功存储之后会返回一个 ack packet(确认队列),在 pipeline 里传递 至客户端,在客户端的开发库内部维护着"ack queue",成功收到 datanode 返回的 ack packet 后会从"data queue"移除相应的 packet。
  6. 如果传输过程中,有某个 datanode 出现了故障,那么当前的 pipeline 会被关闭,出现故 障的 datanode 会从当前的 pipeline 中移除,剩余的 block 会继续剩下的 datanode 中继续 以 pipeline 的形式传输,同时 namenode 会分配一个新的 datanode,保持 replicas 设定的 数量。
  7. 客户端完成数据的写入后,会对数据流调用 close()方法,关闭数据流;
  8. 只要写入了 dfs.replication.min(最小写入成功的副本数)的复本数(默认为 1),写操作 就会成功,并且这个块可以在集群中异步复制,直到达到其目标复本数(dfs.replication 的默认值为 3),因为 namenode 已经知道文件由哪些块组成,所以它在返回成功前只需 要等待数据块进行最小量的复制。
2. 流程图

hadoop dfs容量 hadoop fs dfs_hadoop_02

6. HDFS的读操作

声明: 这部分内容引用的 , 侵权删

1. 流程步骤
  1. 客户端调用FileSystem 实例的open 方法,获得这个文件对应的输入流InputStream。
  2. 通过RPC 远程调用NameNode ,获得NameNode 中此文件对应的数据块保存位置,包括这个文件的副本的保存位置( 主要是各DataNode的地址) 。
  3. 获得输入流之后,客户端调用read 方法读取数据。选择最近的DataNode 建立连接并读取数据。
  4. 如果客户端和其中一个DataNode 位于同一机器(比如MapReduce 过程中的mapper 和reducer),那么就会直接从本地读取数据。
  5. 到达数据块末端,关闭与这个DataNode 的连接,然后重新查找下一个数据块。
  6. 不断执行第2 - 5 步直到数据全部读完。
  7. 客户端调用close ,关闭输入流DF S InputStream。
2. 流程图

hadoop dfs容量 hadoop fs dfs_hdfs_03

二. HDFS的shell操作

  1. -ls: 查看指定路径下的文件或文件夹

-R: 表示查询子目录下的文件

hdfs dfs -ls /hadoop
hadoop fs -ls /hadoop
hdfs dfs -ls -R /hadoop
hadoop fs -ls -R /hadoop

hadoop dfs容量 hadoop fs dfs_hadoop_04

  1. -mkdir: 创建文件夹
hdfs dfs -mkdir -p /hadoop
hadoop fs -mkdir -p /hadoop

-p: 表示循环创建, 创建多级目录时需要该参数

hadoop dfs容量 hadoop fs dfs_linux_05

  1. -put: 文件上传
hadoop fs -put words.txt /hadoop
hdfs dfs -put zookeeper.out /hadoop

hadoop dfs容量 hadoop fs dfs_hadoop_06


hadoop dfs容量 hadoop fs dfs_hdfs_07

  1. -get: 文件下载
hdfs dfs -get /hadoop/words.txt ~/data
hadoop fs -get /hadoop/zookeeper.out ~/data

hadoop dfs容量 hadoop fs dfs_大数据_08

  1. -cp: 拷贝文件到指定目录
hdfs dfs -cp /hadoop/zookeeper.out /hadoop/a/zookeeper.out

hadoop dfs容量 hadoop fs dfs_hdfs_09

  1. -mv: 移动文件
hdfs dfs -mv /hadoop/a/zookeeper.out /hadoop/b/zookeeper.out
  1. -rm: 删除文件/目录
hdfs dfs -rm /hadoop/b/zookeeper.out

如果删除非空目录, 需要加上: -r hdfs dfs -rm -r /hadoop/a

hadoop dfs容量 hadoop fs dfs_hdfs_10

  1. -cat: 查看文件内容
hdfs dfs -cat /hadoop/words.txt
  1. 查询集群工作状态
hdfs dfsadmin -report

hadoop dfs容量 hadoop fs dfs_hadoop dfs容量_11

三. HDFS 2.x

1. 产生背景

  1. Hadoop 1.0中HDFS和MapReduce在高可用、扩展性等方面存在问题
  2. HDFS存在的问题(2个)
  • NameNode单点故障,难以应用于在线场景 HA
  • NameNode压力过大,且内存受限,影响扩展性F
  1. MapReduce存在的问题响系统
  • JobTracker访问压力大,影响系统扩展性
  • 难以支持除MapReduce之外的计算框架,比如Spark、Storm等

2. HDFS 2.x特点

  1. 解决HDFS1.0中单点故障和内存受限问题。
  2. 解决单点故障
  • HDFS HA:通过主备NameNode解决
  • 如果主NameNode发生故障,则切换到备NameNode上
  1. 解决内存受限问题
  • HDFS Federation(联邦)
  • 水平扩展,支持多个NameNode;
    每个NameNode分管一部分目录;
    所有NameNode共享所有DataNode存储资源
  1. 2.x仅是架构上发生了变化,使用方式不变
  2. 对HDFS使用者透明
  3. HDFS1.x中的命令和API仍可以使用

3. HDFS 2.0 HA

1. 相关概念
  1. 主备NameNode
  2. 解决单点故障
  • 主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换
  • 所有DataNode同时向两个NameNode汇报数据块信息(位置)
  • JNN:集群(属性)
  • standby:备,完成了edits.log文件的合并产生新的image,推送回ANN
  1. 两种切换选择
  • 手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合
  • 自动切换:基于Zookeeper实现
  1. 基于Zookeeper自动切换方案
  • ZooKeeper Failover Controller:监控NameNode健康状态,
  • 并向Zookeeper注册NameNode
  • NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC 锁的NameNode变为active
2. 流程图

hadoop dfs容量 hadoop fs dfs_大数据_12

再次声明: HDFS读写流程的内容引用的 , 侵权删