当前位置:   article > 正文

HDFS学习笔记_hdfsdfsmore

hdfsdfsmore

一、为什么需要分布式存储

•数据量太大,单机存储能力有上限,需要靠数量来解决问题

•数量的提升带来的是网络传输、磁盘读写、CPU、内存等各方面的综合提升。 分布式组合在一起可以达到1+1>2的效果

二、分布式的基础架构分析

1.分布式系统常见的组织形式?

•去中心化模式:没有明确中心,大家协调工作(区块链、P2P)

•中心化模式:有明确的中心,基于中心节点分配工作

2.什么是主从模式?

主从模式(Master-Slaves)就是中心化模式,表示有一个主节点来作为管理者,管理协调下属一批从节点工作。也称一主多从模式。

3.Hadoop是哪种模式?

主从模式(中心化模式)的架构

三、HDFS的基础架构

在这里插入图片描述

主角色:NameNode

•HDFS系统的主角色,是一个独立的进程

•负责管理HDFS整个文件系统

•负责管理DataNode

从角色:DataNode

•HDFS系统的从角色,是一个独立进程

•主要负责数据的存储,即存入数据和取出数据

主角色辅助角色:SecondaryNameNode

•NameNode的辅助,是一个独立进程

•主要帮助NameNode完成元数据整理工作(打杂)

四、HDFS的Shell操作

1.进程启停管理

1.1一键启停脚本

Hadoop HDFS组件内置了HDFS集群的一键启停脚本。

$HADOOP_HOME/sbin/start-dfs.sh,一键启动HDFS集群

执行原理:

在执行此脚本的机器上,启动SecondaryNameNode

•读取core-site.xml内容(fs.defaultFS项),确认NameNode所在机器,启动NameNode

•读取workers内容,确认DataNode所在机器,启动全部DataNode

•$HADOOP_HOME/sbin/stop-dfs.sh,一键关闭HDFS集群

执行原理:

在执行此脚本的机器上,关闭SecondaryNameNode

•读取core-site.xml内容(fs.defaultFS项),确认NameNode所在机器,关闭NameNode

•读取workers内容,确认DataNode所在机器,关闭全部NameNode

1.2单进程启停

除了一键启停外,也可以单独控制进程的启停。

  1. $HADOOP_HOME/sbin/hadoop-daemon.sh,此脚本可以单独控制所在机器的进程的启停

用法:

hadoop-daemon.sh (start|status|stop) (namenode|secondarynamenode|datanode)
  • 1
  1. $HADOOP_HOME/bin/hdfs,此程序也可以用以单独控制所在机器的进程的启停

用法:

hdfs --daemon (start|status|stop) (namenode|secondarynamenode|datanode)
  • 1

2.文件系统操作命令

2.1HDFS文件系统基本信息

HDFS作为分布式存储的文件系统,有其对数据的路径表达方式。

• H D F S 同 L i n u x 系统一样,均是以 / 作为根目录的组织形式 \textcolor{red}{•HDFS同Linux系统一样,均是以/作为根目录的组织形式} HDFSLinux系统一样,均是以/作为根目录的组织形式

•Linux: /usr/local/hello.txt

•HDFS: /usr/local/hello.txt
在这里插入图片描述
**如何区分呢?**通过协议头来区分

•Linux:file:///

•HDFS:hdfs://namenode:port/

如上路径:

•Linux:file:///usr/local/hello.txt

•HDFS:hdfs://node1:8020/usr/local/hello.txt

协议头file:/// 或 hdfs://node1:8020/ 可以省略 \textcolor{red}{可以省略} 可以省略

•需要提供Linux路径的参数,会自动识别为file://

•需要提供HDFS路径的参数,会自动识别为hdfs://

除非你明确需要写或不写会有BUG,否则一般不用写协议头

2.2命令体系

关于HDFS文件系统的操作命令,Hadoop提供了2套命令体系

•hadoop命令(老版本用法),用法:

hadoop fs [generic options]
  • 1

在这里插入图片描述
•hdfs命令(新版本用法),用法:

hdfs dfs [generic options]
  • 1

在这里插入图片描述
两者在文件系统操作上,用法完全一致,用哪个都可以,某些特殊操作需要选择 h a d o o p 命令或 h d f s 命令 \textcolor{red}{两者在文件系统操作上,用法完全一致,用哪个都可以,某些特殊操作需要选择hadoop命令或hdfs命令} 两者在文件系统操作上,用法完全一致,用哪个都可以,某些特殊操作需要选择hadoop命令或hdfs命令

2.2.1创建文件夹
hadoop fs -mkdir [-p] <path> ...
hdfs dfs -mkdir [-p] <path> ...
  • 1
  • 2

path 为待创建的目录

-p选项的行为与Linux mkdir -p一致,它会沿着路径创建父目录

示例

hadoop fs -mkdir -p /itcast/bigdata
hdfs fs -mkdir -p /itheima/hadoop
  • 1
  • 2
2.2.2查看指定目录下内容
hadoop fs -ls [-h] [-R] [<path> ...] 
hdfs dfs -ls [-h] [-R] [<path> ...]
  • 1
  • 2

path 指定目录路径

-h 人性化显示文件size

-R 递归查看指定目录及其子目录
示例查看根目录:
在这里插入图片描述

2.2.3上传文件到HDFS指定目录下
hadoop fs -put [-f] [-p] <localsrc> ... <dst>
hdfs dfs -put [-f] [-p] <localsrc> ... <dst>
  • 1
  • 2

-f 覆盖目标文件(同名文件已存在的情况下)

-p 保留访问和修改时间,所有权和权限。

localsrc 本地文件系统(客户端所在机器)

dst 目标文件系统(HDFS)

示例:

hadoop fs -put words.txt /itcast
hdfs dfs -put file:///etc/profile hdfs://node1:8020/itcast#前面是本地,后面的是hdfs文件系统
  • 1
  • 2
2.2.4查看HDFS文件内容
hadoop fs -cat <src> ... 
hdfs dfs -cat <src> ...
  • 1
  • 2

读取指定文件全部内容,显示在标准输出控制台

示例:

hadoop fs -cat /itcast/words.txt
hdfs dfs -cat /itcast/profile
  • 1
  • 2

读取大文件可以使用管道符配合more,这样在读取大文件时可以通过按空格翻页不至于干崩终端

hadoop fs -cat <src> | more
hdfs dfs -cat <src> | more
  • 1
  • 2
2.2.5下载HDFS文件
hadoop fs -get [-f] [-p] <src> ... <localdst>
hdfs dfs -get [-f] [-p] <src> ... <localdst>#前面写HDFS路径,后面写Linux路径
  • 1
  • 2

下载文件到本地文件系统指定目录,localdst必须是目录

​ -f 覆盖目标文件(同名文件已存在的情况下)

​ -p 保留访问和修改时间,所有权和权限。

2.2.6拷贝HDFS文件
hadoop fs -cp [-f] <src> ... <dst> 
hdfs dfs -cp [-f] <src> ... <dst>#从HDFS复制到HDFS
  • 1
  • 2
2.2.7追加数据到HDFS文件中
hadoop fs -appendToFile <localsrc> ... <dst>
hdfs dfs -appendToFile <localsrc> ... <dst>#前面是本地的文件,后面是hdfs文件
  • 1
  • 2

将所有给定本地文件的内容追加到给定dst文件。
dst如果文件不存在,将创建该文件。
如果为-,则输入为从标准输入中读取。

2.2.8HDFS移动、重命名操作
hadoop fs -mv <src> ... <dst>
hdfs dfs -mv <src> ... <dst>
  • 1
  • 2

移动文件到指定文件夹下
可以使用该命令移动数据,重命名文件的名称

2.2.9HDFS数据删除操作
hadoop fs -rm -r [-skipTrash] URI [URI ...]
hdfs dfs -rm -r [-skipTrash] URI [URI ...]
  • 1
  • 2

删除指定路径的文件或文件夹

​ -r 删除文件夹

​ -skipTrash 跳过回收站,直接删除

<!--回收站功能默认关闭,如果要开启需要在core-site.xml内配置:-->
<property>
<name>fs.trash.interval</name>
<value>1440</value><!--回收站的保留文件时间区间,1440代表一个星期的时间-->
</property>
 
<property>
<name>fs.trash.checkpoint.interval</name>
<value>120</value><!--回收站检查的间隔,120代表每隔两小时检查一次,如果超过期限的就清理掉-->
</property>
<!--无需重启集群,在哪个机器配置的,在哪个机器执行命令就生效。
回收站默认位置在:/user/用户名(hadoop)/.Trash-->
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2.3HDFS WEB浏览

除了使用命令操作HDFS文件系统外,在HDFS的WEB UI上也可以查看HDFS文件系统的内容
在这里插入图片描述

3.HDFS客户端 -Jetbrains产品插件

3.1 Big Data Tools插件

如图,在设置->Plugins(插件)-> Marketplace(市场),搜索Big Data Tools,点击Install安装即可
在这里插入图片描述

3.2 配置Windows

需要对Windows系统做一些基础设置,配合插件使用

•解压Hadoop安装包到Windows系统,如解压到:E:\hadoop-3.3.4

•设置$HADOOP_HOME环境变量指向:E:\hadoop-3.3.4

•下载

•hadoop.dll下载链接

•winutils.exe下载链接

•可以自行下载,或从课程资料中获取

•将hadoop.dll和winutils.exe放入$HADOOP_HOME/bin中

3.3配置Big Data Tools插件

打开插件
在这里插入图片描述
在这里插入图片描述或者如图指定Windows上解压的Hadoop安装文件夹的etc/hadoop目录也可以

会自动读取配置文件连接上HDFS

因为选取configuration files directory方式连接的话,ide会读取本机Hadoop配置文件core-site.xml,但我们在Windows上解压的Hadoop文件并没有修改过配置文件,所以如果想用这种方式进行连接,需要先在Linux上将etc\hadoop文件夹打包下载替换掉Windows的文件夹。
在这里插入图片描述

3.4使用Big Data Tools插件

在这里插入图片描述
在这里插入图片描述

五、HDFS存储原理

1.存储原理

问题:文件大小不一,不利于统一管理

解决:设定统一的管理单位,block块

Block块:HDFS的最小存储单位,每个block块256MB(可以修改)

问题:如果丢失或损坏了某个block块,导致文件不完整了怎么办(block块越多,损坏的几率越大)

解决:通过多个副本(备份)解决,每个block块都有2个(可修改)备份,每个副本都复制到其他服务器一份

2.fsck命令

2.1HDFS副本块数量的配置

设置默认文件上传到HDFS中拥有的副本数量,可以在hdfs-site.xml中配置如下属性:

<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>
  • 1
  • 2
  • 3
  • 4

这个属性默认是3,一般情况下,我们无需主动配置(除非需要设置非3的数值)

如果需要自定义这个属性,请修改每一台服务器的hdfs-site.xml文件,并设置此属性。

•除了配置文件外,我们还可以在上传文件的时候,临时决定被上传文件以多少个副本存储。

hadoop fs -D dfs.replication=2 -put test.txt /tmp/
  • 1

如上命令,就可以在上传test.txt的时候,临时设置其副本数为2

•对于已经存在HDFS的文件,修改dfs.replication属性不会生效,如果要修改已存在文件可以通过命令

hadoop fs -setrep [-R] 2 path
  • 1

如上命令,指定path的内容将会被修改为2个副本存储。

-R选项可选,使用-R表示对子目录也生效。

2.2fsck命令检查文件的副本数

我们可以使用hdfs提供的fsck命令来检查文件的副本数

hdfs fsck path [-files [-blocks [-locations]]]
  • 1

fsck可以检查指定路径是否正常

•-files可以列出路径内的文件状态

•-files -blocks 输出文件块报告(有几个块,多少副本)

•-files -blocks -locations 输出每一个block的详情
在这里插入图片描述

2.3block配置

对于块(block),hdfs默认设置为256MB一个,也就是1GB文件会被划分为4个block存储。

块大小可以通过参数:

 <property>
  <name>dfs.blocksize</name>
  <value>268435456</value>
  <description>设置HDFS块大小,单位是b</description>
 </property>
  • 1
  • 2
  • 3
  • 4
  • 5

如上,设置为256MB

3.NameNode元数据

在这里插入图片描述

3.1edits文件

edits文件,是一个流水账文件,记录了hdfs中的每一次操作,以及本次操作影响的文件其对应的block
在这里插入图片描述
edits记录每一次HDFS的操作逐渐变得越来越大,所以,会存在多个edits文件确保不会有超大edits的存在,保证检索性能

3.2.fsimage文件

当用户想要查看某文件内容时,需要在全部的edits中搜索(还需要按顺序从头到尾,避免后期改名或删除文件),效率非常低,于是需要将全部的edits文件合并为最终结果,即可得到一个fsimage文件。
在这里插入图片描述

3.3NameNode元数据管理维护

NameNode基于edits和FSImage的配合,完成整个文件系统文件的管理。

① 每次对HDFS的操作,均被edits文件记录

②edits达到大小上线后,开启新的edits记录

③ 定期进行edits的合并操作

•如当前没有fsimage文件, 将全部edits合并为第一个fsimage

•如当前已存在fsimage文件,将全部edits和已存在的fsimage进行合并,形成新的fsimage

④重复123流程

3.4元数据合并控制参数

对于元数据的合并,是一个定时过程,基于:

dfs.namenode.checkpoint.period,默认3600(秒)即1小时

dfs.namenode.checkpoint.txns,默认1000000,即100W次事务

只要有一个达到条件就执行。

检查是否达到条件,默认60秒检查一次,基于:

dfs.namenode.checkpoint.check.period,默认60(秒),来决定

3.5SecondaryNameNode的作用

SecondaryNameNode是HDFS中的一个辅助角色

SecondaryNameNode会通过http从NameNode拉取数据(edits和fsimage)然后合并完成后提供给NameNode使用。
在这里插入图片描述

4.HDFS的读写流程

4.1数据写入流程

①客户端向NameNode发起请求

②NameNode审核权限、剩余空间后,满足条件允许写入,并告知客户端写入的DataNode地址

③客户端向指定的DataNode发送数据包

④ 被写入数据的DataNode同时完成数据副本的复制工作,将其接收的数据分发给其它DataNode

⑤如上图,DataNode1复制给DataNode2,然后基于DataNode2复制给Datanode3和DataNode4

⑥写入完成客户端通知NameNode,NameNode做元数据记录工作

在这里插入图片描述
关键信息点:

NameNode不负责数据写入,只负责元数据记录和权限审批

•客户端直接向1台DataNode写数据,这个DataNode一般是离客户端最近(网络距离)的那一个

•数据块副本的复制工作,由DataNode之间自行完成(构建一个PipLine,按顺序复制分发,如图1给2, 2给3和4)

4.2数据读取流程

①客户端向NameNode申请读取某文件

② NameNode判断客户端权限等细节后,允许读取,并返回此文件的block列表

③客户端拿到block列表后自行寻找DataNode读取即可
在这里插入图片描述
关键点:

①数据同样不通过NameNode提供

②NameNode提供的block列表,会基于网络距离计算尽量提供离客户端最近的

这是因为1个block有3份,会尽量找离客户端最近的那一份让其读取

总结:

1、对于客户端读取HDFS数据的流程中,一定要知道

不论读、还是写,NameNode都不经手数据,均是客户端和DataNode直接通讯

不然对NameNode压力太大

2、写入和读取的流程,简单来说就是:

•NameNode做授权判断(是否能写、是否能读)

•客户端直连DataNode进行写入(由DataNode自己完成副本复制)、客户端直连DataNode进行block读取

•写入,客户端会被分配找离自己最近的DataNode写数据

•读取,客户端拿到的block列表,会是网络距离最近的一份
3、网络距离

•最近的距离就是在同一台机器

•其次就是同一个局域网(交换机)

•再其次就是跨越交换机

•再其次就是跨越数据中心

HDFS内置网络距离计算算法,可以通过IP地址、路由表来推断网络距离

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/772366
推荐阅读
相关标签
  

闽ICP备14008679号