1 HDFS的基本介绍
HDFS(Hadoop Distributed File System):是 Apache Hadoop 项目的一个子项目. Hadoop 非常适于存储大型数据 (比如 TB 和 PB), 其就是使用 HDFS 作为存储系统. HDFS 使用多台计算机存储文件, 并且提供统一的访问接口, 像是访问一个普通文件系统一样使用分布式文件系统 分布式文件存储系统,适合于存储大型的数据。HDFS主要是存储历史文件数据,数据一般不会发生修改,HDFS不支持随机读写操作
HDFS的特点:
HDFS文件系统可存储超大文件, 时效性稍差
HDFS具有硬件故障检测和自动快速恢复功能’
HDFS为数据存储提供很强的扩展能力,制约HDFS存储容量主要是NameNode,如果内存中元数据满了,也就无法存储数据了
HDFS存储一般为一次写入, 多次读取, 只支持追加写入, 不支持随机修改
HDFS可以在普通廉价的机器上运行, 整个HDFS中, 最贵机器是NameNode
HDFS不适用场景:
1- 不合适需要对数据进行随机读写操作
2- 不合适交互性强环境
3- 不合适存储大量的小文件, 一个文件至少有一份元数据, 小文件越多, 元数据越多, 元数据多了占用内存空间越大, 导致内存占用比较高,本来文件系统能存储数据, 由于内存满了, 也就无法存储了
HDFS以文件块的形式存储数据,一个文件最大为128M
HDFS的架构
HDFS采用Master/Slave架构
一个HDFS集群有两个重要的角色,分别是Namenode和Datanode。
HDFS的四个基本组件:HDFS Client、NameNode、DataNode和Secondary NameNode
HDFS Client
就是客户端。
文件切分。文件上传 HDFS 的时候,Client 将文件切分成 一个一个的Block,然后进行存储
与 NameNode 交互,获取文件的位置信息。
与 DataNode 交互,读取或者写入数据。
Client 提供一些命令来管理 和访问HDFS,比如启动或者关闭HDFS。
NameNode 名称节点:主角色,负责元数据管理和读写任务分配
就是 master,它是一个主管、管理者。
管理 HDFS 元数据(文件路径,文件的大小,文件的名字,文件权限,文件的block切片信息….)
配置副本策略,处理客户端读写请求
DataNode 数据节点:从角色,负责数据的读写及存储工作
就是Slave。NameNode 下达命令,DataNode 执行实际的操作。
存储实际的数据块,执行数据块的读/写操作。
定时向namenode汇报block信息。
SecondaryNameNode 辅助的名称节点
并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。
辅助NameNode,分担其工作量,负责对服务器集群的机器状态进行查看,并且将状态的信息传递给namenode
在紧急情况下,可辅助恢复NameNode。
HDFS三大核心机制
1、心跳机制
DataNode每隔3s向NameNode发起一次心跳包,报告当前还在良好运作中(还活着),称之为报活
阈值:每隔3秒报告一次
如果隔了3s没有报告:系统会选择等待,当尝试等待10次以后(30s),依然没有收到心跳包会认为DataNode进入假死状态,此时Namenode会每隔300s检测一次DataNode,如果检测两次后,依然无法收到心跳信息,此时会认为DataNode宕机了,则将DataNode踢出集群,并备份缺失的block块。总计时间:10分钟30秒
DataNode每隔6小时,还会主动上报自己当前所保留的快信息数据
此处key查看心跳的间隔时间
2、负载均衡机制
在将文件存储到DataNode上,NameNode会保留每个DataNode上文件的数量大致相等
保存数据时,优先使用剩余空间较多的DataNode存储
删除数据时,优先删除剩余空间较少的DataNode
3、副本机制
默认3个,作用是提高数据的可靠性,防止数据丢失
当某个节点宕机后,副本丢失后,NameNode为了保证副本的数量,会在其他的节点上重写创建新的副本,维护3个副本,当节点恢复后,副本数据变多了,此时会自动删除多余的副本
当服务器出现宕机后,副本就会出现丢失,此时NameNode会在其他节点重新创建副本,保证副本数量为设置的值(3个),当无法维护副本的数量时,NameNode会进入到安全模式中,一旦进入安全模式,整个HDFS只接受读取数据请求,写入操作将不被支持,直到副本数据全部恢复正常
在hdfs-site.xml文件中可以修改副本数量
Hadoop集群中Hadoop都分别需要启动哪些服务,分别什么作用
# 1.启动名称节点:主角色,负责元数据管理和读写任务分配(node1执行)
hadoop-daemon.sh start namenode
# 2.启动数据节点:从角色,负责数据的读写及存储工作(三个节点都要执行)
hadoop-daemon.sh start datanode
# 3.启动辅助的名称节点,辅助NameNode,分担其工作量,负责对服务器集群的机器状态进行查看,并且将状态的信息传递给namenode,紧急情况下,可辅助恢复NameNode。(node2执行)
hadoop-daemon.sh start secondarynamenode
# 4.启动JobTracker:负责调度DataNode上的工作。每个DataNode有一个TaskTracker,它们执行实际工作。(node1执行)
yarn-daemon.sh start resourcemanager
# 5.启动TaskTracker:负责执行具体的任务,并与JobTracker进行交互。(三个节点都要执行)
yarn-daemon.sh start nodemanager
2 HDFS相关的shell操作
格式:
格式一: hadoop fs <args> # 既可以操作HDFS 也可以操作本地系统
格式二: hdfs dfs <args> # 仅能操作HDFS
配置好环境,启动服务后进行实操
ls命令
格式: hdfs dfs -ls [-R] 路径地址 / hadoop fs [-R] -ls 路径地址
-R: 递归查看目录下所有的内容包括子目录
eg:用hdfs命令查看信息
[root@node1 ~]# hdfs dfs -ls -R /export/
-rw-r--r-- 3 root supergroup 1260 2022-04-29 11:30 /export/anaconda-ks.cfg
-rw-r--r-- 3 root supergroup 0 2022-04-29 11:30 /export/b.txt
drwxr-xr-x - root supergroup 0 2022-04-29 11:40 /export/data3
-rw-r--r-- 3 root supergroup 0 2022-04-29 11:40 /export/data3/a.txt
-rw-r--r-- 3 root supergroup 1260 2022-04-29 11:40 /export/data3/anaconda-ks.cfg
-rw-r--r-- 3 root supergroup 0 2022-04-29 11:40 /export/data3/b.txt
您在 /var/spool/mail/root 中有新邮件
[root@node1 ~]# hdfs dfs -ls -R /export/
-rw-r--r-- 3 root supergroup 1260 2022-04-29 11:30 /export/anaconda-ks.cfg
-rw-r--r-- 3 root supergroup 0 2022-04-29 11:30 /export/b.txt
drwxr-xr-x - root supergroup 0 2022-04-29 11:40 /export/data3
-rw-r--r-- 3 root supergroup 0 2022-04-29 11:40 /export/data3/a.txt
-rw-r--r-- 3 root supergroup 1260 2022-04-29 11:40 /export/data3/anaconda-ks.cfg
-rw-r--r-- 3 root supergroup 0 2022-04-29 11:40 /export/data3/b.txt
[root@node1 ~]#
eg:用hadoop命令查看信息
[root@node1 ~]# hadoop fs -ls -R /export/
-rw-r--r-- 3 root supergroup 1260 2022-04-29 11:30 /export/anaconda-ks.cfg
-rw-r--r-- 3 root supergroup 0 2022-04-29 11:30 /export/b.txt
drwxr-xr-x - root supergroup 0 2022-04-29 11:40 /export/data3
-rw-r--r-- 3 root supergroup 0 2022-04-29 11:40 /export/data3/a.txt
-rw-r--r-- 3 root supergroup 1260 2022-04-29 11:40 /export/data3/anaconda-ks.cfg
-rw-r--r-- 3 root supergroup 0 2022-04-29 11:40 /export/data3/b.txt
您在 /var/spool/mail/root 中有新邮件
[root@node1 ~]# hadoop fs -ls /export/
Found 3 items
-rw-r--r-- 3 root supergroup 1260 2022-04-29 11:30 /export/anaconda-ks.cfg
-rw-r--r-- 3 root supergroup 0 2022-04-29 11:30 /export/b.txt
drwxr-xr-x - root supergroup 0 2022-04-29 11:40 /export/data3
[root@node1 ~]#
mkdir命令
格式: hdfs dfs -mkdir [-p] 创建的目录地址 / hadoop fs -mkdir [-p] 创建的目录地址
-p : 表示创建多级目录
[root@node1 ~]# hdfs dfs -mkdir -p /export/data1
[root@node1 ~]# hadoop fs -mkdir -p /export/data2
您在 /var/spool/mail/root 中有新邮件
[root@node1 ~]# hadoop fs -ls /export/
Found 2 items
drwxr-xr-x - root supergroup 0 2022-04-29 14:27 /export/data1
drwxr-xr-x - root supergroup 0 2022-04-29 14:27 /export/data2
[root@node1 ~]#
在集成环境【Utilities】下【Browse the file system】路径可以查看新建的文件夹
put命令
用于将本地的文件上传到HDFS中
格式: hdfs dfs -put \<localsrc> … \<dst>
参数1: <localsrc> … 将那个文件或者哪些文件进行上传
参数2: 上传到哪个目录
[root@node1 ~]# touch a.txt b.txt c.txt
[root@node1 ~]# hdfs dfs -put a.txt b.txt /export/data1
您在 /var/spool/mail/root 中有新邮件
[root@node1 ~]# hadoop fs -put * /export/data1
put: `/export/data1/a.txt': File exists
put: `/export/data1/b.txt': File exists
[root@node1 ~]# hadoop fs -ls /export/data1
在集成环境中可以查看
get命令
用于将HDFS上内容下载到本地(执行命令节点)
格式: hdfs dfs -get \<src> \<localdist> / hadoop fs -get \<src> \<localdist>
eg:删除本地文件,重新下载文件到当前目录下
[root@node1 ~]# rm -rf *
您在 /var/spool/mail/root 中有新邮件
[root@node1 ~]# ll
总用量 0
[root@node1 ~]# hdfs dfs -get /export/data1/* ./
[root@node1 ~]# ls
anaconda-ks.cfg b.txt mysql80-community-release-el7-1.noarch.rpm
a.txt c.txt
mv命令
移动 / 改名 在HDFS中, 对文件或者目录进行操作
格式: hdfs dfs -mv \<src> \<dst> / hadoop fs -mv \<src> \<dst>
[root@node1 ~]# hdfs dfs -mv /export/data1 /export/data3
您在 /var/spool/mail/root 中有新邮件
[root@node1 ~]# hdfs dfs -ls /export/
Found 2 items
drwxr-xr-x - root supergroup 0 2022-05-04 19:42 /export/data2
drwxr-xr-x - root supergroup 0 2022-05-04 19:03 /export/data3
[root@node1 ~]# hadoop fs -mv /export/data3/* /export/data2
您在 /var/spool/mail/root 中有新邮件
[root@node1 ~]# hadoop fs -ls /export/data3
[root@node1 ~]# hadoop fs -ls /export/data2
Found 5 items
-rw-r--r-- 3 root supergroup 45 2022-05-04 19:02 /export/data2/a.txt
-rw-r--r-- 3 root supergroup 1260 2022-05-04 19:02 /export/data2/anaconda-ks.cfg
-rw-r--r-- 3 root supergroup 0 2022-05-04 19:02 /export/data2/b.txt
-rw-r--r-- 3 root supergroup 0 2022-05-04 19:02 /export/data2/c.txt
-rw-r--r-- 3 root supergroup 25820 2022-05-04 19:02 /export/data2/mysql80-community-release-el7-1.noarch.rpm
[root@node1 ~]#
rm命令
执行删除文件或目录 在HDFS中
格式: hdfs dfs -rm [-r] [-skipTrash] 路径地址(支持多个地址)
- 特点: 默认是当系统开启回收站, 此命令在执行删除的时候, 默认移动到回收站, 如果不想移动到回收站, 可以使用 -skipTrash
[root@node1 ~]# hdfs dfs -rm /export/data2/a.txt
Deleted /export/data2/a.txt
您在 /var/spool/mail/root 中有新邮件
[root@node1 ~]# hadoop fs -rm -r /export/data2/
Deleted /export/data2
cp命令
拷贝复制, 用于将HDFS中某个文件或者目录 拷贝到其他的目录下
格式: hdfs dfs -cp \<src> \<dst> / hadoop fs -cp \<src> \<dst>
[root@node1 ~]# hdfs dfs -cp /export/data3/a.txt /export/
[root@node1 ~]# hadoop fs -cp /export/data3 /export/data4
您在 /var/spool/mail/root 中有新邮件
[root@node1 ~]# hdfs dfs -ls -R /export/
-rw-r--r-- 3 root supergroup 45 2022-05-04 19:26 /export/a.txt
drwxr-xr-x - root supergroup 0 2022-05-04 19:25 /export/data3
-rw-r--r-- 3 root supergroup 45 2022-05-04 19:25 /export/data3/a.txt
-rw-r--r-- 3 root supergroup 0 2022-05-04 19:25 /export/data3/b.txt
drwxr-xr-x - root supergroup 0 2022-05-04 19:26 /export/data4
-rw-r--r-- 3 root supergroup 45 2022-05-04 19:26 /export/data4/a.txt
-rw-r--r-- 3 root supergroup 0 2022-05-04 19:26 /export/data4/b.txt
cat命令
查看文件内容
格式: hdfs dfs -cat 文件路径 / hadoop fs -cat 文件路径
[root@node1 ~]# hdfs dfs -cat /export/a.txt
1 张三
2 李四
[root@node1 ~]# hadoop fs -cat /export/a.txt
1 张三
2 李四
3 HDFS的安全模式
HDFS的安全模式, 是HDFS的一种保护模式, 在刚刚启动HDFS的时候, HDFS会自动进入到安全模式, 在此模式进行自检(检查块是否完整), 如果检测完成后, 没有任何问题, 会自动进行退出安全模式(30s), 在运行过程中, 如果发现块数据丢失, 也会立即进入安全模式下
在安全模式下, 如果块存在丢失, 也会自动的补全块信息, 如果无法补全, 此时无法退出安全模式, 就需要人为干预
如何操作安全模式呢?
语法:hdfs dfsadmin -safemode [<enter | leave | get | forceExit>]
参数说明:
get: 查看当前安全模式的状态
enter: 进入安全模式
leave: HDFS正常, 离开安全模式 (当HDFS数据存在问题的时候, 无法离开的)
forceExit: 强制离开
[root@node1 ~]# hdfs dfsadmin -safemode get
Safe mode is OFF
您在 /var/spool/mail/root 中有新邮件
[root@node1 ~]# hdfs dfsadmin -safemode enter
Safe mode is ON
[root@node1 ~]# hdfs dfsadmin -safemode leave
Safe mode is OFF
[root@node1 ~]# hdfs dfsadmin -safemode forceExit
Safe mode is OFF
说明:
当文件块丢失后, HDFS会进入安全模式, 此时采用leave方式是无法退出, 如何解决?
首先, 就需要将HDFS强制离开安全模式
forceExit: 强制离开, 即使当前环境有块文件丢失, 依然可以强制要求HDFS离开安全模式
一旦离开安全模式后, HDFS会进行文件告警, 会直接在界面中提示那些文件的对应的文件块存在问题
一般解决方案:
方案一: 如果提示的文件 很重要, 不能删除, 建议先将这个文件进行下载, 下载后删除这个文件, 重新上传即可
方案二: 如果提示的文件, 不重要, 无所谓, 直接删除文件即可