HDFS分布式文件存储系统

一.NameNode

1.简介
namenode是整个文件系统的管理节点。他维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。

文件包括:

fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。

edits:操作日志文件。

fstime:保存最近一次checkpoint的时间。
 

2.NameNode的工作特点
NameNode始终在内存中保存metedata,用于处理“读请求”,到有“写请求”到来时,NameNode首先会写editlog到磁盘,即向edits文件中写日志,成功返回后,才会修改内存,并且向客户端返回。

Hadoop会维护一个人fsimage文件,也就是NameNode中metedata的镜像,但是fsimage不会随时与NameNode内存中的metedata保持一致,而是每隔一段时间通过合并edits文件来更新内容。Secondary NameNode就是用来合并fsimage和edits文件来更新NameNode的metedata的。

 

3.Namenode作用

  1. 管理、维护文件系统的元数据/名字空间/目录树 管理数据与节点之间的映射关系(管理文件系统中每个文件/目录的block块信息)
  2. 管理DataNode汇报的心跳日志/报告
  3. 客户端和DataNode之间的桥梁(元数据信息共享)

 

二.DataNode

DataNode在创建时并不包含映射的主机名,而是在安全模式里,在namenode的fsimage文件加载到内存中并执行edits文件时生成DataNode与主机的映射关系
即是在DataNode注册之后再内存中生成DataNode与主机的映射

DataNode的目录结构

和namenode不同的是,datanode的存储目录是初始阶段自动创建的,不需要额外格式化。

DataNode作用

  1. 负责数据的读写操作
  2. 周期性的向NameNode汇报心跳日志/报告
  3. 执行数据流水线的复制

 

三、机架感知

通俗的来说就是nameNode通过读取我们的配置来配置各个节点所在的机架信息(节点ip和swap交换机

什么时候会用到机架感知?

NameNode分配节点的时候 (数据的流水线复制和HDFS复制副本时)

HDFS副本存放机制

第1个副本存放在客户端,如果客户端不在集群内,就在集群内随机挑选一个合适的节点进行存放;

第2个副本存放在与第1个副本同机架且不同节点,按照一定的规则挑选一个合适的节点进行存放;

第3个副本存放在与第1、2个副本不同机架且距第1个副本逻辑距离最短的机架,按照一定的规则挑选一个合适的节点进行存放;

hadoop 视硬件设备经常损坏为常态

为了防止硬件损坏导致系统不可用,所以构建多副本机制

四、HDFS数据完整性计算

 

数据写入之后进行数据首次校验,文件系统周期性进行校验,防止数据丢失。

读取数据之前进行数据校验,若两个校验相同,那么表示数据没有丢失,开始读取数据。

若两个校验不相同,那么表示数据有部分丢失,换到其他节点(相同副本的节点)读取数据。

HDFS 适用场景 一次写入,多次读出的场景,支持文件追加,但不支持在文件中间修改。

 

五、掉线时限参数设置

datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长。HDFS默认的超时时长为10分钟+30秒。如果定义超时时间为timeout,则超时时长的计算公式为:

timeout  = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。

而默认的dfs.namenode.heartbeat.recheck-interval 大小为5分钟,dfs.heartbeat.interval默认为3秒。

需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。

<property>
    <name>dfs.namenode.heartbeat.recheck-interval</name>
    <value>300000</value>
</property>
<property>
    <name> dfs.heartbeat.interval </name>
    <value>3</value>
</property>

 

六、HDFS的特性

1、海量数据存储:

HDFS可横向扩展,其存储的文件可以支持PB级别或更高级别的数据存储。

2、高容错性:

数据保存多个副本,副本丢失后自动恢复。

可构建在廉价价(与小型机大型机对比)的机器上,实现线性扩展。

当集群增加新节点之后,namenode也可以感知,进行负载均衡,将数据分发和备份数据均衡到新 的节点上。每个节点磁盘使用容量百分比的差异可以人工设置。

线性扩展:随着节点数量的增加,集群的性能-计算性能和存储性能都会有所增加

负载均衡:集群可将原本使用容量较高的节点上的数据自动写入新的节点上,达到所有节点容量均匀

3、大文件存储:

数据分块存储,将一个大块的数据切分成多个小块的数据。

 

七、HDFS缺点

1、不能做到低延迟数据访问:

由于hadoop针对高数据吞吐量做了优化,牺牲了获取数据的延 迟,所以对于低延迟访问数据的 业务需求不适合HDFS。

2、不适合大量的小文件存储 :

由于namenode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件总数受限于namenode的内存容量。

元数据信息中每个文件、目录和数据块的存储信息大约占150字节。(1G 数据存储的元数据信息占用150字节 ,1M的数据元数据信息占用150字节)

受限于内存,元数据信息的存储机制导致无论数据多大,元数据信息中描述这个数据的信息都是150字节。

3、修改文件:

HDFS适合一次写入,多次读取的场景。对于上传到HDFS上的文件,不支持修改文件。Hadoop2.0虽然支持了文件的追加功能,但不建议对HDFS上的文件进行修改。因为效率低下.

4、不支持用户的并行写:

同一时间内,只能有一个用户执行写操作。

5、多次写入,一次读取

 

八、HDFS文件限额配置

特定文件夹下的副本数可以设置、存储容量可以设置,存储的文件个数可以设置。

数量限额

hdfs dfs -mkdir -p /user/root/lisi     #创建hdfs文件夹
hdfs dfsadmin -setQuota 2 lisi      # 给该文件夹下面设置最多上传两个文件,上传文件,发现只能上传一个文件
hdfs dfsadmin -clrQuota /user/root/lisi    # 清除文件数量限制

空间大小限额

hdfs dfsadmin -setSpaceQuota 4k /user/root/lisi   # 限制空间大小4KB
hdfs dfs -put  /export/softwares/zookeeper-3.4.5-cdh5.14.0.tar.gz /user/root/lisi
 #上传超过4Kb的文件大小上去提示文件超过限额
hdfs dfsadmin -clrSpaceQuota /user/root/lisi   #清除空间限额
hdfs dfs -put  /export/softwares/zookeeper-3.4.5-cdh5.14.0.tar.gz /user/root/lisi

 

九、集群安全模式

安全模式是 HDFS 所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求,是一种保护机制,用于保证集群中的数据块的安全性。

Namenode启动时,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的fsimage文件和一个空的编辑日志。此时,namenode开始监听datanode请求。当NameNode统计总模块和发送过来的块报告中的统计信息达到99.999%的之前时间里namenode运行在安全模式,即namenode的文件系统对于客户端来说是只读的

假设我们设置的副本数(即参数 dfs.replication)是 5,那么在 Datanode 上就应该有5 个副本存在,假设只存在 3 个副本,那么比例就是 3/5=0.6。在配置文件 hdfs-default.xml中定义了一个最小的副本的副本率(即参数 dfs.namenode.safemode.threshold-pct)0.999。

我们的副本率 0.6 明显小于 0.99,因此系统会自动的复制副本到其他的 DataNode,使得副本率不小于 0.999.如果系统中有 8 个副本,超过我们设定的 5 个副本,那么系统也会删除多余的 3 个副本。

如果 HDFS 处于安全模式下, 不允许HDFS 客户端进行任何修改文件的操作,包括上传文件,删除文件,重命名,创建文件夹,修改副本数等操作。

在安全模式下集群在做什么?

在安全模式下集群在进行恢复元数据,即在合并fsimage和edits log,并且接受datanode的心跳信息,恢复block的位置信息,将集群恢复到上次关机前的状态

 

手动控制安全模式命令

查看安全模式状态:hdfs dfsadmin -safemode get

进入安全模式状态:hdfs dfsadmin -safemode enter

离开安全模式状态:hdfs dfsadmin -safemode leave

等待安全模式状态:hdfs dfsadmin -safemode wait

 

十、hdfs的文件权限验证

hdfs的文件权限机制与linux系统的文件权限机制类似

r:read   w:write  x:execute  权限x对于文件表示忽略

如果linux系统用户zhangsan使用Hadoop命令创建一个文件,那么这个文件在HDFS当中的owner就是zhangsan

 

十一、HDFS 新增节点与删除节点

 

1、服役新数据节点

 

准备新节点

第一步:复制一台新的虚拟机出来

将我们纯净的虚拟机复制一台出来,作为我们新的节点

第二步:修改mac地址以及IP地址

修改mac地址命令

vim /etc/udev/rules.d/70-persistent-net.rules

修改ip地址命令

vim /etc/sysconfig/network-scripts/ifcfg-eth0

第三步:关闭防火墙,关闭selinux

<!--  关闭防火墙  -->
service iptables stop
<!--  开机不启动防火墙  -->
chkconfig iptables off
<!--  关闭selinux  -->
vim /etc/selinux/config

第四步:更改主机名

更改主机名命令

vim /etc/sysconfig/network

第五步:四台机器更改主机名与IP地址映射

四台机器都要添加hosts文件

vim /etc/hosts 192.168.52.100 node01 192.168.52.110 node02 192.168.52.120 node03 192.168.52.130 node04

第六步:node04服务器关机重启并生成公钥与私钥

node04执行以下命令关机重启

reboot

node04执行以下命令生成公钥与私钥

ssh-keygen -t  rsa

node04执行以下命令将node04的私钥拷贝到node01服务器

ssh-copy-id  node01

node01执行以下命令,将authorized_keys拷贝给node04

cd /root/.ssh/

scp authorized_keys  node04:$PWD

第七步:node04安装jdk

node04统一两个路径

mkdir -p /export/softwares/

mkdir -p /export/servers/

然后解压jdk安装包,配置环境变量,或将集群中的java安装目录拷贝一份,并配置环境变量。

第八步:解压Hadoop安装包

在node04服务器上面解压Hadoop安装包到/export/servers

node01执行以下命令将Hadoop安装包拷贝到node04服务器

cd /export/softwares/

scp hadoop-2.6.0-cdh5.14.0-自己编译后的版本.tar.gz node04:$PWD

第九步:将node01关于Hadoop的配置文件全部拷贝到node04

node01执行以下命令,将Hadoop的配置文件全部拷贝到node04服务器上面

cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/

scp ./* node04:$PWD

 

服役新节点具体步骤

第一步:在主机点上创建dfs.hosts文件

[root@node01 sbin]# cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/
[root@node01 hadoop]# touch dfs.hosts
[root@node01 hadoop]# vim dfs.hosts
node01
node02
node03
node04

第二步:node01 编辑hdfs-site.xml 添加一下配置

<property>
    <name>dfs.hosts</name>
    <value>/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/dfs.hosts</value>
</property>

第三步:刷新namenode

[root@node01 hadoop]# hdfs dfsadmin -refreshNodes
Refresh nodes successful

第四步:更新resourceManager节点

[root@node01 hadoop]# yarn rmadmin -refreshNodes
19/11/07 00:18:27 INFO client.RMProxy: Connecting to ResourceManager at node01/192.168.100.131:8033

第五步:namenode的slaves文件增加新服务节点主机名称

[root@node01 hadoop]# cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/
[root@node01 hadoop]# vim slaves

node01
node02
node03
node04

第六步:单独启动新增节点

<!--  node04服务器执行以下命令,启动datanode和nodemanager  -->
[root@node04 hadoop-2.6.0-cdh5.14.0]# cd /export/servers/hadoop-2.6.0-cdh5.14.0/
[root@node04 hadoop-2.6.0-cdh5.14.0]# sbin/hadoop-daemon.sh start datanode
[root@node04 hadoop-2.6.0-cdh5.14.0]# sbin/yarn-daemon.sh start nodemanager

第七步:浏览器查看

http://192.168.100.131:50070/dfshealth.html#tab-overview

http://192.168.100.131:8088/cluster

第八步:使用负载均衡命令,让数据均匀负载所有机器

cd /export/servers/hadoop-2.6.0-cdh5.14.0/
sbin/start-balancer.sh

 

2、退役旧数据节点

 

第一步:创建dfs.hosts.exclude配置文件

[root@node01 hadoop]# cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/
[root@node01 hadoop]# touch dfs.hosts.exclude
[root@node01 hadoop]# vim dfs.hosts.exclude

node04

第二步:编辑namenode所在机器的hdfs-site.xml

[root@node01 hadoop]# cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
[root@node01 hadoop]# vim hdfs-site.xml

<property>
    <name>dfs.hosts.exclude</name>
    <value>/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/dfs.hosts.exclude</value>
</property>

第三步:刷新namenode,刷新resourceManager

[root@node01 hadoop]# hdfs dfsadmin -refreshNodes
Refresh nodes successful
[root@node01 hadoop]# yarn rmadmin -refreshNodes
19/11/07 00:48:30 INFO client.RMProxy: Connecting to ResourceManager at node01/192.168.100.131:8033

第四步:查看web浏览界面

http://192.168.100.131:50070/dfshealth.html#tab-datanode

 

第五步:节点退役完成,停止该节点进程

cd /export/servers/hadoop-2.6.0-cdh5.14.0
sbin/hadoop-daemon.sh stop datanode
sbin/yarn-daemon.sh stop nodemanager

第六步:从include文件中删除退役节点

cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
vim dfs.hosts
 
node01
node02
node03

<!--  刷新namenode和resourceManager  -->
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes

第七步:从namenode的slave文件中删除退役节点

cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
vim slaves
 
node01
node02
node03

第八步:如果数据负载不均衡,执行以下命令进行均衡负载

cd /export/servers/hadoop-2.6.0-cdh5.14.0/ sbin/start-balancer.sh

cat blk_1073741863_1041.meta >> jdk-8u144-linux-x64.tar.gz

 

十二、block块手动拼接成为完整数据

第一步:上传一个大于128M的文件到hdfs上面去

cd /export/softwares/ hdfs dfs -put jdk-8u141-linux-x64.tar.gz  /

第二步:web浏览器界面查看jdk的两个block块id

 

第三步:根据配置文件找到block块所在的路径

/export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/datanodeDatas/current/BP-732621991-192.168.100.131-1572601508657/current/finalized/subdir0/subdir0

第四步:执行block块的拼接

cat blk_1073741863_1041.meta >> jdk-8u144-linux-x64.tar.gz
cat blk_1073741864_1042.meta >> jdk-8u144-linux-x64.tar.gz
<!--移动jdk到/export/ 路径,进行解压-->
mv jdk-8u144-linux-x64.tar.gz /export/

 

十二、HDFS回收站

1、启用回收站

修改所有服务器的core-site.xml配置文件

<!--  开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 -->
<property>
    <name>fs.trash.interval</name>
    <value>10080</value>
</property>

2、查看回收站

/user/root/.Trash/

3、通过javaAPI删除的数据,不会进入回收站,需要调用moveToTrash()才会进入回收站

通过shell命令行删除的数据,会进入回收站。

Trash trash = New Trash(conf); 
trash.moveToTrash(path);

4、恢复回收站数据

hdfs  dfs  -mv  trashFileDir   hdfsdir

trashFileDir  :回收站的文件路径

hdfsdir   :将文件移动到hdfs的哪个路径下

5、清空回收站

hdfs dfs -expunge

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值