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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值