欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Hadoop3.3.0入门到架构篇之三

程序员文章站 2022-04-21 10:39:43
集群间数据拷贝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状态.
    Hadoop3.3.0入门到架构篇之三

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