zoukankan      html  css  js  c++  java
  • 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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Python写一个简单的爬虫
    Fully Convolutional Networks for Semantic Segmentation 译文
    Numpy中矩阵和数组的区别
    Linux(ubuntu)软件的安装
    Linux 打包和压缩
    Linux的软连接、硬链接和find命令
    Linux组管理、用户管理、查看用户信息、usermod、which、切换用户、修改文件具体权限
    Linux用户权限
    Linux远程管理命令
    Linux文件和目录相关的命令
  • 原文地址:https://www.cnblogs.com/1463490Ya/p/15293865.html
Copyright © 2011-2022 走看看