Zookeeper客户端指令及Hadoop 构建HA高可用集群
【摘要】 zk客户端命令ZNode节点1. zk中的节点包含name-value。 2. zk中的节点可以有子节点。 3. zk中节点的结构是树状结构。客户端操作命令# 1.客户端使用基本命令 1. 进入客户端 zkCli.sh 2. 查看帮助命令 [zk: localhost:2181(CONNECTED) 1] help 3. 退出客户端 [zk: localhost:2181(CONNECTED...
zk客户端命令
ZNode节点
1. zk中的节点包含name-value。 2. zk中的节点可以有子节点。 3. zk中节点的结构是树状结构。
-
客户端操作命令
# 1.客户端使用基本命令 1. 进入客户端 zkCli.sh 2. 查看帮助命令 [zk: localhost:2181(CONNECTED) 1] help 3. 退出客户端 [zk: localhost:2181(CONNECTED) 1] quit
-
znode管理命令
命令
|
含义
|
ls /
|
浏览某个节点下的子节点(的名字)
|
create /节点 节点值
|
创建节点,并指定他的值。
|
get /节点
|
查看节点的值
|
set /节点 新值
|
修改节点的值
|
delete /节点
|
删除某个节点
|
rmr /节点
|
删除该节点,并递归删除内部所有节点。
|
ls2 /节点
|
查看节点属性与节点下的子节点
|
# 1. 浏览某个节点下的子节点(的名字) ls / # 2. 创建节点,并指定他的值。 [zk: localhost:2181(CONNECTED) 8] create /a1 haha Created /a1 # 3. 查看节点的值 [zk: localhost:2181(CONNECTED) 10] get /a1 haha # 数据 cZxid = 0x200000005 创建节点时的事务ID ctime = Fri Apr 10 17:55:04 CST 2020 # 创建时间 mZxid = 0x200000005 最后修改节点时的事务ID mtime = Fri Apr 10 17:55:04 CST 2020 pZxid = 0x200000005 #子节点最后更新的事务ID cversion = 0 #子节点变更版本 dataVersion = 0 # 节点数据的更新次数【只要执行set就更新】 aclVersion = 0 #znode 访问控制列表的变化号 ephemeralOwner = 0x0 #临时节点session id,为0代表非临时节点 dataLength = 4 # 节点数据的字节,最大值1M numChildren = 0 # 直接子节点的个数 # 4. 修改节点的值 [zk: localhost:2181(CONNECTED) 45] set /a1 hehe # 5. 删除节点 [zk: localhost:2181(CONNECTED) 53] delete /a1 # 6. 删除节点及其子节点 [zk: localhost:2181(CONNECTED) 53] rmr /a1
-
节点类型(面试)
# 节点类型 zookeeper可以将节点设置不同的类型 1. 持久化节点 节点只要不删除,会一致存在。 2. 顺序编号节点 每次对相同节点,重复创建,会自动对znode名称进行编号 3. 临时节点 客户端断开,则节点消失。注意:临时节点,不允许新增子节点
节点名称
|
中文
|
含义
|
PERSISTENT |
持久化节点
|
客户端与zookeeper断开连接后,该节点依旧存在
|
PERSISTENT_SEQUENTIAL |
持久化顺序编号节点
|
客户端与zookeeper断开连接后,该节点依旧存在, 只是Zookeeper给该节点名称进行顺序编号
|
EPHEMERAL |
临时节点
|
客户端与zookeeper断开连接后,该节点被删除
|
EPHEMERAL_SEQUENTIAL |
临时顺序编号节点
|
客户端与zookeeper断开连接后,该节点被删除, 只是Zookeeper给该节点名称进行顺序编号
|
命令
|
含义
|
create /节点 节点值
|
持久化节点
|
create -s /节点 节点值
|
持久化节点+顺序编号节点
|
create -e /节点 节点值
|
临时节点,客户端断开连接则失效。
|
create -s -e /节点 节点值
|
顺序编号节点+临时节点,同上
|
[zk: localhost:21810(CONNECTED) 9] create -s /d 123
Created /d0000000017
[zk: localhost:21810(CONNECTED) 10] create -s /d 123
Created /d0000000018
[zk: localhost:21810(CONNECTED) 11]
---临时节点,①断开连接,会丢失;②不能创建子节点
create -e /temp 1
-
create -e /temp/child 1
-
Ephemerals cannot have children: /temp/child
-
create -e /temp 1 #③不能重名
-
Node already exists: /temp
-
Watcher监听器命令
-
监听节点值的修改(set)和删除(delete)变化
-
监听某个节点及其子节点的增加、删除。
命令
|
含义
|
get /节点1/节点2 watch
|
查看节点内容,并监听该值的变化(修改、失效等)
|
ls /节点 watch
|
查看某个节点下的所有节点信息,并监听下节点的变化(添加删除子节点)
|
四. Hadoop HA(高可用)
HA Hadoop(High Available Hadoop) 高可用Hadoop集群。
1.HDFS分布式集群的问题
1. NameNode单点故障 2. NameNode备机空闲 3. NameNode仍然存在少量数据丢失的问题 4. NameNode假死和双主问题 5. NameNode主备自动切换,客户端无法知晓入口地址
2.问题解决思路分析
# 1. NameNode单点故障 思路:提供NameNode备机 在两个NameNode机器上,各自提供一个zkclient。负责注册节点,并监控节点变化 方案:ZKFC--基于zookeeper实现的故障转移程序(基于zk实现的客户端程序)
# 2. NameNode假死和双主问题 思路: 只要NN备机切换,无论NN主机是否死机,都强制杀死。 ① 远程登录NN主机节点:ssh ② 执行杀死NameNode进程命令:killall namenode 方案: ZKFC自带该效果,当NN主机宕机,切换备机的同时,会远程登陆NN主机,使用psmisc的命令killall杀死NameNode。防止出现双主。
# 3. NameNode备机空闲 思路:承担SNN的职责 好处: ① NameNode备机资源不闲置,同时替换SNN ② NameNode备机转正,则可以直接从本地读取fsimage恢复数据,方便快捷。
# 4. NameNode仍然存在少量数据丢失的问题 思路: 提供一个分布式存储空间,并可以数据同步共享,用来存储editslog文件。 方案: QJN:基于zookeeper实现的分布式存储系统,还有数据共享同步机制。 QJN之间通过网络进行数据同步--RPC技术 好处: NameNode备机节点,也存在一个QJN,存储了editslog,这边可以避免从NameNode主机远程拷贝editslog,提升ckeckpoint性能。 NameNode备机转正,除了恢复本地fsimage,还能恢复本地的editslog数据文件,恢复完整数据。
# 5. NameNode主备自动切换,客户端无法知晓入口地址 思路: ① 不能写死ip,将NN主机ip注册在Zk集群中,zk负责主备切换,并更新该节点的值。 ② Java客户端通过读取zk节点中的节点值,动态读取HDFS的入口地址(NameNode现主机ip) 方案: HDFS的NameNode入口地址,配置虚拟ip。
3.架构图
4.HDFS-HA安装
1.配置NN主机和NN备机所在节点的免密登录
# 1. NameNode主节点执行 # 生成密钥(在namenode主和namenode备生成,将公钥发布其他节点) # 做过了就不要再做了 [root@hadoop11 ~]# ssh-keygen # 发送公钥(所有NameNode节点都要发送) [root@hadoop11 ~]# ssh-copy-id hadoop11 [root@hadoop11 ~]# ssh-copy-id hadoop12 [root@hadoop11 ~]# ssh-copy-id hadoop13 # 2. NameNode备机节点执行 # 生成密钥(在namenode主和namenode备生成,将公钥发布其他节点) [root@hadoop12 ~]# ssh-keygen # 发送公钥(所有NameNode节点都要发送) [root@hadoop12 ~]# ssh-copy-id hadoop11 [root@hadoop12 ~]# ssh-copy-id hadoop12 [root@hadoop12 ~]# ssh-copy-id hadoop13
2.安装psmisc
# ZKFC远程杀死(可能)假死NN使用的killall namenode命令属于该软件中的。 # 建议所有节点都安装psmisc [root@hadoop11 ~]# yum install -y psmisc [root@hadoop12 ~]# yum install -y psmisc
3.安装配置jdk
# 1. 解压jdk [root@hadoop11 modules]# tar zxvf jdk-8u221-linux-x64.tar.gz -C /opt/installs/ # 2. 改jdk的目录名 # 3. 配置profile环境变量 export JAVA_HOME=/opt/installs/jdk1.8 export PATH=$PATH:$JAVA_HOME/bin # 4. 同步集群环境: 1. 其他节点同步JDK的安装 2. 同步profile配置文件, 3. 并重新加载其他节点的JDK环境变量
4.安装zookeeper
# 1. 解压zk [root@hadoop11 modules]# tar zxvf zookeeper-3.4.6.tar.gz -C /opt/installs/ # 2. 改名 # 3. 配置zk的环境变量 export PATH=$PATH:/opt/installs/zookeeper3.4.6/bin/ # 4. 新建data目录,并编写投票编号myid文件 # 5. 初始化zoo.cfg文件 tickTime=2000 initLimit=10 syncLimit=5 dataDir=/opt/installs/zookeeper3.4.6/data #data文件目录 clientPort=2181 server.11=192.168.199.11:2888:3888 # zk主机信息 server.12=192.168.199.12:2888:3888 # zk主机信息 server.13=192.168.199.13:2888:3888 # zk主机信息 # 6. 同步集群环境(需要安装zk的节点) 1. 同步zk的软件包 2. 同步zk的profile环境 3. 其他节点重新加载profile 4. 修改其他节点的myid # 7. 验证启动效果,并关闭zk服务器 zkServer.sh start jps zkServer.sh stop
5.HA-HDFS配置文件初始化
# 省略hadoop软件安装过程 1. 解压hadoop 2. 配置hadoop的环境变量 3. 重新加载profile文件。 全新的Hadoop集群,要清空data目录。 # 0. 清空data目录,【全部节点】都要做 [root@hadoop11 data]# rm -rf /opt/installs/hadoop3.1.4/data/* [root@hadoop11 installs]# rm -rf /opt/installs/hadoop3.1.4/logs/* # 1. 配置hadoop-env.sh export JAVA_HOME=/opt/installs/jdk1.8/ export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root export HDFS_JOURNALNODE_USER=root export HDFS_ZKFC_USER=root # 2. 配置core-site.xml <configuration> <!--hdfs入口,设置虚拟地址,具体地址后面配置--> <property> <name>fs.defaultFS</name> <value>hdfs://hdfs-cluster</value> </property> <!--hdfs集群的文件位置--> <property> <name>hadoop.tmp.dir</name> <value>/opt/installs/hadoop3.1.4/data</value> </property> <!--hdfs要访问zookeeper集群--> <property> <name>ha.zookeeper.quorum</name> <value>hadoop11:2181,hadoop12:2181,hadoop13:2181</value> </property> <!-- 修改core-site.xml中的ipc参数,防止出现连接journalnode服务ConnectException --> <property> <name>ipc.client.connect.max.retries</name> <value>100</value> <description>Indicates the number of retries a client will make to establish a server connection.</description> </property> <property> <name>ipc.client.connect.retry.interval</name> <value>10000</value> <description>Indicates the number of milliseconds a client will wait for before retrying to establish a server connection.</description> </property> </configuration> # 3. 配置hdfs-site.xml <configuration> <!-- 副本数 --> <property> <name>dfs.replication</name> <value>2</value> </property> <!-- 定义dhfs入口的命名服务 --> <property> <name>dfs.nameservices</name> <value>hdfs-cluster</value> </property> <!-- 定义hdfs入口的命名服务下虚拟ip --> <property> <name>dfs.ha.namenodes.hdfs-cluster</name> <value>nn1,nn2</value> </property> <!-- 虚拟ip地址1 RPC入口 --> <property> <name>dfs.namenode.rpc-address.hdfs-cluster.nn1</name> <value>hadoop11:8020</value> </property> <!-- 虚拟ip地址1 HTTP入口 --> <property> <name>dfs.namenode.http-address.hdfs-cluster.nn1</name> <value>hadoop11:9870</value> </property> <!-- 虚拟ip地址2 PRC入口 --> <property> <name>dfs.namenode.rpc-address.hdfs-cluster.nn2</name> <value>hadoop12:8020</value> </property> <!-- 虚拟ip地址1 HTTP入口 --> <property> <name>dfs.namenode.http-address.hdfs-cluster.nn2</name> <value>hadoop12:9870</value> </property> <!-- 定义QJN在linux中保存文件磁盘目录 --> <property> <!-- Journal Edit Files 的存储目录:() --> <name>dfs.journalnode.edits.dir</name> <value>/opt/installs/journalnode/data/</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop11:8485;hadoop12:8485;hadoop13:8485/hdfs-cluster</value> </property> <!-- 是否开启故障切换 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 基于zookeeper的故障切换的代码类 --> <property> <name>dfs.client.failover.proxy.provider.hdfs-cluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 远程杀死namenode方式(防止namenode假死,导致双主出现) --> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!-- 指定私钥的文件目录,使用免密登录杀死NN进程 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> </configuration> # 4. 配置 workers hadoop11 hadoop12 hadoop13 # 5. 同步以上配置到其他节点 [root@hadoop11 etc]# myscp.sh /opt/installs/hadoop3.1.4/etc/
6.HA-HDFS初次启动
启动顺序: 1. zk启动【重要】 2. 格式化zkfc 3. 启动QJN 4. 启动hdfs(zkfc qjn namenode datanode) 5. 声明hadoop12的namenode为备机 6. 启动nn备机 # 1. 启动zkserver集群 [root@hadoop11 etc]# zkServer.sh start [root@hadoop12 etc]# zkServer.sh start [root@hadoop13 etc]# zkServer.sh start # 如果安装失败,需要从这里再次执行一遍 # 2. 初始化ZKFC在zk中的Znode信息【第一次启动需要做】 [root@hadoop11 etc]# hdfs zkfc -formatZK # 3. 格式化hdfs的namenode主机(在namenode主节点)【第一次启动需要做】 1. 先启动journalnode(3台)(QJN将作为NameNode存储持久化文件的空间,要先启动才能格式化) [root@hadoop11 etc]# hadoop-daemon.sh start journalnode [root@hadoop12 etc]# hadoop-daemon.sh start journalnode [root@hadoop13 etc]# hadoop-daemon.sh start journalnode 2. 格式化namenode主机(在NN主机节点) [root@hadoop11 etc]# hdfs namenode -format # 4. 格式化hdfs的namenode备机(namenode standby备节点)【第一次启动需要做】 1. 先启动主namenode主机(启动整个namenode集群) [root@hadoop11 etc]# start-dfs.sh 2. 在格式化namenode备机(第一次启动) [root@hadoop12 ~]# hdfs namenode -bootstrapStandby 3. 启动namenode备机 [root@hadoop12 ~]# hadoop-daemon.sh start namenode # 5. 以后HAHadoop启动和关闭,在NN主机节点执行命令。 zk集群还是要单独启动和关闭的 [root@hadoop11 etc]# start-dfs.sh 该命令会自动依次启动: NameNode主机 NameNode备机 DataNode有节点 启动所有journal node 启动所有zkfc # 同理,在namenode主机上执行stop-dfs.sh 会将上述所有进程都停止。
7.搭建失败如何修复
1. 看日志,改配置,同步修改其他节点配置。 2. 清空所有节点的/opt/installs/hadoop3.1.4/data目录 3. 清空所有QJN所在节点的目录:/opt/installs/journalnode/ 4. 按照首次启动HAHadoop步骤操作
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)