hadoop离线day03--Hadoop HDFS

Posted Vics异地我就

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hadoop离线day03--Hadoop HDFS相关的知识,希望对你有一定的参考价值。

hadoop离线day03--Hadoop HDFS


目录

hadoop离线day03--Hadoop HDFS

今日内容大纲

Apache HDFS入门

概念

HDFS重要特性

分块存储

副本机制

HDFS shell操作

命令

shell常见命令操作

文件限额操作

相关的命令

HDFS工作机制

读写流程图见画图。

NameNode与DataNode通信机制

HDFS Java API

核心类

HDFS辅助工具

跨集群复制数据 distcp(distributed copy)

文件归档工具 archive

HDFS snapshot快照


今日内容大纲

#HDFS入门
    HDFS介绍
    如何模拟实现分布式文件存储系统? 具备哪些特性。
        分布式、分块存储、副本机制、元数据管理
    HDFS设计目标和重要特性
#HDFS操作
    shell command
    java api
#HDFS原理  重中之重
    工作机制--读写流程  角色之间如何配合的 每个角色承担了什么职责
    NN DN角色职责概述总结
#HDFS辅助功能
    distcp 跨集群复制数据 
    Archive 归档文件  处理小文件
    Snapshot 快照

Apache HDFS入门

  • 概念

    • 首先是一个文件系统,就是用来存储文件、存储数据。是大数据最底层一个服务。

    • 其次是一个分布式的文件系统。分布式意味着多台机器存储。

  • 场景:如何模拟实现分布式文件系统。具备哪些属性呢?

  • HDFS重要特性

    • master|slaves 主从架构

      主角色:namenode  管理维护着元数据:目录树结构 文件 大小 副本 备份 位置信息
      从角色:datanode  存储着最终的数据块
    • 分块存储

      物理上把文件分开了。
      ​
      block size =128M  134217728   hadoop2.x (hadoop1.x 64M)
      ​
      e.g:
          1.txt 300M
              blk-1  0--128
              blk-2  128-256
              blk-3  256-300
          
          2.txt 100M
              blk-4  0--100
    • 副本机制

      默认是3副本。
      ​
      1+2=3  本身一份 额外两份 最终3副本。
    • namespace 名字空间 命名空间

      层次感结构  兼顾传统对应文件系统的认知  目录树结构
      用户可以针对目录树进行文件夹、文件的增删改查。
      统一的抽象目录树。
    • metadata 元数据

      对于HDFS来说,目录结构及文件分块位置信息叫做元数据。
      元数据是有namenode维护的。
    • write one read many

      hdfs的模式是一次写入多次读取  
      hdfs没有随机修改编辑的操作  只能对已有的数据进行追加。
      设计目标是这么决定的。
      ​
      侧重于数据吞吐量 不注重实时交互性  意味着hdfs操作延迟很高。

HDFS shell操作

  • 命令

    hadoop  fs <args>  文件系统的路径
    ​
    #hadoop  fs可以操作的文件系统不仅仅有HDFS,还包括本地文件系统、GFS、TFS。
    #如何区分操作访问的是什么文件系统呢?  根据文件系统协议
    ​
    hadoop fs -ls hdfs://node1:8020/
    ​
    hadoop fs -ls file:///
    hadoop fs -ls gfs://
    ​
    #如果不写协议 直接/目录 操作访问的是谁?
    [root@node1 ~]# hadoop fs -ls /
    Found 4 items
    drwxr-xr-x   - root supergroup          0 2021-05-23 16:49 /itcast
    drwx------   - root supergroup          0 2021-05-23 16:12 /tmp
    drwxr-xr-x   - root supergroup          0 2021-05-23 16:12 /user
    drwxr-xr-x   - root supergroup          0 2021-05-23 16:16 /wc
    ​
    #默认是谁,取决于参数fs.defaultFS
    <property>
            <name>fs.defaultFS</name>
            <value>hdfs://node1:8020</value>
    </property>
    ​
    #如果fs.defaultFS没有配置  默认的是file:///
    ​
    #新旧命令  推荐使用hadoop fs
    hadoop fs <args> = hdfs dfs <args>
  • shell常见命令操作

    # 查看指定目录下信息
    hadoop fs -ls [-h] [-R] <args>
        -h 人性化显示
        -R 递归显示
    ​
    #创建文件夹
    hadoop fs -mkdir [-p] <paths>
        -p 创建父目录
        
    #上传文件
    hadoop fs -put src  dst
    将单个 src 或多个 srcs 从本地文件系统复制到目标文件系统
        #src代表的是本地目录 所谓的本地指的是客户端所在的机器 
        #dst代表的是HDFS
        -p:保留访问和修改时间,所有权和权限。
        -f:覆盖目的地(如果已经存在)
        
    hadoop fs -put file:///root/a.txt hdfs://node1:8020/
    ​
    hadoop fs -put a.txt /root
    ​
    #下载文件
    hadoop fs -get  src  localdst
        #将文件复制到本地文件系统。
    hadoop fs -get hdfs://node1:8020/root/a.txt file:///root/
    hadoop fs -get /root/a.txt ./
    ​
    #追加内容到文件尾部 appendToFile
    [root@node3 ~]# echo 1 >> 1.txt
    [root@node3 ~]# echo 2 >> 2.txt 
    [root@node3 ~]# echo 3 >> 3.txt 
    [root@node3 ~]# hadoop fs -put 1.txt /
    [root@node3 ~]# hadoop fs -cat /1.txt
    1
    [root@node3 ~]# hadoop fs -appendToFile 2.txt 3.txt /1.txt
    [root@node3 ~]# hadoop fs -cat /1.txt
    1
    2
    3
    [root@node3 ~]# 
    ​
    #追加的用途:把本地的小文件上传中合并成为大文件 解决小文件场景的。
    ​
    #文件内容的查看
    cat 适合小文件
    tail 将文件的最后一千字节内容显示到stdout  -f参数支持实时追踪查看
    ​
    #权限 拥有者 所属组修改
    ​
        hdfs在设计的时候 借鉴模仿着linux权限管理模式
        也有所谓的读写执行 user group others  777
    chgrp
    chmod
    cgown
    ​
    hadoop fs -chmod 755 /1.txt
    ​
    #文件移动 复制 删除
    mv cp 
    rm -r递归删除 
    ​
    ​
    #合并下载 getmerge
    合并下载多个文件  其功能和appendToFile相反的动作
    [root@node3 ~]# hadoop fs -mkdir /small
    [root@node3 ~]# hadoop fs -put *.txt /small
    [root@node3 ~]# hadoop fs -getmerge /small/* ./merge.txt
    [root@node3 ~]# cat merge.txt 
    ​
    #统计HDFS可用空间  指定目录大小
    [root@node3 ~]# hadoop fs -df -h /
    Filesystem            Size   Used  Available  Use%
    hdfs://node1:8020  111.1 G  5.0 M     98.3 G    0%
    ​
    #修改文件的副本数
    hadoop fs -setrep -w N -R   N就是修改之后的副本数
    -w wait等待 修改副本客户端是否等待修改完毕再推出
    ​
    [root@node3 ~]# hadoop fs -setrep 2 /small/1.txt
    Replication 2 set: /small/1.txt
    ​
    [root@node3 ~]# hadoop fs -setrep -w 2 /small/2.txt
    Replication 2 set: /small/2.txt
    Waiting for /small/2.txt ...
    WARNING: the waiting time may be long for DECREASING the number of replications.
    . done
    ​
    #企业中避免使用setrep修改文件的副本数。
    副本的修改操作可能会影响hdfs正常的读写服务请求。
    因此在实际工作中 事先根据数据的重要性在上传之前就决定该文件的备份数是多少 避免线上修改。
  • 文件限额操作

    • 默认情况下,没有限额的 上传大小 上传文件个数没有限制。

    • 限额----->本限制为硬性限制!

      • 限制上传文件的大小

      • 限制上传文件的个数

    • 相关的命令

      #hdfs dfsadmin
              [-setQuota <dirname>]   #个数限制
              [-clrQuota <dirname>]
              [-setSpaceQuota <dirname>]  #大小空间限制
              [-clrSpaceQuota <dirname>]
    • 栗子

      [root@node3 ~]# hadoop fs -count -q -h /allenwoon
              none             inf            none             inf            1            0                  0 /allenwoon
      [root@node3 ~]# hdfs dfsadmin -setQuota 3 /allenwoon
      [root@node3 ~]# hadoop fs -count -q -h /allenwoon   
                 3               2            none             inf            1            0                  0 /allenwoon
      [root@node3 ~]# hadoop fs -put 1.txt /allenwoon
      [root@node3 ~]# hadoop fs -count -q -h /allenwoon
                 3               1            none             inf            1            1                  2 /allenwoon
      [root@node3 ~]# hadoop fs -put 2.txt /allenwoon   
      [root@node3 ~]# hadoop fs -count -q -h /allenwoon
                 3               0            none             inf            1            2                  4 /allenwoon
      [root@node3 ~]# hadoop fs -put 3.txt /allenwoon   
      put: The NameSpace quota (directories and files) of directory /allenwoon is exceeded: quota=3 file count=4
      ​
      ​
      #hdfs限额操作是硬性限制 只要超出限额 就禁止操作 跟zk不一样
      ​
      #hdfs在对个数进行限额的时候 统计是包括自己在内
      如果设置3个限额 实际上还允许两个上传 自己占了一个

HDFS工作机制

  • 读写流程图见画图。

  • HDFS写流程图

     

详细步骤:

  1. 客户端向NameNode发出写文件请求。
  2. 检查是否已存在文件、检查权限。若通过检查,直接先将操作写入EditLog,并返回输出流对象。 
  3. (注:WAL,write ahead log,先写Log,再写内存,因为EditLog记录的是最新的HDFS客户端执行所有的写操作。如果后续真实写操作失败了,由于在真实写操作之前,操作就被写入EditLog中了,故EditLog中仍会有记录,我们不用担心后续client读不到相应的数据块,因为在第5步中DataNode收到块后会有一返回确认信息,若没写成功,发送端没收到确认信息,会一直重试,直到成功)
  4. client端按128MB的块切分文件。
  5. client将NameNode返回的分配的可写的DataNode列表和Data数据一同发送给最近的第一个DataNode节点,此后client端和NameNode分配的多个DataNode构成pipeline管道,client端向输出流对象中写数据。client每向第一个DataNode写入一个packet,这个packet便会直接在pipeline里传给第二个、第三个…DataNode。 
  6. (注:并不是写好一个块或一整个文件后才向后分发)
  7. 每个DataNode写完一个块后,会返回确认信息。 
  8. (注:并不是每写完一个packet后就返回确认信息,因为packet中的每个chunk都携带校验信息,没必要每写一个就汇报一下,这样效率太慢。正确的做法是写完一个block块后,对校验信息进行汇总分析,就能得出是否有块写错的情况发生)
  9. 写完数据,关闭输输出流。
  10. 发送完成信号给NameNode。 

(注:发送完成信号的时机取决于集群是强一致性还是最终一致性,强一致性则需要所有DataNode写完后才向NameNode汇报。最终一致性则其中任意一个DataNode写完后就能单独向NameNode汇报,HDFS一般情况下都是强调强一致性)

  • 相对于写,简单一些 
    读详细步骤:

  1. client访问NameNode,查询元数据信息,获得这个文件的数据块位置列表,返回输入流对象。
  2. 就近挑选一台datanode服务器,请求建立输入流 。
  3. DataNode向输入流中中写数据,以packet为单位来校验。
  4. 关闭输入流

NameNode与DataNode通信机制

  • dn启动时

    #datanode向nameNode进行注册 并行汇报自己持有数据块信息
    ​
    注册表示自己启动成功 汇报是高速namenode自己保存了哪些数据块
  • dn后续工作时

    #心跳机制
    datanode每隔3S(默认为3秒)向namenode进行心跳,如果超过10分钟没有报告则认为DataNode死亡
    目的:报活   dfs.heartbeat.interval
    ​
    #数据块汇报机制 blockreport
    datanode每隔6小时向nameNode进行数据块汇报自己数据块信息 dfs.blockreport.intervalMsec

HDFS Java API

  • 核心类

    Configuration:该类的对象封转了客户端或者服务器的配置;
    FileSystem:该类的对象是一个文件系统对象,可以用该对象的一些方法来
    对文件进行操作,通过 FileSystem 的静态方法 get 获得该对象。
  • 开发环境搭建 maven依赖

  • 添加log4j.propertied 日志配置文件

    hadoop工程源码中已经引入了log4j的jar包 添加配置之后就可以在执行的过程中查看日志信息,便于排错。
    ​
    把log4j.properties添加到工程的resources目录下即可
  • 问题1 :客户端访问权限问题

    • 现象

      Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=AllenWoon, access=WRITE, inode="/":root:supergroup:drwxr-xr-x
    • 原因

      在windows平台访问hdfs的时候 默认是以windows登录的用户身份去访问的 该身份可能不具备在hdfs相应的操作权限 所以报了权限拒绝的问题。
    • 解决方式

      #方式1: hdfs授权
      chmod -R 777 /
      ​
      #方式2:客户端设置访问身份
      //构造fs对象 并且设置客户端的身份是root
              FileSystem fs = FileSystem.get(new URI("hdfs://node1:8020"), conf, "root");
  • 问题2:windows 本地库问题

    • 现象

      ERROR - Failed to locate the winutils binary in the hadoop binary path
       java.io.IOException: Could not locate executable null\\bin\\winutils.exe in the Hadoop binaries.
       #winutils.exe
       
       WARN - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 
       #无法加载hadoop本地库
    • 原因

      • 本地库环境没有支持 无法进行IO的操作 无法写数据。

      • 本地库来自于hadoop源码在不同的平台进行编译 不同操作系统平台本地库环境是不一样的。

      • 对于windows来说,负责和windows进行IO的就是winutils.exe,来自于hadoop源码中C++工程在windows编译而成。

    • 解决

      • 下载hadoop源码在windows平台编译

        hadoop-2.6.0-cdh5.14.0-with-windows.rar  hadoop-day02中
      • 配置环境变量

        解压到一个没有中文 没有空格的目录下。
        HADOOP_HOME=C:\\soft\\hadoop-2.6.0-cdh5.14.0
        path=;%HADOOP_HOME%\\bin
        • 如何验证windows本地hadoop环境正常呢?

          • cmd验证 hadoop

          • 双击bin/winutils.exe 如果一闪而过就正常 如果弹窗报错就需要安装动态库

      • 重启IDEA 加载环境变量

      • 如果重启无效 右键使用管理员身份执行IDEA。


HDFS辅助工具

  • 跨集群复制数据 distcp(distributed copy)

    • 功能:实现在不同的hadoop集群之间进行数据复制同步。

    • 用法:

      #同一个集群内 复制操作
      hadoop fs -cp /zookeeper.out /it
      ​
      #跨集群复制操作
      hadoop distcp hdfs://node1:8020/1.txt  hdfs:node5:8020/it
  • 文件归档工具 archive

    • 背景

      hdfs的架构设计不适合小文件存储的。
      因为小文件不管多小 都需要一定的元数据记录它 元数据保存在内存中的,
      如果集群小文件过多 就会造成内存被撑爆。 俗称 小文件吃内存。
    • archive功能

      • 将一批小文件归档一个档案文件。

      • 底层是通过MapReduce程序将小文件进行合并的。启动yarn集群执行mr程序。

      • 企业中可以根据时间 定时进行归档,比如一周创建一个档案。

    • 使用

      #创建档案
      hadoop archive -archiveName test.har -p /small /outputdir
      ​
      基于自己的需求 删除小文件 减少对内存的消耗
      hadoop fs -rm /small/*
      ​
      #查看档案文件 --归档之后的样子
      [root@node1 ~]# hadoop fs -ls hdfs://node1:8020/outputdir/test.har
      Found 4 items
      hdfs://node1:8020/outputdir/test.har/_SUCCESS
      hdfs://node1:8020/outputdir/test.har/_index
      hdfs://node1:8020/outputdir/test.har/_masterindex
      hdfs://node1:8020/outputdir/test.har/part-0
      ​
      #查看档案文件 --归档之前的样子
      [root@node1 ~]# hadoop fs -ls har://hdfs-node1:8020/outputdir/test.har
      Found 3 items
       har://hdfs-node1:8020/outputdir/test.har/1.txt
       har://hdfs-node1:8020/outputdir/test.har/2.txt
       har://hdfs-node1:8020/outputdir/test.har/3.txt
      ​
      #从档案文件中提取文件
      [root@node1 ~]# hadoop fs -cp har://hdfs-node1:8020/outputdir/test.har/* /small/
      [root@node1 ~]# hadoop fs -ls /small
      Found 3 items
      -rw-r--r--   3 root supergroup          2 2021-05-24 17:58 /small/1.txt
      -rw-r--r--   3 root supergroup          2 2021-05-24 17:58 /small/2.txt
      -rw-r--r--   3 root supergroup          2 2021-05-24 17:58 /small/3.txt
    • 注意

      • archive没有压缩的功能 就是简单的合二为一的操作 减少小文件个数。

  • HDFS snapshot快照

    • 功能:对文件系统的某一时刻状态进行拍照 相当于备份。

    • 注意:使用快照之前 需要先开启快照的功能。通常针对指定的重要的目录创建快照。

    • 栗子

      [root@node1 ~]# hdfs snapshotDiff /small mykz1 mykz2
      Difference between snapshot mykz1 and snapshot mykz2 under directory /small:
      M       .
      +       ./a.txt
      -       ./1.txt
    • 意外收获

      • 拥有快照能力的目录 客观层面也被保护 无法执行删除操作。

      [root@node1 ~]# hadoop fs -rm -r /small
      21/05/24 18:13:21 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 1440 minutes, Emptier interval = 0 minutes.
      rm: Failed to move to trash: hdfs://node1:8020/small: The directory /small cannot be deleted since /small is snapshottable and already has snapshots

思考题

#1、分布式文件系统应该具备哪些属性 作用是什么
    分布式特性
    分块存储
    副本机制
    元数据记录
    抽象目录树
#2、HDFS原理 读写流程图  自己梳理。
#总结、概况nn dn角色职责
    分布式软件主从配合工作场景。
    大数据存储类软件都是这一个套路。 HBase Kafka ES
#3、java API练习
    环境 windows 影响后面MapReduce编程 spark编程。
#4、Archive 归档小文件
    面试:大数据如何处理小文件场景。HDFS
    

 

以上是关于hadoop离线day03--Hadoop HDFS的主要内容,如果未能解决你的问题,请参考以下文章

hadoop离线day02--Apache Hadoop

hadoop离线day05--Hadoop MapReduce

hadoop离线day05--Hadoop MapReduce

hadoop离线day04--Hadoop MapReduce

hadoop离线day06--Hadoop MapReduceHDFS高阶

hadoop离线day06--Hadoop MapReduceHDFS高阶