当前仓库属于暂停状态,部分功能使用受限,详情请查阅 仓库状态说明
1 Star 2 Fork 0

Kaz / prolearn
暂停

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
hdfs.md 7.80 KB
一键复制 编辑 原始数据 按行查看 历史
Kaz 提交于 2020-12-30 17:08 . 重点
编号 单独考查 混合考查 重点
373031902856 15% 0 SecondaryNameNode的功能
HDFS Shell 指令
373032001234 20% 0 文件写入
错误处理
HDFS Shell 指令

一.HDFS 简介

1.优点

  1. 低成本运行
  2. 处理超大文件
  3. 流式访问
  4. 高容错性

2.缺点

  • 不适合低延迟访问
  • 不适合小文件读写
  • 不适合多用户写入
  • 不适合文件任意修改

二.HDFS 架构

HDFSNameNodeSecondaryNameNodeDataNode 三块组成。

graph TB
	subgraph 服务端
		SenondaryNameNode
		NameNode
		DataNode1
		DataNode2
		DataNode3
		
	end
		Client--处理数据块-->DataNode1
		Client(客户端)--请求文件-->NameNode

NameNode

三大功能

  1. 管理和维护 HDFS 的命名空间:两类文件
  2. 管理 DataNode 上的数据块
  3. 接受客户端的请求

两类文件

  1. fsimage文件: 命名空间镜像文件,存储文件系统元信息。

    • 包含所有的目录和文件信息
    • 对于目录来说,包含的信息主要有修改时间、访问控制权限等
    • 对于文件来说,包含的信息有修改时间、访问时间、访问控制、块大小和组成一个文件块等
  2. edits文件: 记录操作日志 editlog

    • edits 保存了很多对文件进行操作的指令。
  3. 两类文件的关系:

    • edits记录的是文件的操作记录,是过程
    • fsimage 保存的是文件的操作结果,是结果

DataNode

数据块

  1. 数据块是磁盘进行数据读、写的最小单位,
  2. 文件系统数据块的大小通常为磁盘数据块的整数倍。Hadoop 2.x 默认为 128MB
  3. 目的:减少寻址开销,减少磁盘一次读取时间。
  4. HDFS将每个文件划分为大小相等的数据块进行存储。为了容错,文件的所有数据块都被冗余复制,

功能

  1. 存储数据块
  2. I/O:根据 NameNode 的指令,和客户端就行 I/O 操作
  3. 心跳通信:定期向 NameNode 发送心跳信息,保持和 NameNode 的通信。

SecondaryNameNode

功能

  1. 定期合并 fsimageedits,避免 edits 过大。

文件合并流程

graph LR
STOP(暂停)-->DOWNLOAD(下载)
DOWNLOAD-->MERGE(合并)
-->UPLOAD(上传)
-->REPLACE(替换)
-->RESTORE(恢复)
  1. 暂停:SecondaryNameNodeNameNode 发送请求,要求其暂停使用 edits 文件。之后新的更新操作写入 edits.new文件。
  2. 下载:SecondaryNameNodeNameNode 下载 fsimageedits 文件。
  3. 合并:SecondaryNameNode 根据 edits 中的信息,对 fsimage 进行操作。最终形成一个新的 fsimage.ckpt
  4. 上传:SecondaryNameNode 将合并后的 fsimage.ckpt 上传到 NameNode。‘
  5. 替换: NameNode用得到的新 fsimage.ckpt 替换旧的 fsimage,用 edits.new 替换 edits
  6. 恢复:NameNode 恢复使用 edits 记录操作日志。

三.HDFS 工作机制

1.机架感知

  1. 概述:根据网络的拓扑结构,对 HDFS 的操作进行优化。
  2. 默认情况:不开启机架感知,即认为全部在一个机架上。
  3. 自定义:通过外部脚本文件来判断。输入IP地址,输出机架信息。

2.副本冗余策略

副本存储

  1. 副本1:在上传文件的数据节点
  2. 副本2:在与第一个节点不同的机架上
  3. 副本3:和副本2一个机架,但不同的节点
  4. 更多副本:均匀分布在剩余的机架下
  5. 其余副本:随机选择节点存放

优点

  1. 减小了机架间的数据传输,提高写操作效率
  2. 不影响数据的可靠性和可用性,但改进了写的性能
  3. 减小因机架间的数据传输,导致的网络传输之间的总带宽

3.文件读取

sequenceDiagram
    Client->>DistributedFileSystem: 打开文件
    DistributedFileSystem->> NameNode: 请求数据块信息
    Client->>FSDataInputStream: 打开流
    FSDataInputStream->>DataNode: 读取数据
    Client->>FSDataInputStream: 关闭流
  1. 客户端通过 DistributedFileSystem 打开文件
  2. DistributedFileSystemNameNode 请求数据块信息
  3. ClientFSDataInputStream读取数据
  4. FSDataInputStreamDataNode 读取数据
  5. Client关闭FSDataInputStream

4.文件写入

sequenceDiagram
    Client->>DistributedFileSystem: 创建元请求
    DistributedFileSystem->> NameNode: 创建文件元数据
    Client->>FSDataOutputStream: 写入数据
    FSDataOutputStream->>DataNode: 写入数据包
    DataNode->>FSDataOutputStream: 接受数据包
    Client->>FSDataInputStream: 关闭
    FSDataInputStream->>NameNode: 通知写入完成
  1. 客户端通过 DistributedFileSystem 打开文件。

  2. DistributedFileSystem 请求 NameNode 创建元数据。

    此操作通过 RPC 调用完成。RPC 是指远程过程调用,它类似函数调用,区别是函数在另一台服务器上。

  3. ClientFSDataOutputStream写入数据,先写入缓冲区,再一个个切分成数据包。

  4. FSDataOutputStreamDataNode 发送数据,节点由 NameNode 分配。数据包由这些 DataNode 组成的管道进行传输。

  5. 管道上的 DataNode 反向返回确认信息,最终由第一个数据节点返回给 FSDataOutputStream

  6. Client关闭FSDataOutputStream

  7. FSDataInputStream 通知 NameNode 文件写入完成。

四.错误处理

DataNode 出错

由 HDFS 自动处理

  1. 判定:若NameNode 近期未接受到 DataNode 的心跳信息,就认为这个 DataNode 挂了。
  2. 处理方法:检测需要复制的数据块,将其复制到其他节点。

NameNode 出错

  1. 因素: fsimage 或者 edits 损坏。
  2. 后果:整个 HDFS 直接挂掉

解决方案

  1. 同步存储到其他文件系统
  2. HDFS HA: 高可用性
    • 共享存储系统:如ZooKeeper
    • 使用主从 NameNode存储数据
    • 各个节点之间使用 JournalNode 同步数据

五.HDFS Shell 操作

操作 命令 参数 示例
创建文件夹 hdfs dfs -mkdir [-p] <paths> -p:如果父目录不存在,则先创建父目录 创建 hadoop 目录:hdfs dfs -mkdir /hadoop
列出文件夹 hdfs dfs -ls [-dhR] <paths> -d:返回父目录
-R:同时显示子目录
显示 hadoop 目录:hdfs dfs -ls /hadoop
创建文件 hdfs dfs -touchz <paths> 创建 hadoop.txt 文件:hdfs dfs -touchz /hadoop.txt
上传文件 hdfs dfs -put <local_src> <hdfs_dst>
hdfs dfs -copyFromLocal <local_src> <hdfs_dst>
/root/app.txt 上传到 HDFS的根目录:
hdfs dfs -put /root/app.txt /app.txt
移动文件到HDFS hdfs dfs -moveFromLocal <local_src> <hdfs_dst> /root/app.txt 移动到 HDFS的根目录:
hdfs dfs -moveFromLocal /root/app.txt /app.txt
下载文件 hdfs dfs -get <hdfs_src> <local_dst>
hdfs dfs -copyToLocal <hdfs_src> <local_dst>
/app.txt 下载到 /root/app.txt:
hdfs dfs -copyToLocal /app.txt /root/app.txt
查看文件 hdfs dfs -cat <hdfs_path> 查看 /app.txt:
hdfs dfs -cat /app.txt
追加文件 hdfs dfs -appendToFile <hdfs_src> <local_dst> 追加 /root/app.txt/app.txt:
hdfs dfs -appendToFile /root/app.txt /app.txt
删除文件或目录 hdfs dfs -rm [-fr] <hdfs_path> -f 文件不存在时,不显示错误信息
-r递归删除文件夹
删除文件 /app.txt
hdfs -dfs -rm /app.txt
删除空文件夹 /hadoop
hdfs -dfs -rm /hadoop
删除非空文件夹 /hadoophdfs -dfs -rm -r /hadoop
1
https://gitee.com/pikoyo/prolearn.git
git@gitee.com:pikoyo/prolearn.git
pikoyo
prolearn
prolearn
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891