Hadoop-HDFS

  • 背景

    • 管理分布式文件的一个系统

    • 适合一次写入多次读取的情况

  • 优点

    • 高容错性

      • 存储多个副本

      • 可以利用副本进行数据恢复

    • 适合处理大数据

      • 数据规模可以随着结点数量增加处理的规模

      • 文件规模同上

    • 可以构建在廉价的服务器上

  • 缺点

    • 不适合低延时数据的访问

    • 无法高效对大量小文件进行存储

      • 存储大量小文件会占用大量NameNode空间存储目录信息

      • 小文件读取时寻址时间会超过读取时间,有违背hdfs设计的初衷

    • 不支持并发写入、文件随机修改

      • 一个文件只能有一个写入,不支持多个线程同时写

      • 仅支持数据追加,不支持文件的随机修改

  • 基本组成

    • NameNode

      • 管理HDFS的命名空间

      • 配置副本策略

      • 管理block的映射信息

      • 处理客户端的读写请求

    • DataNode

      • 存储实际的数据块

      • 执行数据块的读写操作

    • client

      • 文件切分

      • 与NameNode进行数据交互,获取文件的位置信息

      • 与DataNode进行交互,读取或者写入数据

      • client提供一些命令来管理HDFS,比如NameNode格式化

      • client可以通过一些命令来访问HDFS,比如对HDFS增删改查操作

    • secondary NameNode

      • 并非NameNode的热备份,当NameNode挂掉的时候,其并不能马上替换NameNode并提供服务

      • 辅助NameNode,分担其工作量,比如定期合并fsimage和edits

      • 紧急情况下可辅助恢复NameNode

  • HDFS的块

    • 2.x之前64M

    • 2.x之后128M

    • 决定块大小的因素

      • 磁盘传输的效率,现在市面上的传输效率大概为100M/s,向计算机的整数取整则为128M

      • HDFS设置太小会增加寻址时间,可能会导致程序一直在寻找块的开始位置

  • hdfs的shell指令

    • 在操作hdfs系统上hadoop fs 和hdfs dfs 效果一样

    • 上传

      • hdfs dfs -put 本地路径 hdfs路径

      • hdfs dfs -copyFromLocal 本地路径 hdfs路径

        • 拷贝本地文件到hdfs上
      • hdfs dfs -moveFromLocal 本地路径 hdfs路径

        • 把本地文件剪切到hdfs上
      • hdfs dfs -appendTofile 本地路径 hdfs路径

    • 下载

      • hdfs dfs -copyToLocal hdfs路径 本地路径

        • 下载hdfs上的文件
      • hdfs dfs -get hdfs路径 本地路径

        • 下载hdfs上的文件
      • hdfs dfs -getmerge hdfs路径 本地路径

        • 合并下载的多个文件
    • 一些常用操作

      • -ls

        • hdfs dfs -ls hdfs上的路径
      • -mkdir

        • hdfs dfs -mkdir /hdfs上的路径
      • -cat

        • hdfs dfs -cat /hdfs上的路径
      • -chagrp、-chmod、-chown(修改所属组,修改权限,修改所需组和所有者)

        • hdfs dfs -chmod 777 /hdfs的文件路径

        • hdfs dfs -chown 用户名:所属组 /hdfs上的路径

        • hdfs dfs -chgrp 所属组名称或者路径 /hdfs上的路径

      • -cp

        • hdfs dfs -cp /hdfs上的路径 /hdfs的路径

        • hdfs dfs -cp /hdfs上的路径 /本地路径(最好写绝对路径,相对路径也可以)

      • -tail

        • hdfs dfs -tail /hdfs上的路径
      • -rm

        • hdfs dfs -rm 【-r】 【-f】/hdfs上的路径

          • -r是递归

          • -f是删除文件,不是文件夹

      • -rmdir

        • hdfs dfs -rmdir /hdfs上的路径
      • -du

        • hdfs dfs -du 【-s】 【-h】 /hdfs上的路径

          • -s是将所有文件大小求和后输出

          • -h是将文件存储单位由字节转换为最合适查看的单位(比如128M,64KB等等)

      • -setrep

  • 客户端上的操作

    • 环境配置

      • 下载所需依赖

      • 将依赖添加到环境变量中

      • 创建Maven工程

        • 添加依赖和日志
    • 利用hdfs的API进行文件的上传、下载、删除、移动等操作

      • 待添加
  • HDFS的数据流

    • 文件写入

      • 简述一下,

      • 客户端,即上传者,对NameNode发起传输请求,NameNode接收后返回一个允许的信号

      • 客户端发送第一个文件(大于块的则需要请求第二次,重复当前所需所有步骤,因为hdfs上数据的传输 都是按照块进行的)请求获取存储的DataNode

      • NameNode返回存储数据和数据副本的DataNode结点是那些

      • 客户端向最近的数据结点发送连接请求

        • 这个最近的距离是有限制的,和副本保存机制相关
      • 数据结点进行应答

        • 最近的数据结点如果能够存储则响应,否则就让他去请求其他结点,
      • 对数据进行传输

        • 注意此处只传输了一次,没有多次传输,因为备份的问题不归客户端考虑,备份是由hdfs进行考虑的

        • 数据传输到第一个结点后,剩余的数据备份就交给获得了数据的结点进行操作,(如果数据结点宕机则寻找下一结点)具体描述如下

          • 假设备份为三,存储在h1,h2,h3 上,当前h1获得了数据

          • h1会和h2建立数据通信,类似于客户端与H1建立通信一样

          • 然后h2完成后,交给h2去和h3 进行通信数据备份

    • 网络拓扑节点距离的计算

      • 迪杰特斯拉拓扑算法
        • 通俗点讲就是必须经过的路线距离,不能凭空穿越,要有连接
    • 副本结点的选择

      • hadoop3.x

        • 第一个是放在客户端所处结点上,如果客户端在结点外,则随机选择一个结点存储

        • 第二个副本放在另一个同一集群不同机架的服务器上的结点

        • 第三个副本放在和第二个副本同一机架上的不同结点上

      • hadoop2.x

        • 第一个是放在客户端所处结点上,如果客户端在结点外,则随机选择一个结点存储

        • 第二个副本放在另一个同一集群不同机架的服务器上的结点

        • 第三个副本放在和第一个副本同一机架上的不同结点上

    • 文件读取

      • 简述

        • 客户端发送请求下载的请求

        • NameNode查找客户端请求下载的数据的元数据信息,查找到则返回元数据信息给客户端

        • 客户端按照NameNode返回的元数据信息去DataNode上寻找数据块,同时发送下载数据的请求,和通道建立请求(不需要考虑其他副本所在结点是否需要请求,除非当前结点宕机,才会和其他结点请求)

        • 数据块所在的DataNode响应客户端的请求,完成数据通道建立(如果请求下载的文件大于块大小,即由多块组成,则在当前数据块下载完成后,在请求下一块的下载,不用再和NameNode通信,因为之前NameNode已经将元数据返回,直接和下一个DataNode请求就好)

  • NameNode和SecondaryNameNode工作机制

    • NameNode中的内容是在内存和磁盘都存在的,只是磁盘上的内容会滞后,而NameNode几乎没有多余的容量去进行磁盘的写入

    • 因此磁盘的写入由secondaryNameNode进行,磁盘上写入的数据存储在fsimage中

    • NameNode工作机制

      • 简述

        • NameNode启动后

          • (不是第一次,第一次格式化启动后会建立data和logs文件夹,建立fsimage和edits文件)
        • 加载edits文件和fsimage文件

        • 当元数据收到修改请求(增删改。。。),会对该操作进行记录,记录到日志文件edits中

        • 然后更新元数据

    • secondaryNameNode工作机制

      • NameNode的冷备份

      • 简述

        • 随时和NameNode进行监听,checkpoint(检查点)

          • checkpoint触发条件

            • 定时触发

            • edits中的数据满了(达到一定阈值)

        • 触发checkpoint后,滚动NameNode中的edits _log文件,拷贝到secondaryNameNode,同时也将fsimage拷贝到secondaryNameNode,将edits和fsimage合并,同时生成新的fsimage,将新的fsimage拷贝到NameNode中

          • 解释:滚动edits_log是将原来的edits_log进行拷贝,同时改名方便后续合并和拷贝,实际上NameNode上还有一个edits_log在记录操作日志
    • 查看fsimage文件

      • oiv

        • hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后输出的路径

        • 文件类型一般是xml

    • 查看edits文件

      • oev

        • hdfs ove -p 文件类型 -i 编辑日志 -o 转换后文件输出路径

        • 文件类型一般是xml

    • checkpoint

      • 在NameNode和secondaryNameNode中有个关键的连接点checkpoint

      • 其操作指令数量阈值为100W条

      • 时间阈值为1小时,到时间就上传

  • DataNode

    • 工作机制

      • 每个DataNode在加入集群时都需要向NameNode报备注册

      • 注册成功后NameNode会返回一个信号

      • 此后,DataNode每隔一个周期(一小时)都需要向NameNode发送一次所拥有块的信息,同时每3秒发送一次心跳,告知NameNode存活

        • 注意心跳不同于前面的信息告知
      • 当DataNode超过一定时间(10分钟+30秒)未向NameNode发送心跳,NameNode则会认为该DataNode死亡,该节点不可用

    • 数据完整性

      • 数据校验

        • 各种算法
      • 在读取文件时,会对文件进行校验和计算,如果校验发现文件受损,则读取其他模块的副本

    • 新DataNode服役

      • 在不考虑安全的情况下

        • 可以直接加入NameNode集群(配置文件中有NameNode信息)
      • 在设置黑白名单后

        • 白名单中的数据结点可以正常加入NameNode

        • 不在白名单中的数据结点会被退出

          • 白名单的设置

            • 修改配置文件hdfs-site.xml

            • 新建白名单文件

            • 重启NameNode和刷新NameNode

        • 在黑名单中的结点会被强制退出(退役)

          • 黑名单的设置

            • 修改配置文件hdfs-site.xml

            • 新建黑名单文件

            • 重启NameNode并刷新NameNode

    • DataNode多级目录

      • 多级目录不是副本

      • 过程

        • 配置hdfs-site.xml文件
posted @ 2021-09-16 15:56  KaneQi  阅读(35)  评论(0编辑  收藏  举报