Hadoop HA 高可用集群搭建

一、Hadoop HA 高可用集群整体架构

      在 Hadoop 1.0 时代,Hadoop 中的HDFS 集群中面临一个问题,即NameNode 单点问题,如果在集群运行过程中,NameNode出现故障宕机后,那么整个集群将会面临瘫痪。
       Hadoop 2.0 以后,NameNode 的单点问题得到了解决,共有两台NameNode并形成互备,一台处于活动状态,一台处于备用状态,只有活动状态的NameNode才会对外提供服务,而备用状态的NameNode不对外提供服务,仅同步Active NameNode的状态,以便能在它失败时快速进行切换。

Hadoop HA 高可用集群整体架构

这里写图片描述

上图为Hadoop HA 的高可用整体架构图,它的主要主成部分如下

1.两台NameNode
Active NameNode 和 Standby NameNode:两台 NameNode形成互备,一台处于 Active(活动)状态,一台处理Standby(备用)状态,只有主NameNode才能对外提供读写服务

2.主备切换控制器:ZKFailoverController
ZKFailoverController作为独立的进程运行,对NameNode的主备切换进行总体控制,及时监控检测NameNode的健康状态,当主 NameNode发生故障后,借助Zookeeper实现自动的主备选举和切换。

3.Zookeeper集群
为主备切换控制器(ZKFailoverController)提供主备选举支持,当一个NameNode节点出现故障后,切换备用NameNode为主节点,从而实现Hadoop HA 高可用。

4.基于QJM的共享存储系统
QJM为Quorum Journal Manager的缩写,JournalNode中保存了NameNode在运行过程中所产生的HDFS的元数据,主NameNode和备NameNode通过共享存储系统实现元数据同步,在进行主备切换时,新的NameNode在确认元数据完全同步完成后才能继续对外提供服务。

5.DN
DataNode的缩写,用于存放数据文件的节点,hadoop2.x默认一个块的大小为128M,hadoop1.0为64M,默认备份数量为3,可以通过hadoop 的配置文件修改。

NameNode主备切换实现

Hadoop HA 中有两台NameNode,它们之间形成互备,那么我们来看下它是如何实现主备切换

这里写图片描述

NameNode 主备切换主要由ZKFailoverController、HealthMonitor和ActiveStandbyElector三个组件协同实现
1.ZKFailoverController
作为NameNode上一个独立的进程启动,启动后会创建HealthMonitor和ActiveStandbyElector,创建的同时会注册相应的回调方法。

2.HealthMonitor
主要负责检测NameNode的健康状态,如果检测到NameNode的状态发生变化,则回调ZKFailoverController的相应方法进行自动的主备选举

3.ActiveStandbyElector
主要负责完成自动的主备选举,内部封装了zookeeper的处理逻辑,一旦zookeeper主备选举完成,会回调ZKFailoverController的相应方法进行NameNode的主备状态切换

二、前期准备

主机系统IP作用
node1centos7192.168.242.161NameNode1
node2centos7192.168.242.162NameNode2
node3centos7192.168.242.163DataNode1
node4centos7192.168.242.164DataNode2
node5centos7192.168.242.165DataNode3



参考如上,创建5台虚拟机,使用最小安装,内存最小1G,创建完成后,分别配置主机名、静态IP、主机名与IP映射、创建 hadoop 用户并为 hadoop 用户授权。

在进行正式软件安装前我们需要把防火墙和selinux守护进程关闭。使用如下命令

# systemctl status firewalld    # 查看防火墙状态
# systemctl stop firewalld      # 关闭防火墙
# systemctl disable firewalld   # 禁止防火墙开机自启动
# getenforce    # 查看守护进程状态
# setenforce 0  # 临时关闭守护进程
# vim /etc/selinux/config   # 永久关闭守护进程,笔者使用的此方法

永久关闭selinux守护进程,使用vim打开/etc/selinux/config 修改文件内容

修改前:
这里写图片描述

修改后:
这里写图片描述

配置 SSH 无密码登录

我们要实现的效果是
node1 ssh 无密登录node2、node3、node4、node5
node2 ssh 无密登录node1、node3、node4、node5

说明:
服务器A想要 ssh 无密登录服务器B,则需要在服务器A上面生成密钥,然后远程拷贝到服务器B的.ssh目录下(该目录在用户目录下)

node1、node2、node3、node4、node5 中分别执行如下命令

$ ssh localhost    
$ exit
$ cd ~/.ssh/
$ ll

这里写图片描述

如果不事先在每台虚拟机中执行,在之后做 SSH 无密登录配置时,可能出现如下错误:
scp: /home/hadoop/.ssh/: Is a directory

node1 中执行如下命令

$ cd ~/.ssh/
$ ssh-keygen -t rsa
$ cat id_rsa.pub >> authorized_keys
$ chmod 600 authorized_keys
$ scp authorized_keys hadoop@node2:~/.ssh/
$ scp authorized_keys hadoop@node3:~/.ssh/
$ scp authorized_keys hadoop@node4:~/.ssh/
$ scp authorized_keys hadoop@node5:~/.ssh/

测试

$ ssh node2
$ ssh node3
$ ssh node4
$ ssh node5

这里写图片描述

node2 中 执行

$ cd ~/.ssh/
$ ssh-keygen -t rsa
$ $ cat id_rsa.pub >> authorized_keys
$ chmod 600 authorized_keys
$ scp authorized_keys hadoop@node1:~/.ssh/
$ scp authorized_keys hadoop@node3:~/.ssh/
$ scp authorized_keys hadoop@node4:~/.ssh/
$ scp authorized_keys hadoop@node5:~/.ssh/

测试

$ ssh node1
$ ssh node3
$ ssh node4
$ ssh node5

这里写图片描述

三、软件安装

在5台虚拟机中分别安装 jdk 及 hadoop,参考笔者在导读中的发的博客地址。

安装zookeeper(node3、node4、node5)

分别在node3、4、5中安装 zookeeper
zookeeper 官网:http://mirror.bit.edu.cn/apache/zookeeper/

使用如下命令下载 zookeeper 安装包

$ su root
# wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
# exit  # 回退到上个终端
$ tar -zvxf zookeeper-3.4.9.tar.gz # 将 zookeeper 解压到 hadoop 用户目录下

如果提示没有 wget 命令, 则使用如下命令安装即可

# yum install wget  # 使用 root 用户安装

jdk、hadoop、zookeeper环境变量如下,配置在 ~/.bashrc 文件中(用户变量)

# Java Environment Variable
export JAVA_HOME=/usr/java/jdk1.8.0_131

# Hadoop Environment Variable
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

# Zookeeper Environment Variable
export ZOOKEEPER_HOME=/home/hadoop/zookeeper-3.4.9

# PATH
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$ZOOKEEPER_HOME/bin

四、集群配置(zookeeper、hadoop)

1.zookeeper 配置(node3、4、5)

在 node3、node4、node5 中的 zookeeper 安装目录下分别创建一个文件data,作为 zookeeper 的 数据文件,并在data目录下创建一个文件 myid 且在文件中写入一个数字,命令如下

node3、node4、node5中执行

$ mkdir -p /home/hadoop/zookeeper-3.4.9/data   # 创建data目录,用于存放zookeeper数据
$ cd /home/hadoop/zookeeper-3.4.9/data
$ touch myid
$ echo "1" > /home/hadoop/zookeeper-3.4.9/data/myid    # node3 中执行
$ echo "2" > /home/hadoop/zookeeper-3.4.9/data/myid    # node4 中执行
$ echo "3" > /home/hadoop/zookeeper-3.4.9/data/myid    # node5 中执行
$ vim /home/hadoop/zookeeper-3.4.9/data/myid           # node3、node4、node5中执行,查看写入是否成功

在 zookeeper 安装目录下的 conf 目录下有一个名为 zoo_sample.cfg 的文件,拷贝该文件命名为zoo.cfg,我们需要配置该文件,zookeeper 在启动时会找这个文件作为默认配置文件。执行如下命令

$ cp zoo_sample.cfg zoo.cfg
$ vim /home/hadoop/zookeeper-3.4.9/conf/zoo.cfg        # 打开zookeeper配置文件

配置前:

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

配置后:

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
# dataDir=/tmp/zookeeper
# 配置Zookeeper数据存放配置
dataDir=/home/hadoop/zookeeper-3.4.9/data
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
# 配置zookeeper集群的主机和ip,1 2 3 表示zookeeper服务的编号
server.1=node3:2888:3888
server.2=node4:2888:3888
server.3=node5:2888:3888

2.hadoop ha 配置(node1、2、3、4、5)

node1、node2、node3、node4、node5分别配置

core-site.xml:

<!-- hadoop 核心配置文件 -->
<configuration>
    <property>  
        <name>fs.defaultFS</name>  
        <value>hdfs://cluster</value>
        <description>hadoop ha 部署方式下namenode访问地址,cluster是名字可自定义,后面hdfs-site.xml会用到</description>
    </property>  
    <property>  
        <name>hadoop.tmp.dir</name>  
        <value>/usr/local/hadoop/tmp</value>
        <description>指定hadoop临时目录</description>
    </property>  
    <property>  
        <name>ha.zookeeper.quorum</name>  
        <value>node3:2181,node4:2181,node5:2181</value>
        <description>指定zookeeper地址</description>
    </property>
    <property>   
        <name>ha.zookeeper.session-timeout.ms</name>   
        <value>300000</value>
        <description>zk的超时时间,单位为毫秒,默认为5000,这个值比较小。建议设置得大一些,zk过于敏感,避免因为网路抖动等原因引起NameNode进行无所谓的主备切换</description>
    </property>
    <property>  
        <name>fs.trash.interval</name>  
        <value>1440</value>  
        <description>开启垃圾回收站功能,防止误删除文件,HDFS文件删除后先放入回收站,单位为分,垃圾回收站最长保留数据时间为1天,超过一天后删除</description>
    </property>  
    <property>    
        <name>io.file.buffer.size</name>    
        <value>131072</value> 
        <description>设置SequenceFile中用到的读/写缓存大小,合理设置缓存大小有利于提高数据传输效率,单位为byte,默认为4KB,这里设置为128KB</description>      
    </property>
</configuration>

hdfs-site.xml

<!-- hadoop 分布式文件系统hdfs配置文件 -->
<configuration>
    <property>  
        <name>dfs.nameservices</name>  
        <value>cluster</value>
        <description>指定hdfs的nameservice为cluster,需要和core-site.xml文件中的保持一致</description>
    </property>  
    <property>  
        <name>dfs.ha.namenodes.cluster</name>  
        <value>node1,node2</value>
        <description>cluster下有两个NameNode,分别为node1和node2</description>
    </property>

    <property>  
        <name>dfs.namenode.rpc-address.cluster.node1</name>  
        <value>node1:9000</value>
        <description>NameNode1的RPC通信地址,端口要和core-site.xml中fs.defaultFS的一致</description>
    </property>  
    <property>  
        <name>dfs.namenode.http-address.cluster.node1</name>  
        <value>node1:50070</value>
        <description>NameNode1的HTTP通信地址</description>
    </property>  

    <property>  
        <name>dfs.namenode.rpc-address.cluster.node2</name>  
        <value>node2:9000</value>
        <description>NameNode2的RPC通信地址,端口要和core-site.xml中fs.defaultFS的一致</description>
    </property>  
    <property>  
        <name>dfs.namenode.http-address.cluster.node2</name>  
        <value>node2:50070</value>
        <description>NameNode2的HTTP通信地址</description>
    </property>  

    <property>  
        <name>dfs.namenode.shared.edits.dir</name>  
        <value>qjournal://node3:8485;node4:8485;node5:8485/cluster</value>
        <description>指定NameNode的元数据在JournalNode上的存放位置</description>
    </property>  
    <property>  
        <name>dfs.journalnode.edits.dir</name>  
        <value>/usr/local/hadoop/journaldata</value>
        <description>指定NameNode的元数据在JournalNode上的存放位置</description>
    </property>  

    <property>  
        <name>dfs.ha.automatic-failover.enabled</name>  
        <value>true</value>
        <description>指定支持高可用自动切换机制</description>
    </property>  
    <property>  
        <name>dfs.client.failover.proxy.provider.cluster</name>  
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        <description>配置失败自动切换实现方式</description>
    </property>  

    <property>  
        <name>dfs.ha.fencing.methods</name>  
        <value>  
            sshfence  
            shell(/bin/true)  
        </value>
        <description>配置隔离机制,主要用于远程管理监听其他机器相关服务</description>
    </property>  
    <property>  
        <name>dfs.ha.fencing.ssh.private-key-files</name>  
        <value>/home/hadoop/.ssh/id_rsa</value>
        <description>使用隔离机制时需要ssh免密码登陆,/home/hadoop/为用户目录</description>
    </property>  
    <property>  
        <name>dfs.ha.fencing.ssh.connect-timeout</name>  
        <value>30000</value>
        <description>使用隔离机制时需要ssh免密码登陆时的超时时间,单位为毫秒</description>
    </property>

    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
        <description>NameNode结点存储hadoop文件系统信息的本地系统路径</description>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
        <description>DataNode结点被指定要存储数据的本地文件系统路径,这个值只对NameNode有效,DataNode并不需要使用到它</description>
    </property>

    <property>   
        <name>dfs.webhdfs.enabled</name>   
        <value>true</value>
        <description>指定可以通过web访问hdfs目录</description>
    </property>
</configuration>

mapred-site.xml

<!-- 分布式计算框架MapReduce配置文件 -->
<configuration>
    <property>  
        <name>mapreduce.framework.name</name>  
        <value>yarn</value>
        <description>配置MapReduce运行于yarn中</description>
    </property>  
</configuration>

yarn-site.xml

<!-- 分布式资源管理系统Yarn配置文件 -->
<configuration>
    <!-- 日志聚合功能yarn.log  start --> 
    <property>   
        <name>yarn.log-aggregation-enable</name>   
        <value>true</value>   
        <description>开启日志聚合功能,默认为false</description>
    </property>         
    <property>   
        <name>yarn.log-aggregation.retain-seconds</name>   
        <value>259200</value>   
        <description>在HDFS上聚合的日志最长保留多少秒,这里配置为3天</description>
    </property> 
    <!-- 日志聚合功能yarn.log  end --> 

    <!-- 配置resourcemanager  start
         在YARN中,ResourceManager负责集群中所有资源的统一管理和分配,
         它接收来自各个节点(NodeManager)的资源汇报信息,
         并把这些信息按照一定的策略分配给各个应用程序(实际上是ApplicationManager)
    -->
    <property>  
       <name>yarn.resourcemanager.ha.enabled</name>  
       <value>true</value>  
       <description>开启resourcemanager ha,默认为false</description>
    </property>  
    <property>  
       <name>yarn.resourcemanager.cluster-id</name>  
       <value>yrc</value>  
       <description></description>
    </property>  
    <property>  
       <name>yarn.resourcemanager.ha.rm-ids</name>  
       <value>rm1,rm2</value>  
       <description></description>
    </property>  
    <property>  
       <name>yarn.resourcemanager.hostname.rm1</name>  
       <value>node1</value>  
       <description></description>
    </property>     
    <property>  
       <name>yarn.resourcemanager.hostname.rm2</name>  
       <value>node2</value>  
       <description></description>
    </property>  
    <property>  
       <name>yarn.resourcemanager.zk-address</name>  
       <value>node3:2181,node4:2181,node5:2181</value>  
       <description></description>
    </property>  
    <!-- 配置resourcemanager  end -->

    <!-- 配置nodemanager  start
         NodeManager是运行在单个节点上的代理,它管理Hadoop集群中单个计算节点
    -->
    <property>  
       <name>yarn.nodemanager.aux-services</name>  
       <value>mapreduce_shuffle</value>  
    </property> 
    <property>    
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>    
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>    
    </property>
    <!-- 配置nodemanager  end -->
</configuration>

slaves

node3
node4
node5

五、集群启动关闭

1.手动启动关闭集群

集群启动

1).启动zookeeper(node3、node4、node5)

$ zkServer.sh start

2).启动journalnode(node3、node4、node5)

$ hadoop-daemon.sh start journalnode

3).格式化HDFS(node1)

注意:格式化后需要把tmp目录拷贝给node2,不然node2的namenode启动不起来,第一次启动时需要格式化

$ hdfs namenode -format
$ scp -r /usr/local/hadoop/tmp hadoop@node2:/usr/local/hadoop/

4).格式化ZKFC(node1)

注意:第一次启动时需要格式化

$ hdfs zkfc -formatZK

5).启动HDFS(node1)

$ start-dfs.sh

6).启动YARN(node1)

$ start-yarn.sh

7).启动resourcemanager(node2)

node2的resourcemanager需要手动单独启动

$ yarn-daemon.sh start resourcemanager

8).查看进程

$ jps  # 如果集群启动后看到的进程和下图中一样表示成功,否则失败
主机进程
node1、node2NameNode、DFSZKFailoverController、ResourceManager
node3、node4、node5DataNode、NodeManager、JournalNode、QuorumPeerMain



集群关闭

1).停止HDFS(node1)

$ stop-dfs.sh

2).停止YARN(node1)

$ stop-yarn.sh

3).停止resourcemanager(node2)

$ yarn-daemon.sh stop resourcemanager

4).停止zookeeper(node3、node4、node5)

$ zkServer.sh stop

2.集群启动关闭 shell 脚本

每次手动开启或关闭集群,即繁琐又不方便,所以笔者写了一个脚本,通过脚本来管理集群的启动和关闭

zookeeper 集群管理脚本

#!/bin/bash
# FileName:zk-manage.sh
# Description:zookeeper 集群启动关闭管理脚本
# Author:david
SLAVES=$(cat /usr/local/hadoop/etc/hadoop/slaves)
#echo $SLAVES
start_time=`date +%s`
for slave in $SLAVES
do
        case $1 in
                start)    ssh -t $slave "zkServer.sh start" 1>/dev/null;;
                stop)     ssh -t $slave "zkServer.sh stop" 1>/dev/null;;
                status)   echo && ssh -t $slave "zkServer.sh status";;
                restart)  ssh -t $slave "zkServer.sh restart" 1>/dev/null;;
                *)        echo -e "Usage:sh zk-manage.sh {start|stop|status|restart} ^_^\n" && exit;;
        esac
done
end_time=`date +%s`
elapse_time=$((${end_time}-${start_time}))
echo -e "\n$1 ZooKeeper Server takes ${elapse_time} seconds\n"

hadoop 管理脚本

#!/bin/bash
# FileName:hadoop-manage.sh
# Description:hadoop 启动关闭管理脚本,hdfs、yarn及node2上的resourcemanager需要单独启动
# Author:david
NameNode1=node1
NameNode2=node2
start_time=`date +%s`

case $1 in
        start)
                ssh -t $NameNode1 "start-dfs.sh"
                ssh -t $NameNode1 "start-yarn.sh"
                ssh -t $NameNode2 "yarn-daemon.sh start resourcemanager"
        ;;
        stop)
                ssh -t $NameNode1 "stop-dfs.sh"
                ssh -t $NameNode1 "stop-yarn.sh"
                ssh -t $NameNode2 "yarn-daemon.sh stop resourcemanager"
        ;;
        *)
                echo -e "Usage: hadoop-manage.sh {start|stop} ^_^\n" && exit
        ;;
esac
end_time=`date +%s`
elapse_time=$((${end_time}-${start_time}))
echo -e "\n$1 Hadoop Server takes ${elapse_time} seconds\n"

hadoop ha 集群管理脚本

#!/bin/bash
# FileName:hadoop-ha-cluster.sh
# Description:hadoop ha 高可用集群启动关闭脚本
# Author:david
#CLUSTER_CONF_PATH=$(cd "$(dirname "$0")"; pwd)
NameNode1=node1
NameNode2=node2
DataNode1=node3
DataNode2=node4
DataNode3=node5
start_time=`date +%s`

# 查看状态函数封装
function showJps(){
# 查看namenode1(node1)的进程
echo -e "\n**********************************************************************************"
ssh -t $NameNode1 << n1
echo "当前 $NameNode1 上的进程为: "
jps
exit
n1

# 查看namenode2(node2)的进程
echo -e "\n**********************************************************************************"
ssh -t $NameNode2 << n2
echo "当前 $NameNode2 上的进程为: "
jps
exit
n2

# 查看datanode1(node3)的进程
echo -e "\n**********************************************************************************"
ssh -t $DataNode1 << d1
echo "当前 $DataNode1 上的进程为: "
jps
exit
d1

# 查看datanode2(node4)的进程
echo -e "\n**********************************************************************************"
ssh -t $DataNode2 << d2
echo "当前 $DataNode2 上的进程为: "
jps
exit
d2

# 查看datanode3(node5)的进程
echo -e "\n**********************************************************************************"
ssh -t $DataNode3 << d3
echo "当前 $DataNode3 上的进程为: "
jps
exit
d3
}

case $1 in
        # 先启动zk,再启动hadoop
        start)
                sh zk-manage.sh start
                sh hadoop-manage.sh start
        ;;
        # 先关闭hadoop,在关闭zk
        stop)
                sh hadoop-manage.sh stop
                sh zk-manage.sh stop
        ;;
        # 先关闭hadoop,在重启zk,在启动hadoop
        restart)
                sh hadoop-manage.sh stop
                sh zk-manage.sh restart
                sh hadoop-manage.sh start
        ;;
        # 显示进程
        status)
                showJps
        ;;
        *) echo -e "Usage: sh hadoop-ha-cluster.sh {start|stop|restart|status} ^_^\n"  ;;

esac
end_time=`date +%s`
elapse_time=$((${end_time}-${start_time}))
echo -e "\n$1 Hadoop HA Cluster Server takes ${elapse_time} seconds\n"

将上面三个脚本分别存放在一个单独文件中,并存放在同一目录下,使用如下命令管理 hadoop ha 高可用集群的启动、关闭、重启、查看进程。

sh hadoop-ha-cluster.sh start       # 启动集群
sh hadoop-ha-cluster.sh stop        # 关闭集群
sh hadoop-ha-cluster.sh restart     # 重启集群
sh hadoop-ha-cluster.sh status      # 查看每个节点上的进程
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值