ZooKeeper分布式应用协调服务
1、分布式应用协调服务ZooKeeper
2、数据系统和通知机制的整合
3、在ZooKeeper中数据是以节点【znode】的形式存在,并且在节点中保存了数据,该节点的标识是通过路径标识实现
4、数据节点的存储类型:
(1)persistent:永久存在
(2)persistent_sequential:永久存在且自动编号
(3)ephemeral:临时存在,与客户端连接周期一致,临时节点不能有子节点*****
(4)ephemeral_sequential:临时存在且自动编号,与客户端连接周期一致
5、单机版安装,以下操作均在hadoop101进行
(1)网络下载并上传到linux:/opt/software/zookeeper-3.4.5-cdh5.14.2.tar.gz
(2)解压:tar -zxvf zookeeper-3.4.5-cdh5.14.2.tar.gz -C /opt/install/
(3)创建软连接:ln -s zookeeper-3.4.5-cdh5.14.2/ zookeeper
(4)配置环境变量:vi /etc/profile
export ZOOKEEPER_HOME=/opt/install/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
(5)使配置环境变量生效:source /etc/profile
(6)切换到conf目录并复制配置文件:cp zoo_sample.cfg zoo.cfg
(7)修改配置文件:vi zoo.cfg
dataDir=/opt/install/zookeeper/zkData
(8)启动zookeeper服务:zkServer.sh start并用jps查看是否出现QuorumPeerMain
(9)查看zookeeper服务:zkServer.sh status可以看到Mode: standalone
(10)停止zookeeper服务:zkServer.sh stop并用jps查看是否出现QuorumPeerMain
(11)停机做快照
6、客户端常用命令:
(1)查看所有可用的命令帮助:help
(2)查看指定节点下的子节点名称:ls <path>
(3)查看指定节点下的子节点名称及指定节点的详细信息:ls2 <path>
(4)创建节点:create [-s -e] <path> <string_data>,其中-s表示序列号,-e表示临时节点
(5)查看节点数据:get <path>
(6)修改节点数据:set <path> <string_data>
(7)查看节点状态:stat <path>
(8)删除空节点【没有子节点】:delete <path>
(9)删除(非)空节点:rmr <path>
(10)退出客户端:quit
7、java编程:
? ? <dependencies>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.apache.zookeeper</groupId>
? ? ? ? ? ? <artifactId>zookeeper</artifactId>
? ? ? ? ? ? <version>3.4.5</version>
? ? ? ? ? ? <exclusions>
? ? ? ? ? ? ? ? <exclusion>
? ? ? ? ? ? ? ? ? ? <groupId>log4j</groupId>
? ? ? ? ? ? ? ? ? ? <artifactId>log4j</artifactId>
? ? ? ? ? ? ? ? </exclusion>
? ? ? ? ? ? </exclusions>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>log4j</groupId>
? ? ? ? ? ? <artifactId>log4j</artifactId>
? ? ? ? ? ? <version>1.2.17</version>
? ? ? ? </dependency>
? ? </dependencies>
log4j.properties文件内容:
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
8、完全分布式安装zookeeper
(1)向hadoop102上传zookeeper-3.4.5-cdh5.14.2.tar.gz到/opt/software目录中
(2)解压安装:tar -zxvf zookeeper-3.4.5-cdh5.14.2.tar.gz -C /opt/install
(3)建立软链接:ln -s /opt/install/zookeeper-3.4.5-cdh5.14.2 /opt/install/zookeeper
(4)设置环境变量:vi /etc/profile
? ? ?export ZOOKEEPER_HOME=/opt/install/zookeeper
? ? ?export PATH=$ZOOKEEPER_HOME/bin:$PATH
(5)使配置文件生效:source /etc/profile
(6)切换到conf目录并复制及重命名zookeeper的配置文件:
? ? ?cp zoo_sample.cfg zoo.cfg
(7)修改配置文件:vi zoo.cfg
? ? ?修改 dataDir 的值, 配置为下面的值。
? ? ?dataDir=/opt/install/zookeeper/zkData
? ? ?在文件末尾增加如下配置。
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
(8)在/opt/install/zookeeper/zkData目录中创建myid文件并写入id:echo 2 > myid
(9)将配置好的 zookeeper 分发到103,104机器上
? ? ?scp -r /opt/install/zookeeper/ root@hadoop103:/opt/install/
? ? ?scp -r /opt/install/zookeeper/ root@hadoop104:/opt/install/
(10)分别把103,104上的myid文件内容设置为3,4
(11)将环境变量配置文件分发到103,104机器上
? ? ?scp /etc/profile root@hadoop103:/etc/profile
? ? ?scp /etc/profile root@hadoop104:/etc/profile
(12)分别在103,104上使环境变量配置文件生效:source /etc/profile
(13)分别在102,103,104机器上启动zookeeper:zkServer.sh start并通过jps检查,应有QuorumPeerMain
(14)分别在102,103,104机器上查看zookeeper状态:zkServer.sh status
(15)分别在102,103,104机器上停止zookeeper:zkServer.sh stop
(16)做快照
9、三个重要角色:
(1)Leader:更新状态
(2)Follower:接受并处理客户端请求以及参与候选leader
(3)Observer:接受并处理客户端请求,在zoo.cfg文件中修改为
? ? ?server.x=xxxxx:2888:3888:observer
【选举机制:】与下列因素有关:总节点数,节点编号,启动顺序
【在其他节点中启动另一节点的zk】ssh root@hadoop10x "source /etc/profile;zkServer.sh start"?
10、HDFS-HA 集群配置(自动故障转移)
(1)恢复102,103,104三台虚拟机的快照
(2)删除102,103,104三台机器的数据目录:rm -rf /opt/install/hadoop/data
(3)在 hadoop102 上配置 core-site.xml文件:
<configuration>
? ? <!-- 把两个 NameNode 的地址组装成一个集群 mycluster -->
? ? <property>
? ? ? ? <name>fs.defaultFS</name>
? ? ? ? <value>hdfs://mycluster</value>
? ? </property>
? ? <!-- 指定 hadoop 运行时产生文件的存储目录 -->
? ? <property>
? ? ? ? <name>hadoop.tmp.dir</name>
? ? ? ? <value>/opt/install/hadoop/data/tmp</value>
? ? </property>
? ? <!--指定zookeeper集群-->
? ? <property>
? ? ? <name>ha.zookeeper.quorum</name>
? ? ? <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
? ? </property>
</configuration>
(4)在 hadoop102 配置 hdfs-site.xml文件:
<configuration>
? ? <!-- 完全分布式集群名称 -->
? ? <property>
? ? ? ? <name>dfs.nameservices</name>
? ? ? ? <value>mycluster</value>
? ? </property>
? ? <!-- 集群中 NameNode 节点都有哪些,这里是 nn1 和 nn2 -->
? ? <property>
? ? ? ? <name>dfs.ha.namenodes.mycluster</name>
? ? ? ? <value>nn1,nn2</value>
? ? </property>
? ? <!-- nn1 的 RPC 通信地址 -->
? ? <property>
? ? ? ? <name>dfs.namenode.rpc-address.mycluster.nn1</name>
? ? ? ? <value>hadoop102:9000</value>
? ? </property>
? ? <!-- nn2 的 RPC 通信地址 -->
? ? <property>
? ? ? ? <name>dfs.namenode.rpc-address.mycluster.nn2</name>
? ? ? ? <value>hadoop103:9000</value>
? ? </property>
? ? <!-- nn1 的 http 通信地址 -->
? ? <property>
? ? ? ? <name>dfs.namenode.http-address.mycluster.nn1</name>
? ? ? ? <value>hadoop102:50070</value>
? ? </property>
? ? <!-- nn2 的 http 通信地址 -->
? ? <property>
? ? ? ? <name>dfs.namenode.http-address.mycluster.nn2</name>
? ? ? ? <value>hadoop103:50070</value>
? ? </property>
? ? <!-- 指定 JournalNode 的位置 -->
? ? <property>
? ? ? ? <name>dfs.namenode.shared.edits.dir</name>
? ? ? ? <value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value>
? ? </property>
? ? <!-- 指定 journalnode 存储目录-->
? ? <property>
? ? ? ? <name>dfs.journalnode.edits.dir</name>
? ? ? ? <value>/opt/install/hadoop/data/jn</value>
? ? </property>
? ? <!-- 配置隔离机制, 即同一时刻只能有一台服务器对外响应 -->
? ? <property>
? ? ? ? <name>dfs.ha.fencing.methods</name>
? ? ? ? <value>shell(/bin/true)</value>
? ? </property>
? ? <!-- 使用隔离机制时需要 ssh 无密钥登录-->
? ? <property>
? ? ? ? <name>dfs.ha.fencing.ssh.private-key-files</name>
? ? ? ? <value>/root/.ssh/id_rsa</value>
? ? </property>
? ? <!-- 关闭权限检查-->
? ? <property>
? ? ? ? <name>dfs.permissions.enable</name>
? ? ? ? <value>false</value>
? ? </property>
? ? <!-- 指定自动切换实现方式-->
? ? <property>
? ? ? ? <name>dfs.client.failover.proxy.provider.mycluster</name>
? ? ? ? <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
? ? </property>
? ? <!--开启自动故障转移功能-->
? ? <property>
? ? ? <name>dfs.ha.automatic-failover.enabled</name>
? ? ? <value>true</value>
? ? </property>
</configuration>
(5)把以上两个文件复制到103上:scp core-site.xml hdfs-site.xml hadoop103:`pwd`
(6)分别启动102,103,104三台机器的 Zookeeper 集群:zkServer.sh start并通过zkServer.sh status查看
(7)初始化 HA 在 Zookeeper 中状态:hdfs zkfc -formatZK
(8)在102上启动所有journalnode服务:hadoop-daemons.sh start journalnode并通过jps验证
(9)在102上格式化:hdfs namenode -format并通过查看VERSION文件验证
(10)在102上启动namenode服务:hadoop-daemon.sh start namenode并通过jps验证
(11)在103上同步102的元数据信息:hdfs namenode -bootstrapStandby并通过查看VERSION文件验证
(12)在103上启动namenode服务:hadoop-daemon.sh start namenode并通过jps验证
(13)在102上启动所有datanode服务:hadoop-daemons.sh start datanode并通过jps验证及查看VERSION文件验证
(14)在102上启动所有zkfc服务:hadoop-daemons.sh start zkfc并通过jps验证?? ?
(15)在chrome上查看hadoop102,hadoop103上的50070
(16)验证:停止active状态的namenode,然后通过浏览器查看另一台namenode是否自动切换成功
(17)停止所有服务:
? ? ?在102上执行:stop-dfs.sh
? ? ?在102,103,104上执行:zkServer.sh stop
(18)停机做快照
【启停方式一】
zkServer.sh start(查看状态zkServer.sh status)
hadoop-daemon.sh start zkfc
hadoop-daemon.sh start journalnode
hadoop-daemon.sh start namenode(查看状态hdfs haadmin -getServiceState nnx)
hadoop-daemon.sh start datanode
=======================================
hadoop-daemon.sh stop datanode
hadoop-daemon.sh stop namenode(查看状态hdfs haadmin -getServiceState nnx)
hadoop-daemon.sh stop journalnode
hadoop-daemon.sh stop zkfc
zkServer.sh stop(查看状态zkServer.sh status)
【启停方式二】
zkServer.sh start
hadoop-daemons.sh start zkfc
hadoop-daemons.sh start journalnode
hadoop-daemons.sh start namenode
hadoop-daemons.sh start datanode
=======================================
hadoop-daemons.sh stop datanode
hadoop-daemons.sh stop namenode
hadoop-daemons.sh stop journalnode
hadoop-daemons.sh stop zkfc
zkServer.sh start
【启停方式三】(建议)
zkServer.sh start
start-dfs.sh
=======================================
stop-dfs.sh
zkServer.sh stop
12、YARN-HA 集群配置
(1)在102修改yarn-site.xml:
<configuration>
? ? <property>
? ? ? ? <name>yarn.nodemanager.aux-services</name>
? ? ? ? <value>mapreduce_shuffle</value>
? ? </property>
? ? <!--启用 resourcemanager ha-->
? ? <property>
? ? ? ? <name>yarn.resourcemanager.ha.enabled</name>
? ? ? ? <value>true</value>
? ? </property>
? ? <!--声明两台 resourcemanager 的地址-->
? ? <property>
? ? ? ? <name>yarn.resourcemanager.cluster-id</name>
? ? ? ? <value>cluster-yarn1</value>
? ? </property>
? ? <property>
? ? ? ? <name>yarn.resourcemanager.ha.rm-ids</name>
? ? ? ? <value>rm1,rm2</value>
? ? </property>
? ? <property>
? ? ? ? <name>yarn.resourcemanager.hostname.rm1</name>
? ? ? ? <value>hadoop102</value>
? ? </property>
? ? <property>
? ? ? ? <name>yarn.resourcemanager.hostname.rm2</name>
? ? ? ? <value>hadoop103</value>
? ? </property>
? ? <!--指定 zookeeper 集群的地址-->
? ? <property>
? ? ? ? <name>yarn.resourcemanager.zk-address</name>
? ? ? ? <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
? ? </property>
? ? <!--启用自动恢复-->
? ? <property>
? ? ? ? <name>yarn.resourcemanager.recovery.enabled</name>
? ? ? ? <value>true</value>
? ? </property>
? ? <!--指定 resourcemanager 的状态信息存储在 zookeeper 集群-->
? ? <property>
? ? ? ? <name>yarn.resourcemanager.store.class</name>
? ? ? ? <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
? ? </property>
</configuration>
(2)复制到103上:scp yarn-site.xml hadoop103:`pwd`
(3)启动所有zookeeper服务并检查
(4)启动yarn服务:
?? ?yarn-daemons.sh start resourcemanager?
?? ?yarn-daemons.sh start nodemanager
(5)查看yarn服务角色:yarn rmadmin -getServiceState rm1或rm2
(6)通过chrome查看yarn服务角色:8088,注意地址栏中的变化,仅能看到active的rm节点
(7)停止所有服务:
?? ?yarn-daemons.sh stop nodemanager
?? ?yarn-daemons.sh stop resourcemanager
(8)停止三台机器的zk服务
(9)停机做快照
13、建议的启动过程:
(1)zkServer.sh start
(2)start-dfs.sh
(3)yarn-daemons.sh start resourcemanager
(4)yarn-daemons.sh start nodemanager
14、建议的停止过程:
(1)stop-dfs.sh
(2)yarn-daemons.sh stop resourcemanager
(3)yarn-daemons.sh stop nodemanager
(4)zkServer.sh stop
15、如果在启动过程中出现任何问题的解决方案:看异常,查日志,长经验!!!
16、集群规划
102:nn rm dn nm jn zkfc zk
103:nn rm dn nm jn zkfc zk
104:dn nm jn zk
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!