Hadoop3.3.0入门到架构篇之三
集群间数据拷贝
scp实现两个主机之间拷贝
scp -r aaa.txt root@hadoop112:/user/dev/aaa.txt
scp -r root@hadoop112:/user/dev/wc.txt wc.txt
scp -r root@hadoop111:/user/dev/test.txt root@hadoop112:/user/dev
采用distcp命令实现两个Hadoop集群之间的递归数据复制
hadoop distcp hdfs://haoop111:9000/user/atguigu/hello.txt hdfs://hadoop115:9000/user/atguigu/hello.txt
小文件归档
大量小文件会耗尽NameNode的大部分内存,存储小文件所需的磁盘容量和数据块大小无关
HDFS存档文件/HAR文件对内部还是一个一个独立文件,对namenode是一个整体,减少了namenode内存.
############ example ##############
# yarn要启动着,没有启动就启动一下 start-yarn.sh
# 把/dev 下面的所有文件归档为 dev.har的归档文件,存到/output目录
hadoop archive -archiveName dev.har -p /dev /output
# 查看归档 -lsr过时
hadoop fs -lsr har:///output/dev.har
hdfs dfs -ls -R har:///output/dev.har
# 解归档文件 (拷贝出来)
hadoop fs -cp har:///output/dev.har/* /user/dev
hdfs dfs -cp har:///output/dev.har/* /user/dev
回收站
防止误删文件
配置参数:
# 0表示禁用回收站,其他值表示设置文件的存活时间
fs.trash.interval=0
# 检查回收站的间隔时间,如果值为0,则该值设置和fs.trash.interval的参数值相等
fs.trash.checkpoint.interval=0
# 要求 fs.trash.checkpoint.interval <= fs.trash.interval
启用回收站
修改 core-site.xml
<!--配置垃圾回收时间为1分钟-->
<property>
<name>fs.trash.interval</name>
<value>1</value>
</property>
查看回收站 : 在集群对应用户目录下
/user/dev/.Trash/…
修改访问垃圾回收站用户名称
core-site.xml
<!--修改访问垃圾回收站用户名称 默认是dr.who 修改为dev-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>dev</value>
</property>
通过程序删除的文件不会进入回收站,需要调用moveToTrash()才进入回收站
Trash trash = new Trash(config);
trash.moveToTrash(path);
恢复回收站数据(mv 移出来)
hdfs dfs -mv /user/dev/.Trash/Current/test /trash
清空回收站
hdfs fs -expunge
快照管理
相当于对目录做一个备份,并不会立即复制所有文件,而是记录文件变化.
# 开启指定目录的快照功能
hdfs dfsadmin -allowSnapshot /dev/snapshot
# 禁用指定目录的快照功能,默认禁用
hdfs dfsadmin -disallowSnapshot /dev/snapshot
# 对目录创建快照
hdfs dfs -createSnapshot /dev/snap01
# 指定名称创建快照
hdfs dfs -createSnapshot /dev/st snap02
# 重命名快照
hdfs dfs -renameSnapshot /dev/st snap02 snap03
#列出当前用户所有可快照目录
hdfs lsSnapshottableDir
# 比较两个快照目录的不同之处
hdfs snapshotDiff /dev/snapshot /dev/st
# 删除快照
hdfs dfs -deleteSnapshot /dev/snapshot snap03
HDFS HA高可用
HA (high Available) : 高可用
实现高可用关键在于: 消除单点故障 ; 各个组件HA(HDFS HA && YARN HA).
HDFS通过配置Active/Standby两个NameNode实现对集群热备来实现高可用
HDFS-HA工作机制 : 通过双NameNode消除单点故障
HDFS-HA工作要点 :
① 内存中各自保留一份元数据,Edits日志只有Active状态的NameNode节点可以做写操作;两个NameNode都可以读取Edits;共享的Edits放在一个共享存储中管理(qjournal和NFS两个主流实现);
② 需要一个状态管理模块 实现了一个zkfaolover,常驻在每一个namenode节点,每一个zkfailover负责监控自己所在的namenode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时要防止发生脑裂(brain split)现象
③ 必须保证两个NameNode之间能够免密登录
④ 隔离(Fence),同一时刻只能由一个NameNode对外提供服务
HDFS-HA自动故障转移工作机制(先看图,再多读几遍)
hdfs haadmin -failover手动进行故障转移, 在该模式下, 即使现役NameNode已经失效, 系统也不会自动从现役NameNode转移到待机NameNode, 下面学习如何配置部署HA自动进行故障转移. 自动故障转移为HDFS部署增加了两个新组件: ZooKeeper和ZKFailoverController( ZKFC) 进程. ZooKeeper是维护少量协调数据, 通知客户端这些数据的改变和监视客户端故障的高可用服务.
HA的自动故障转移依赖于ZooKeeper的以下功能:
- 故障检测: 集群中的每个NameNode在ZooKeeper中维护了一个持久会话, 如果机器崩溃, ZooKeeper中的会话将终止, ZooKeeper通知另一个NameNode需要触发故障转移.
- 现役NameNode选择: ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态. 如果目前现役NameNode崩溃, 另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode.
ZKFC是自动故障转移中的另一个新组件, 是ZooKeeper的客户端, 也监视和管理NameNode的状态. 每个运行
NameNode的主机也运行了一个ZKFC进程, ZKFC负责:
- 健康监测: ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode, 只要该NameNode及时地回复健康状态, ZKFC认为该节点是健康的. 如果该节点崩溃, 冻结或进入不健康状态, 健康监测器标识该节点为非健康的.
- ZooKeeper会话管理: 当本地NameNode是健康的, ZKFC保持一个在ZooKeeper中打开的会话. 如果本地NameNode处于active状态, ZKFC也保持一个特殊的znode锁, 该锁使用了ZooKeeper对短暂节点的支持, 如果会话终止, 锁节点将自动删除.
- 基于ZooKeeper的选择: 如果本地NameNode是健康的, 且ZKFC发现没有其它的节点当前持有znode锁, 它将为自己获取该锁. 如果成功, 则它已经赢得了选择, 并负责运行故障转移进程以使它的本地NameNode为Active. 故障转移进程与前面描述的手动故障转移相似, 首先如果必要保护之前的现役NameNode, 然后本地NameNode转换为Active状态.
HDFS-HA集群配置
准备: 配置主机名,静态IP,ssh免密登录,JDK&环境变量配置
规划 :
hadoop111 | hadoop112 | hadoop113 |
---|---|---|
NameNode | NameNode | — |
JournalNode | JournalNode | JournalNode |
DataNode | DataNode | DataNode |
ZK | ZK | ZK |
— | ResourceManager | — |
NodeManager | NodeManager | NodeManager |
Zookeeperk集群
# 解压
# zookeeper目录下创建data目录,添加myid文件,并写入服务器唯一编号(自定义,唯一整数就行)
mkdir -p /opt/module/zookeeper-3.6.1/data
echo 1 > /opt/module/zookeeper-3.6.1/data/myid
# conf下copy zoo_sample.cfg配置文件为 zoo.cfg
# (1)修改data目录 (2) 配置集群服务器编号,对应myid文件中的编号
vim zoo.cfg
# cluster sesrver setting
server.1=hadoop111:2019:2020
server.2=hadoop112:2019:2020
server.3=hadoop113:2019:2020
# zookeeper data dir
dataDir=/opt/module/zookeeper-3.6.1/data
# 保存退出
# 分发zookeeper到其它机器
xsync zookeeper-3.6.1
# 其它服务器改下myid文件中的编号就可以
# 分别启动zookeeper,查看状态,进程,确认zookeeper集群起来
./zkServer.sh { start | status | stop }
HDFS-HA 集群
新建一套,HA集群,在原来集群基础上改也可以,我这里新建一套HA集群
mkdir ha
tar -zxvf hadoop-3.3.0.tar.gz -C /opt/ha
① 配置hadoop-env.sh
② 配置core-site.xml
<!-- 把两个NameNode)的地址组装成一个集群mycluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/ha/hadoop-3.3.0/data/tmp</value>
</property>
③ 配置hdfs-site.xml
<!-- 完全分布式集群名称,自定义 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集群中NameNode节点都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop111:10000</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop112:10000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop111:9870</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop112:9870</value>
</property>
<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop111:8485;hadoop112:8485;hadoop113:8485/mycluster</value>
</property>
<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh无秘钥登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/dev/.ssh/id_rsa</value>
</property>
<!-- 声明journalnode服务器存储目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/ha/hadoop-3.3.0/data/jn</value>
</property>
<!-- 关闭权限检查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
④ 分发hadoop到其它机器
⑤ 启动HDFS-HA集群
# 分别启动 各个JournalNode节点
sbin/hadoop-daemon.sh start journalnode
# nn1上 hdfs 格式化,并启动
hdfs namenode -format
hdfs --daemon start namenode
# nn2上同步nn1的元数据
hdfs namenode -bootstrapStandby
# 启动nn2
hdfs --daemon start namenode
# 浏览器查看,都是 standby 状态
# http://hadoop111:9870
# http://hadoop112:9870
# nn1 上启动所有datanode
hadoop-daemons.sh start datanode
# 将nn1切换为 Active
hdfs haadmin -transitionToActive nn1
# 查看是否Active
hdfs haadmin -getServicecState nn1
HDFS-HA自动故障转移
① hdfs-site.xml 增加配置
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
② core-site.xml 增加配置
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop111:2181,hadoop112:2181,hadoop113:2181</value>
</property>
③ 启动
# 关闭所有HDFS服务
stop-dfs.sh
# 启动zookeeper集群
zkServer.sh start
# 初始化HA在Zookeeper中状态
hdfs zkfc -formatZK
# 启动HDFS服务
start-dfs.sh
# 在各个NameNode节点上启动DFSZK Failover Controller
# 先在哪台机器启动,哪个机器的 NameNode 就是 Active NameNode
hadoop-daemon.sh start zkfc
④ 验证
# kill掉Active NameNode的进程
kill -9 namenode的PID
# 将Active NameNode机器断网
systemctl stop network
hdfs 到此结束,小结一下吧,免得文档太长,吐槽一下,csdn标题,代码格式太丑了拷贝上来全变成不是黑就是白,文章太长,累积的太多,毕竟我码了好多天,未完待续~请看下一篇…
本文地址:https://blog.csdn.net/summer12580/article/details/108230593
上一篇: 南山一棵树景区门票 南山一棵树景区怎么样
下一篇: 国内自助游网站哪个好 自助游网站排名
推荐阅读
-
C++入门到理解阶段二基础篇(9)——C++结构体
-
AugularJS从入门到实践(必看篇)
-
Hadoop3.3.0入门到架构篇之三
-
NetCore入门篇:(八)Net Core项目使用Controller之三-入参
-
入门MySQL——架构篇
-
Redis从入门到精通:初级篇
-
区块链入门教程之从比特币到以太访再到智能合约从架构概念到应用实战(DAPP)(四、以太访、web3、智能合约三者之间的关系及智能合约基本讲解)
-
面向服务的架构(SOA)从入门到实战(融合WebService、JAX-WS、SCA开发MIS项目) soawebservice
-
SQL从入门到出门 第7篇 分组与汇总
-
Nginx从入门到实践-基础篇(了解)