赞
踩
•数据量太大,单机存储能力有上限,需要靠数量来解决问题
•数量的提升带来的是网络传输、磁盘读写、CPU、内存等各方面的综合提升。 分布式组合在一起可以达到1+1>2的效果
•去中心化模式:没有明确中心,大家协调工作(区块链、P2P)
•中心化模式:有明确的中心,基于中心节点分配工作
主从模式(Master-Slaves)就是中心化模式,表示有一个主节点来作为管理者,管理协调下属一批从节点工作。也称一主多从模式。
主从模式(中心化模式)的架构
主角色:NameNode
•HDFS系统的主角色,是一个独立的进程
•负责管理HDFS整个文件系统
•负责管理DataNode
从角色:DataNode
•HDFS系统的从角色,是一个独立进程
•主要负责数据的存储,即存入数据和取出数据
主角色辅助角色:SecondaryNameNode
•NameNode的辅助,是一个独立进程
•主要帮助NameNode完成元数据整理工作(打杂)
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
除了一键启停外,也可以单独控制进程的启停。
$HADOOP_HOME/sbin/hadoop-daemon.sh
,此脚本可以单独控制所在机器的进程的启停用法:
hadoop-daemon.sh (start|status|stop) (namenode|secondarynamenode|datanode)
$HADOOP_HOME/bin/hdfs
,此程序也可以用以单独控制所在机器的进程的启停用法:
hdfs --daemon (start|status|stop) (namenode|secondarynamenode|datanode)
HDFS作为分布式存储的文件系统,有其对数据的路径表达方式。
• H D F S 同 L i n u x 系统一样,均是以 / 作为根目录的组织形式 \textcolor{red}{•HDFS同Linux系统一样,均是以/作为根目录的组织形式} •HDFS同Linux系统一样,均是以/作为根目录的组织形式
•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,否则一般不用写协议头
关于HDFS文件系统的操作命令,Hadoop提供了2套命令体系
•hadoop命令(老版本用法),用法:
hadoop fs [generic options]
•hdfs命令(新版本用法),用法:
hdfs dfs [generic options]
两者在文件系统操作上,用法完全一致,用哪个都可以,某些特殊操作需要选择
h
a
d
o
o
p
命令或
h
d
f
s
命令
\textcolor{red}{两者在文件系统操作上,用法完全一致,用哪个都可以,某些特殊操作需要选择hadoop命令或hdfs命令}
两者在文件系统操作上,用法完全一致,用哪个都可以,某些特殊操作需要选择hadoop命令或hdfs命令
hadoop fs -mkdir [-p] <path> ...
hdfs dfs -mkdir [-p] <path> ...
path 为待创建的目录
-p选项的行为与Linux mkdir -p
一致,它会沿着路径创建父目录
示例
hadoop fs -mkdir -p /itcast/bigdata
hdfs fs -mkdir -p /itheima/hadoop
hadoop fs -ls [-h] [-R] [<path> ...]
hdfs dfs -ls [-h] [-R] [<path> ...]
path 指定目录路径
-h 人性化显示文件size
-R 递归查看指定目录及其子目录
示例查看根目录:
hadoop fs -put [-f] [-p] <localsrc> ... <dst>
hdfs dfs -put [-f] [-p] <localsrc> ... <dst>
-f 覆盖目标文件(同名文件已存在的情况下)
-p 保留访问和修改时间,所有权和权限。
localsrc 本地文件系统(客户端所在机器)
dst 目标文件系统(HDFS)
示例:
hadoop fs -put words.txt /itcast
hdfs dfs -put file:///etc/profile hdfs://node1:8020/itcast#前面是本地,后面的是hdfs文件系统
hadoop fs -cat <src> ...
hdfs dfs -cat <src> ...
读取指定文件全部内容,显示在标准输出控制台
示例:
hadoop fs -cat /itcast/words.txt
hdfs dfs -cat /itcast/profile
读取大文件可以使用管道符配合more,这样在读取大文件时可以通过按空格翻页不至于干崩终端
hadoop fs -cat <src> | more
hdfs dfs -cat <src> | more
hadoop fs -get [-f] [-p] <src> ... <localdst>
hdfs dfs -get [-f] [-p] <src> ... <localdst>#前面写HDFS路径,后面写Linux路径
下载文件到本地文件系统指定目录,localdst必须是目录
-f 覆盖目标文件(同名文件已存在的情况下)
-p 保留访问和修改时间,所有权和权限。
hadoop fs -cp [-f] <src> ... <dst>
hdfs dfs -cp [-f] <src> ... <dst>#从HDFS复制到HDFS
hadoop fs -appendToFile <localsrc> ... <dst>
hdfs dfs -appendToFile <localsrc> ... <dst>#前面是本地的文件,后面是hdfs文件
将所有给定本地文件的内容追加到给定dst文件。
dst如果文件不存在,将创建该文件。
如果为-,则输入为从标准输入中读取。
hadoop fs -mv <src> ... <dst>
hdfs dfs -mv <src> ... <dst>
移动文件到指定文件夹下
可以使用该命令移动数据,重命名文件的名称
hadoop fs -rm -r [-skipTrash] URI [URI ...]
hdfs dfs -rm -r [-skipTrash] URI [URI ...]
删除指定路径的文件或文件夹
-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-->
除了使用命令操作HDFS文件系统外,在HDFS的WEB UI上也可以查看HDFS文件系统的内容
如图,在设置->Plugins(插件)-> Marketplace(市场),搜索Big Data Tools,点击Install安装即可
需要对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中
打开插件
或者如图指定Windows上解压的Hadoop安装文件夹的etc/hadoop目录也可以
会自动读取配置文件连接上HDFS
因为选取configuration files directory方式连接的话,ide会读取本机Hadoop配置文件core-site.xml,但我们在Windows上解压的Hadoop文件并没有修改过配置文件,所以如果想用这种方式进行连接,需要先在Linux上将etc\hadoop文件夹打包下载替换掉Windows的文件夹。
问题:文件大小不一,不利于统一管理
解决:设定统一的管理单位,block块
Block块:HDFS的最小存储单位,每个block块256MB(可以修改)
问题:如果丢失或损坏了某个block块,导致文件不完整了怎么办(block块越多,损坏的几率越大)
解决:通过多个副本(备份)解决,每个block块都有2个(可修改)备份,每个副本都复制到其他服务器一份
设置默认文件上传到HDFS中拥有的副本数量,可以在hdfs-site.xml
中配置如下属性:
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
这个属性默认是3,一般情况下,我们无需主动配置(除非需要设置非3的数值)
如果需要自定义这个属性,请修改每一台服务器的hdfs-site.xml
文件,并设置此属性。
•除了配置文件外,我们还可以在上传文件的时候,临时决定被上传文件以多少个副本存储。
hadoop fs -D dfs.replication=2 -put test.txt /tmp/
如上命令,就可以在上传test.txt的时候,临时设置其副本数为2
•对于已经存在HDFS的文件,修改dfs.replication属性不会生效,如果要修改已存在文件可以通过命令
hadoop fs -setrep [-R] 2 path
如上命令,指定path的内容将会被修改为2个副本存储。
-R选项可选,使用-R表示对子目录也生效。
我们可以使用hdfs提供的fsck命令来检查文件的副本数
hdfs fsck path [-files [-blocks [-locations]]]
fsck可以检查指定路径是否正常
•-files可以列出路径内的文件状态
•-files -blocks 输出文件块报告(有几个块,多少副本)
•-files -blocks -locations 输出每一个block的详情
对于块(block),hdfs默认设置为256MB一个,也就是1GB文件会被划分为4个block存储。
块大小可以通过参数:
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
<description>设置HDFS块大小,单位是b</description>
</property>
如上,设置为256MB
edits文件,是一个流水账文件,记录了hdfs中的每一次操作,以及本次操作影响的文件其对应的block
edits记录每一次HDFS的操作逐渐变得越来越大,所以,会存在多个edits文件确保不会有超大edits的存在,保证检索性能
当用户想要查看某文件内容时,需要在全部的edits中搜索(还需要按顺序从头到尾,避免后期改名或删除文件),效率非常低,于是需要将全部的edits文件合并为最终结果,即可得到一个fsimage文件。
NameNode基于edits和FSImage的配合,完成整个文件系统文件的管理。
① 每次对HDFS的操作,均被edits文件记录
②edits达到大小上线后,开启新的edits记录
③ 定期进行edits的合并操作
•如当前没有fsimage文件, 将全部edits合并为第一个fsimage
•如当前已存在fsimage文件,将全部edits和已存在的fsimage进行合并,形成新的fsimage
④重复123流程
对于元数据的合并,是一个定时过程,基于:
•dfs.namenode.checkpoint.period
,默认3600(秒)即1小时
•dfs.namenode.checkpoint.txns
,默认1000000,即100W次事务
只要有一个达到条件就执行。
检查是否达到条件,默认60秒检查一次,基于:
•dfs.namenode.checkpoint.check.period
,默认60(秒),来决定
SecondaryNameNode是HDFS中的一个辅助角色
SecondaryNameNode会通过http从NameNode拉取数据(edits和fsimage)然后合并完成后提供给NameNode使用。
①客户端向NameNode发起请求
②NameNode审核权限、剩余空间后,满足条件允许写入,并告知客户端写入的DataNode地址
③客户端向指定的DataNode发送数据包
④ 被写入数据的DataNode同时完成数据副本的复制工作,将其接收的数据分发给其它DataNode
⑤如上图,DataNode1复制给DataNode2,然后基于DataNode2复制给Datanode3和DataNode4
⑥写入完成客户端通知NameNode,NameNode做元数据记录工作
关键信息点:
•NameNode不负责数据写入,只负责元数据记录和权限审批
•客户端直接向1台DataNode写数据,这个DataNode一般是离客户端最近(网络距离)的那一个
•数据块副本的复制工作,由DataNode之间自行完成(构建一个PipLine,按顺序复制分发,如图1给2, 2给3和4)
①客户端向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地址、路由表来推断网络距离
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。