• 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文件
    作者:Ya
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    搭建非域AlwaysOn win2016+SQL2016
    从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)
    从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
    从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)
    从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)
    四、基于Windows 2012配置SQL Server 2014 AlwaysOn
    三、安装SQLserver 2014(For AlwaysOn)
    二、 Windows 2012配置故障转移(For SQLServer 2014 AlwaysOn)
    Mybatis-SQL语句构建器类及日志
    Mybatis-JavaAPI
  • 原文地址:https://www.cnblogs.com/1463490Ya/p/15293865.html
Copyright © 2020-2023  润新知