当前位置: 移动技术网 > 移动技术>手机>华为 > Hadoop3.3.0入门到架构篇之三

Hadoop3.3.0入门到架构篇之三

2020年08月01日  | 移动技术网移动技术  | 我要评论
集群间数据拷贝scp实现两个主机之间拷贝scp -r aaa.txt root@hadoop112:/user/dev/aaa.txtscp -r root@hadoop112:/user/dev/wc.txt wc.txtscp -r root@hadoop111:/user/dev/test.txt root@hadoop112:/user/dev采用distcp命令实现两个Hadoop集群之间的递归数据复制hadoop distcp hdfs://haoop111:9000/user/

集群间数据拷贝

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的以下功能:

  1. 故障检测: 集群中的每个NameNode在ZooKeeper中维护了一个持久会话, 如果机器崩溃, ZooKeeper中的会话将终止, ZooKeeper通知另一个NameNode需要触发故障转移.
  2. 现役NameNode选择: ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态. 如果目前现役NameNode崩溃, 另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode.
    ZKFC是自动故障转移中的另一个新组件, 是ZooKeeper的客户端, 也监视和管理NameNode的状态. 每个运行

NameNode的主机也运行了一个ZKFC进程, ZKFC负责:

  1. 健康监测: ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode, 只要该NameNode及时地回复健康状态, ZKFC认为该节点是健康的. 如果该节点崩溃, 冻结或进入不健康状态, 健康监测器标识该节点为非健康的.
  2. ZooKeeper会话管理: 当本地NameNode是健康的, ZKFC保持一个在ZooKeeper中打开的会话. 如果本地NameNode处于active状态, ZKFC也保持一个特殊的znode锁, 该锁使用了ZooKeeper对短暂节点的支持, 如果会话终止, 锁节点将自动删除.
  3. 基于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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网