HDFS分布式文件体系01-HDFS架构与SHELL操纵

打印 上一主题 下一主题

主题 1019|帖子 1019|积分 3057

学习目标

使学生了解文件体系的分类,能够形貌不同文件体系的特点
使学生熟悉HDFS架构,能够形貌HDFS架构的重要组件及其作用
使学生了解HDFS的特点,能够简述HDFS的特点
使学生掌握HDFS的文件读写原理,能够叙述HDFS读写文件的流程
使学生熟悉HDFS的健壮性,能够叙述HDFS心跳机制、副本机制和负载均衡等计谋
使学生掌握HDFS的Shell操纵,能够灵活运用HDFS Shell下令操纵HDFS
使学生掌握HDFS的Java API操纵,能够灵活使用Java API编写应用程序操纵HDFS
使学生熟悉Federation机制,能够形貌Federation机制的结构、特点并实现Federation机制。
使学生了解Erasure Coding,能够简述Erasure Coding节省存储空间的原理
第一课时

知识点1-文件体系的分类

单机文件体系

单机文件体系是全部文件体系的基础,也是我们常用的一种文件体系,它通过单台盘算机的当地磁盘存储文件,依靠操纵体系提供的文件体系实现文件的存储和管理。随着互联网的兴起,数据对存储容量要求越来越高,单机文件体系的缺点逐渐显现出来。
网络文件体系

网络文件体系可以看作单机文件体系的一个网络抽象,其本质与单机文件体系相似,网络文件体系可以通过网络共享文件,用户可以像访问当地磁盘的文件一样便捷的访问远端盘算机的文件。网络文件体系的出现肯定水平上解决了单机文件体系存储容量的瓶颈,用户可以将文件存储在网络文件体系和当地文件体系两个位置。网络文件体系没有解决单机文件体系性能低、可靠性低的瓶颈。
分布式文件体系




知识点2-HDFS架构

HDFS架构图如下:

(1)Block
   Block是HDFS文件体系中最小的存储单位,通常称之为数据块。
在HDFS文件体系中存储的文件会被拆分成多个Block,每个Block作为独立的单元举行存储,同一文件的多个Block通常存放在不同的DataNode。
在Hadoop 3.x版本中,默认Block巨细是128M。
注意:如果文件巨细或者文件被拆分后的Block没有达到128MB,则Block的巨细也会根据现实环境举行调整。
  (2)MetaData
   MeataData用于记载HDFS文件体系的相关信息,这些信息称之为元数据。
在HDFS文件体系中,为了确保元数据的快速访问,元数据会保存在内存中。为了防止元数据的丢失,会在当地磁盘中天生Fsimage文件备份元数据。
Hadoop集群运行的过程中,用户频繁操纵HDFS文件体系,内存中的元数据变化会非常快。如果内存中的元数据一旦更新,当地磁盘的Fsimage文件会同步更新,这些操纵非常消耗NameNode资源。
HDFS文件体系引入了Edits文件,该文件以追加方式记载内存中元数据的每一次变化,如果NameNode宕机,可以通过归并Fsimage文件和Edits文件的方式恢复内存中存储的元数据。
  (3)NameNode
   NameNode是HDFS集群的名称节点,通常称为主节点。如果NameNode由于故障原因宕机无法使用,那么用户就无法访问HDFS。NameNode作为HDFS的主节点,起着至关重要的作用,重要功能如下:
管理文件体系的命名空间。
处置惩罚客户端对文件的读写哀求。
维护HDFS的元数据。
维护和管理DataNode,并协调DataNode为客户端发起的读写哀求提供服务。
  (4)DataNode
   DataNode是HDFS集群中的数据节点,通常称为从节点,重要功能如下。
存储Block。
根据NameNode的指令,对Block举行创建、复制、删除等操纵。
定期向NameNode报告自身存储的Block列表以及健康状态。
负责为客户端发起的读写哀求提供服务。
  (5)SecondaryNameNode
   SecondaryNameNode是HDFS集群中的辅助节点;
定期从NameNode拷贝Fsimage文件并归并Edits文件,将归并效果发送给NameNode;
SecondaryNameNode和NameNode保存的Fsimage和Edits文件相同,可以作为NameNode的冷备份,当NameNode宕机无法使用时,可以通过手动操纵将SecondaryNameNode切换为NameNode。
  知识点3-HDFS的特点

   (1)存储大文件
(2)高容错性
(3)简朴的一致性模子
(4)移动盘算比移动数据更经济
(5)可移植性

  知识点4-HDFS的文件读写流程

客户端向HDFS写文件的具体流程。
   

  客户端从HDFS读文件的具体流程。
   

  知识点5-HDFS的健壮性

(1)心跳机制
   

  (2)副本机制
   

  (3)数据完整性校验
   

  (4)安全模式
   

  (5)快照
   

  高校教辅平台(http://tch.ityxb.com)发放测试题以巩固本节课的学习内容。
第二课时

知识点1-HDFS的Shell介绍

HDFS Shell雷同于Linux操纵体系中的Shell,都是一种下令语言,可以完成对HDFS上文件和目次的一系列操纵。
HDFS Shell的语法格式如下。

  1. hdfs [OPTIONS] SUBCOMMAND [SUBCOMMAND OPTIONS]
复制代码
  OPTIONS:可选,用来调试Hadoop。
SUBCOMMAND:表现HDFS Shell的子下令,用于操纵HDFS。
SUBCOMMAND OPTIONS:表现HDFS Shell子下令的选项。
  具体参考:
https://hadoop.apache.ac.cn/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html
HDFS Shell客户端下令中dfs子下令的子下令选项:

   ls:List files 列文件
du: Disk usage 磁盘使用率
mv: Move file 移动文件
cp: Copy file 复制文件
rm = ReMove
cat: concatenate 连锁 把多个文本连接起来
mkdir:Make Directory(创建目次)

  -ls下令

  1. hdfs dfs –ls [-S][-C][-r][-h][-R] <path>
复制代码
  参数-S:可选,用于根据文件的巨细,按照由大到小的顺序显示指定目次的内容。
参数-C:可选,用于显示指定目次下文件和子目次的路径,不显示关于文件和子目次的其他信息。
参数-r:可选,用于根据文件的巨细,按照由小到大的顺序显示指定目次的内容。
参数-h:可选,用于将默认的文件巨细(字节数)格式化为便于检察的格式举行显示。
参数-R:可选,用于递归显示指定目次及其子目次的信息。
参数path:用于指定检察的目次。
  1. hdfs dfs –ls -S /data
复制代码
  参数-S:可选,用于根据文件的巨细,按照由大到小的顺序显示指定目次的内容。
  1. hdfs dfs –ls -r -h /data
复制代码
  参数-r:可选,用于根据文件的巨细,按照由小到大的顺序显示指定目次的内容。
参数-h:可选,用于将默认的文件巨细(字节数)格式化为便于检察的格式举行显示。
  1. hdfs dfs –ls -R -C /data
复制代码
  递归显示目次/data及其子目次的信息,并且信息中仅显示文件和子目次的路径。
参数-C:可选,用于显示指定目次下文件和子目次的路径,不显示关于文件和子目次的其他信息。
参数-R:可选,用于递归显示指定目次及其子目次的信息。
  -du

用于检察HDFS指定目次下每个文件和子目次巨细,语法格式如下。
  1. hdfs dfs -du [-s] [-h] <path>
复制代码
  参数-s:可选,用于检察指定目次下全部文件和子目次的总巨细。
参数-h:可选,用于将默认的文件和子目次巨细(字节数)格式化为便于检察的格式举行显示。
  1. hdfs dfs –du –h /data
复制代码
检察HDFS的目次/data中,每个文件和子目次的巨细,并且将默认的文件和子目次巨细格式化为便于检察的格式举行显示。
-mv

-mv用于移动HDFS指定目次或文件,语法格式如下。
  1. hdfs dfs -mv <src> <dst>
复制代码
  参数src:用于指定要移动的目次或文件。
参数dst:用于将目次或文件移动到指定的目次,如果指定的目次不存在,并且与移动的目次或文件处于同一起径下,那么会对文件或者目次举行重命名操纵。
注意:移动的目次或文件,在指定的目次中不能存在。
  将目次/data中的子目次/dataChild1移动到目次/data/dataChild中。
  1. hdfs dfs –mv /data/dataChild1 /data/dataChild
复制代码
将目次/data中的文件dataA重命名为dataA_New。
  1. hdfs dfs –mv /data/dataA /data/dataA_New
复制代码
-cp

-cp用于复制HDFS指定目次或文件,语法格式如下
  1. hdfs dfs -cp <src> <dst>
复制代码
  参数src:用于指定要复制的目次或文件,可以同时复制多个文件或目次,每个文件或目次用空格举行分隔。
参数dst:用于将目次或文件复制到指定的目次,该目次必须已经存在,并且要复制的文件或目次在指定的目次中不能存在。如果复制的是单文件或目次,则可以重新命名复制后的文件或目次名称。
  将目次/data下的文件dataA_New和dataB复制到目次/data/dataChild。
  1. hdfs dfs -ls -R /data
  2. hdfs dfs -cp /data/dataA_New /data/dataB /data/dataChild
复制代码
将目次/data下的文件dataA_New复制到子目次/dataChild,并且重命名为dataA。
  1. hdfs dfs -cp /data/dataA_New /data/dataChild/dataA
复制代码
-rm

-rm用于删除HDFS指定目次或文件,语法格式如下。
  1. hdfs dfs -rm [-f] [-r] [-skipTrash] [-safely] <src>
复制代码
  参数-f:可选,用于判断删除的目次或文件是否存在。
参数-r:可选,用于递归删除指定目次中的全部子目次和文件。
参数-skipTrash:可选,表现删除的文件或目次不会放入接纳站。
参数-safely:可选,用于启动安全确认,当删除目次时会提示是否删除,避免误删。
  使用子下令选项-rm删除目次/data的子目次/dataChild。
  1. hdfs dfs –rm –r /data/dataChild
复制代码
-put

-put用于将当地文件体系中指定文件上传到HDFS指定目次,语法格式如下。
  1. hdfs dfs -put [-f] <localsrc> <dst>
复制代码
  参数-f:可选,用于判断上传的文件在HDFS指定目次是否存在。如果存在则上传的文件会替换HDFS指定目次中已经存在的文件。
参数localsrc:用于指定当地文件体系中上传的文件,可以同时上传多个文件。
参数dst:用于指定上传到HDFS的目次,该目次必须存在。
  使用子下令选项-put将当地文件体系中/export/data目次下的文件a.txt和b.txt,上传到HDFS的目次/data。
  1. hdfs dfs –put /export/data/a.txt /export/data/b.txt /data
复制代码
-cat

-cat用于检察HDFS指定文件内容,语法格式如下。
  1. hdfs dfs –cat <src>
复制代码
  参数src:用于指定检察的文件。
  使用子下令选项-cat检察目次/data中文件a.txt的内容。
  1. hdfs dfs –cat /data/a.txt
复制代码
-help

-mkdir

  1. hdfs dfs -mkdir [-p] <path>
复制代码
  参数-p:可选,它有两个作用:
第一是创建目次,如果要创建的目次存在,则不会返回错误信息,也不会重新创建。
第二是递归创建目次及其子目次。
  在HDFS的目次/data中创建子目次/dataChild1,并在子目次/dataChild1中创建子目次/dataChild2。
   hdfs dfs –mkdir –p /data/dataChild1/dataChild2
  -get

-get用于将HDFS的指定文件下载到当地文件体系指定目次,语法格式如下。
  1. hdfs dfs -get [-f] <src> <localdst>
复制代码
  参数-f:可选,用于判断下载的文件在当地文件体系的指定目次是否存在。如果存在则下载的文件会替换指定目次中已存在的文件。
参数src:用于指定HDFS中的文件,可以同时下载多个文件。
参数localdst:用于指定下载到当地文件体系的路径,该路径必须存在。
  知识点2-案例-通过Shell脚本定时采集数据到HDFS

通过一个案例演示如何通过Shell脚本周期性的将Hadoop的日志文件上传到HDFS,操纵步调如下。
(1)创建Shell脚本
  1. vi uploadHDFS.sh
复制代码
内容融入
  1. #!/bin/bash
  2. # 添加hadoop环境变量
  3. export HADOOP_HOME=/opt/module/hadoop-3.3.4
  4. export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  5. # 指定hadoop日志存放位置
  6. hadoop_log_dir=/opt/module/hadoop-3.3.4/logs/
  7. # hadoop日志的存放位置
  8. log_toupload_dir=/opt/data/logs/toupload/
  9. # 获取当前时间
  10. date=`date +%Y_%m_%d_%H_%M`
  11. # 上传到hdfs上的目录名称
  12. hdfs_dir=/hadoop_log/$date/
  13. # 判断不同服务器的hadoop日志目录是否存在
  14. # -d 判断是否为目录
  15. if [ -d $log_toupload_dir ];
  16. then
  17.         echo "$log_toupload_dir exits"
  18. else
  19.         mkdir -p $log_toupload_dir
  20. fi
  21. # 将不同虚拟机的hadoop日志文件收集到目录/opt/data/logs/toupload/
  22. ls $hadoop_log_dir | while read fileName
  23. do
  24. # 如果文件名是.log结尾
  25. if [[ $fileName == *.log ]];
  26. then
  27.         echo "moving hadoop log to $log_toupload_dir"
  28.         cp $hadoop_log_dir/*.log $log_toupload_dir
  29.         # 如果有多台,需要把多个日志都复制到当前节点的的/opt/data/logs/toupload/目录
  30.         #scp root@node2:$hadoop_log_dir/*.log $log_toupload_dir
  31.         #scp root@node3:$hadoop_log_dir/*.log $log_toupload_dir
  32.         echo "moving hadoop log willDoing"
  33.         break
  34. fi
  35. done
  36. echo "create $hdfs_dir"
  37. # 创建hdfs目录
  38. hdfs dfs -mkdir -p $hdfs_dir
  39. ls $log_toupload_dir | while read fileName
  40. do
  41.         echo "upload hadoop log $fileName to $hdfs_dir"
  42.         hdfs dfs -put $log_toupload_dir$fileName $hdfs_dir
  43.         echo "upload hadoop log $fileName willDoing"
  44. done
  45. echo "delete $log_toupload_dir log"
  46. # 删除临时目录/opt/data/logs/toupload/
  47. rm -fr $log_toupload_dir
复制代码
(2)执行Shell脚本
启动hadoop集群
  1. start-dfs.sh
复制代码
  1. sh uploadHDFS.sh
复制代码
如下:

(3)验证Hadoop日志文件是否上传成功
  1. http://192.168.100.3:9870/
复制代码
(4)定时执行Shell脚本文件
查抄是否安装crontab
  1. rpm -qa | grep crontab
复制代码
  rpm -qa:rpm 是一个用于管理RPM包的工具,-qa 选项表现列出全部已安装的软件包(其中 -q 表现查询,-a 表现全部包)。这条下令会输出一个包含全部已安装包名称的列表。
|(管道符号):这是一个管道操纵符,它将前一个下令的输出作为后一个下令的输入。在这个例子中,rpm -qa 输出的全部包名会被通报给 grep 下令。
grep crontab:grep 是一个强大的文本搜索工具,它可以搜索文件中的指定模式。在这里,crontab 是一个模式,grep 将在管道传入的数据中搜索包含“crontab”的行。这将资助你找到与crontab相关的已安装包。
  若没有安装,可以执行
  1. yum -y install vixie-cron
  2. yum -y install crontabs
复制代码
启动crontab
  1. service crond status
  2. service crond start
复制代码
为脚本添加权限
检察uploadHDFS.sh的权限

  1. chmod 777 uploadHDFS.sh
复制代码
在虚拟机node1执行“crontab -e”下令编辑Crontab文件,设置定时使命,在Crontab文件添加如下内容。
  1. */2 * * * * /export/data/uploadHDFS.sh
复制代码
10分钟后,刷新HDFS Web UI界面可以看到,需要上传的日志文件已经按照日期分类上传到HDFS中


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表