ZooKeeper的安装
时间:2022-07-25
本文章向大家介绍ZooKeeper的安装,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
方案架构说明
- 先看看没有HA的HDFS的系统架构
- 然后有HA方案的系统架构:
方案解析
- 两个NameNode,一个active,一个standby状态。
- activeNameNode写EditLogs到JournalNode集群,standByNameNode从JournalNode读EditLogs
- 利用zookeeper监控两个NameNode的状态,发现active死掉,然后用ZKFC进行切换。
此文章的假设是hadoop集群已经搭建好。zookeeper已经搭建完成!参考《安装zookeeper笔记》
- 无HA的集群角色分配
主机名 |
ip |
角色 |
---|---|---|
hadoop01 |
192.168.56.10 |
NameNode ResourceManager ZK |
hadoop02 |
192.168.56.11 |
DataNode NodeManager ZK |
hadoop03 |
192.168.56.12 |
DataNode NodeManager ZK |
hadoop04 |
192.168.56.13 |
DataNode NodeManager |
- 重新规划后,HA架构角色分配
主机名 |
ip |
角色 |
---|---|---|
hadoop01 |
192.168.56.10 |
NameNode ResourceManager ZK |
hadoop02 |
192.168.56.11 |
NameNode,DataNode NodeManager ZK journalnode |
hadoop03 |
192.168.56.12 |
DataNode NodeManager ZK journalnode |
hadoop04 |
192.168.56.13 |
DataNode NodeManager journalnode |
手动切换的HA配置
- 修改core-site.xml将hdfs://hadoop01:9000换成(mycluster是HA的服务Id)
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
- hdfs-site.xml上添加配置
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop02:50070</value>
</property>
<!--指定JournalNode -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop02:8485;hadoop03:8485;hadoop04:8485/mycluster</value>
</property>
<!--指定cluster1出故障时,哪个实现类负责执行故障切换-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--SSH to the Active NameNode and kill the process-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/cluster/.ssh/id_rsa</value>
</property>
<!--the path where the JournalNode daemon will store its local state-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/cluster/journalnode/localdata</value>
</property>
操作
- 步骤1:在各个JournalNode节点上,输入以下命令启动journalnode服务: sbin/hadoop-daemon.sh start journalnode 如果你从一个no-HA更新到HA,you can do this … hdfs namenode -initializeSharedEdits
- 步骤2:在[nn1]上,对其进行格式化,并启动: bin/hdfs namenode -format -clusterid mycluster sbin/hadoop-daemon.sh start namenode
- 步骤3:在[nn2]上,同步nn1的元数据信息: bin/hdfs namenode -bootstrapStandby
- 步骤4:在[nn2],启动NameNode: sbin/hadoop-daemon.sh start namenode
- 步骤5:在[nn1]上,将NameNode切换为Active bin/hdfs haadmin -ns mycluster -transitionToActive nn1
状态查看
sbin/start-dfs.sh之后,两个namenode都进入standby状态
命令行:
查看状态:
hdfs haadmin -getServiceState nn1
hdfs haadmin -checkHealth nn1(没有输出)
切换NameNode状态
hdfs haadmin -ns mycluster -transitionToActive nn1
hdfs haadmin -ns mycluster -transitionToStandby nn1
自动切换配置(在手动切换的基础上新增):
- core-site.xml新增
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
2181是zookeeper配置的ClientPort * 然后要在hdfs-site.xml上添加配置:
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
- 启动zookeeper(hadoop01-03) zkServer.sh start 然后就是在NameNode的机器上初始化NameNode在ZK的状态了: bin/hdfs zkfc -formatZK
- 重启HDFS(ZKFC会随之启动) sbin/stop-dfs.sh # 重启hdfs sbin/start-dfs.sh 或手动启动DFSZKFailoverController(ZKFC): sbin/hadoop-daemon.sh start zkfc # 启动ZKFC 在该HA方案中,每一个NameNode都有一个对应的ZKFC。ZKFC会随NameNode启动。 启动之后会有一个nameNode自动被选举为active
- 测试yarn的可用性
[cluster@hadoop01 bin]$ pwd
/home/cluster/hadoop/bin
[cluster@hadoop01 bin]$ ./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar pi 10 100
- 遇到的问题: java.io.IOException: Incompatible clusterIDs in /home/cluster/hadoop/tmp/dfs/data: namenode clusterID = mycluster; datanode clusterID = CID-5d8f5f94-1e6f-4f21-895a-b6892a881436 解决 修改/home/cluster/hadoop/tmp/dfs/data/current/VERSION 里面的clusterID =mycluster
- 遇到的问题: 如果配置了 dfs.ha.fencing.methods sshfence ssh必须双向联通,否则active无法正确切换。
参考:
http://segmentfault.com/a/1190000000624579
喜欢 (1)or分享 (0)
- HDU 2147 kiki's game(规律,博弈)
- HDU 1847 Good Luck in CET-4 Everybody!(规律,博弈)
- [network][udp]你不要偷偷发包,我跟你讲
- [快学Python3]HTTP处理 - urllib模块
- 关小刷刷题08 – Leetcode 26. Remove Duplicates from Sorted Array 方法2、3
- C++课程设计类作业2
- C++课程设计类作业4
- [接口测试 - 基础篇] 01 你应该了解的协议基础
- 代码分享系列(1)之感知机【代码可下载】
- C++课程设计类作业3
- [快学Python3]INI文件读写
- 【专知-PyTorch手把手深度学习教程08】NLP-PyTorch: 用字符级RNN生成名字
- Codeforces Round #415 (Div. 2)(A,暴力,B,贪心,排序)
- BZOJ 2456: mode(新生必做的水题)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Centos7 安装达梦数据库的教程
- Android开发使用Handler实现图片轮播功能示例
- 简单实现Android刮刮卡效果
- CentOS7.4下 安装JDK1.8的图文教程
- Android Studio中导入JNI生成的.so库的实现方法
- Android实现文件上传和下载倒计时功能的圆形进度条
- 使用Apache ab进行http性能测试
- Android Imageloader的配置的实现代码
- Linux下如何查看版本信息的方法步骤
- Android开发实现Files文件读取解析功能示例
- Android实现iPhone晃动撤销输入功能 Android仿微信摇一摇功能
- 猿实战21——商品发布之商品数据存储
- Android编程自定义进度条颜色的方法详解
- Android TextView对齐的两种方法
- Android ScrollView实现反弹效果的实例