1.集群搭建与配置

本来想使用centos镜像搭建服务器集群,但最小化安装版的镜像也需要1G左右,如果后面再部署一些大数据软件,单是多台服务器环境部署就会占用大量空间,加上此版本镜像在不同电脑环境的安装过程中可能会有一些问题出现,因此选择使用docker容器方式来搭建集群。

docker rabbitmq 两台服务器 docker部署多台服务器_hadoop

docker搭建的集群包含3个节点,其中每个节点在原始centos镜像基础上安装了一些必要命令工具和部署了包括Hadoop、Zookeeper等集群软件后,占用空间在2G左右。

docker rabbitmq 两台服务器 docker部署多台服务器_hbase_02

1.1 centos镜像配置

本次集群服务器选择centos镜像来部署

#docker下载centos镜像,不加tag默认下载最新版本(latest)
docker pull centos

#查看所有镜像信息
docker images

#用centos镜像创建容器
	#name 自定义容器名称
	#privileged 以真正root身份操作容器
	#centos:latest 镜像的名称:版本,用镜像id替代也可以
docker run -itd --name serverbase --privileged centos:latest init

#查看所有运行中的容器
docker ps

#进入容器
docker exec -it serverbase /bin/bash

#设置root用户密码
passwd

#容器使用的centos镜像版本是latest,需要修改镜像源后才能正常安装一些工具,在容器内部分别执行
cd /etc/yum.repos.d/
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
yum makecache
yum update -y

#安装一些必要工具
yum -y install vim
yum install passwd
sudo yum install net-tools
yum install telnet
yum install openssh-server -y
yum install openssh-clients -y

#修改ssh配置文件sshd_config,修改参照图1红框两处
vi /etc/ssh/sshd_config

#修改完保存,重启ssh服务
systemctl start sshd

#退出容器
exit

#将修改后的容器打包生成新的镜像
	#serverbase 上面修改的容器名称,使用容器id也可以
	#centos:serverbase 要生成的新镜像的名称:tag
docker commit -a “作者名称” -m "一些说明信息" serverbase centos:serverbase

#查看新生成的镜像
docker images

图1:配置文件sshd_config的修改

docker rabbitmq 两台服务器 docker部署多台服务器_hadoop_03

1.2 IP问题

Docker网络模式

docker在创建容器时,默认使用的网络模式是bridge,即桥接网络模式。docker默认情况下会建立bridge、host和none三种网络类型,

#查看docker网络类型
docker network ls

默认的bridge网络模式在创建容器时会在网段内按照顺序获取IP地址,IP地址取决于目前已有多少容器在运行,所以docker重启后会变化,我们希望通过docker创建的linux服务器集群要有固定的IP,可以使用docker自定义桥接网络方式来实现容器IP的固定。

自定义桥接网络

#使用如下命令创建自定义桥接网络
	#subnet	指定一个docker网段,要和docker自建的bri0不同
	#mydocnetwork	自定义网络名称
docker network create --subnet=172.18.0.0/16 mydocnetwork

#创建完后再次查看docker网络,发现多了一个mydocnetwork,表示已成功创建
docker network ls

1.3 集群节点配置

本集群包含3个节点,注意节点的命名最好不要有下划线或特殊字符,否则在后面部署软件集群时可能会引发一些问题。

创建第1个节点-node1

docker run -d --name node1 --hostname node1 --net mydocnetwork --ip 172.18.0.2 -p 10100:22 -p 10101:9870 -p :10102:8088 -p 10103:9000 -p 10104:16010 -p :10105:8081 -p 10106:3000 -p 10107:8042 --privileged centos:serverbase /usr/sbin/init

参数解释:

  • name 容器名称(集群节点名称)
  • hostname 指定主机名,创建后可以查看容器内的 /etc/hosts
  • net 指定网络,这里的mydocnetwork是上面自定义的桥接网络,使用此网络可以给容器指定固定IP地址
  • ip 指定的固定IP地址
  • p 注意是小写的p,比如第一个,9001是宿主机端口,22是容器内部端口,可以同时定义多个,宿主机端口可以自定义,不要有冲突就行。xshell等工具连接此节点时使用宿主机ip、端口10100,其他接口用于访问后面部署的一些软件监控页面,这里端口暂时写不全也没关系,容器创建后也可以在配置文件里新增端口
  • privileged 使容器拥有真正root权限
  • centos:serverbase 上面重新创建后的镜像名:tag

*选读:容器创建后添加端口方法

#查看要新增暴露端口的容器id,比如上面创建的节点1的容器id:596e1712214ddocker ps -a #查找要修改的容器的完整ID,结果为 596e1712214d23e7b2c648f47f24a441b8e645b1155e747796a357d1507cad9a docker inspect 596e1712214d | grep Id #到 /var/lib/docker/containers 路径()目录下找到与完整Id相同的目录 #修改此目录下的 hostconfig.json 与 config.v2.json 两个配置文件 #修改前需要先停掉容器与docker服务 docker stop 容器ID systemctl stop docker #hostconfig.json需要修改 PortBindings ,按下面这个格式来添加端口对 #格式:"{容器内部端口}/tcp":[{"HostIp":"","HostPort":"映射的宿主机端口"}] "PortBindings":{"22/tcp":[{"HostIp":"","HostPort":"10100"}],"9870/tcp":[{"HostIp":"","HostPort":"10101"}]} #config.v2.json需要修改 ExposedPorts ,按下面这个格式来添加端口(容器内的端口) #格式:"{容器内部端口}/tcp":{} "ExposedPorts":{"22/tcp":{},"9870/tcp":{}} #修改完,重启docker服务 systemctl restart docker

创建第2个节点-node2

docker run -d --name node2 --hostname node2 --net mydocnetwork --ip 172.18.0.3 -p 10200:22 -p 10201:9870 -p :10202:8088 -p 10203:9000 -p 10204:16010 -p :10205:8081 -p 10206:3000 -p 10207:8042 --privileged centos:serverbase /usr/sbin/init

创建第3个节点-node3

docker run -d --name node3 --hostname node3 --net mydocnetwork --ip 172.18.0.4 -p 10300:22 -p 10301:9870 -p :10302:8088 -p 10303:9000 -p 10304:16010 -p :10305:8081 -p 10306:3000 -p 10307:8042 --privileged centos:serverbase /usr/sbin/init

修改节点root用户密码

#依次进入三个节点的容器内
docker exec -it 容器id /bin/bash

#设置root用户密码
passwd

配置hosts

#为了使节点间互相通过节点名称(主机名)来识别连通,需要在 /etc/hosts 里面配置域名解析,但由于每次重启容器都会重置 /etc/hosts ,所以需要在三个节点的 /etc/bashrc 文件里面加上如下内容,这样每次进入容器都会自动写入 /etc/hosts
#172.18.0.2、172.18.0.3、172.18.0.4分别是三个节点的ip,也即容器内部ip,可以在进入容器后通过ifconfig命令查看

# node1
result=$(cat /etc/hosts | grep ".*172.18.0.2.*node1.*")
if [[ "$result" = "" ]]
then
    echo "172.18.0.2 node1" >> /etc/hosts
fi

# node2
result=$(cat /etc/hosts | grep ".*172.18.0.3.*node2.*")
if [[ "$result" = "" ]]
then
    echo "172.18.0.3 node2" >> /etc/hosts
fi

# node3
result=$(cat /etc/hosts | grep ".*172.18.0.4.*node3.*")
if [[ "$result" = "" ]]
then
    echo "172.18.0.4 node3" >> /etc/hosts
fi

#没有ll别名的可以加上
alias ll="ls -alF"

#修改完执行
source /etc/bashrc

#为了方便xshell等软件使用节点名连接,需要在自己电脑的hosts文件里配置域名解析,Mac系统在 /etc/hosts 文件里修改,windows系统在 C:\Windows\System32\drivers\etc 文件里加上
宿主机ip node1
宿主机ip node2
宿主机ip node3

容器自启动

#设置容器开机自启动
docker update --restart=always 容器id
#关闭容器自启动
docker update --restart=no 容器id

1.4 ssh免密登录

#集群间经常需要互相访问,设置免密登录能极大方便节点间的协作。在三个节点分别执行
ssh-keygen -t rsa -b 4096
#一路回车直至结束

#在三个节点分别执行
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
#输入对应节点root用户密码即可

1.5 集群时区修改与时间同步

时区修改

#默认的centos镜像时区并不是beijing时间,因此和系统时间会有差异,需要同步时间。进入节点容器,查看时间
date
#如有差异,再查看节点服务器时区
timedatectl
#如果想把时区修改成 Asia/Shanghai
timedatectl set-timezone Asia/Shanghai
#修改完再次查看时区和时间

时间同步-chrony服务端节点设置

#chrony工具可以用一台服务器作为其他节点的server服务端来同步集群服务器时间。需要先安装chrony
yum -y install chrony
#安装完成后开启服务、设置开机自启动
systemctl start chronyd
systemctl enable chronyd

#选择一台作为server服务端的服务器(此处以节点node1为例),chrony服务端节点需要修改配置文件chrony.conf,修改两处如图2所示
vi /etc/chrony.conf

#修改完成后重启chrony服务
systemctl restart chronyd

图2:服务端配置文件chrony.conf的修改

  • allow 0.0.0.0/0 允许哪些客户端来同步本机的时间
  • local stratum 10 本机不同步任何主机的时间,本机作为时间源

docker rabbitmq 两台服务器 docker部署多台服务器_hbase_04

时间同步-chrony客户端节点设置

#在节点2、3上同样安装chrony、开启服务、设置开机自启动
#修改节点2、3上的配置文件chrony.conf,修改两处如图3所示,然后重启服务
#查看server和同步节点信息
chronyc activity
chronyc tracking

图3:客户端配置文件chrony.conf的修改

docker rabbitmq 两台服务器 docker部署多台服务器_zookeeper_05

1.6 防火墙管理

#三个节点安装防火墙
yum install firewalld firewall-config

#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

2.集群软件部署

2.1 jdk安装配置

jdk下载

jdk官方下载地址

#在3个节点创建软件安装文件夹
mkdir -p /export/server

#在node1上将下载的jdk压缩包解压
tar -zxvf jdk-8u351-linux-aarch64.tar.gz -C /export/server

#使用scp将jdk安装目录分发到node2、node3
cd /export/server
scp -r jdk1.8.0_351 node2:`pwd`/
scp -r jdk1.8.0_351 node3:`pwd`/

#在3个节点建立软链接
ln -s /export/server/jdk1.8.0_351 /export/server/jdk
#有些linux系统会自带java,删除并重建软连接
rm -f /usr/bin/java
ln -s /export/server/jdk/bin/java /usr/bin/java

配置java环境变量

#在3个节点上修改配置文件
vi /etc/profile
#在最后加上
export JAVA_HOME=/export/server/jdk
export PATH=$PATH:$JAVA_HOME/bin

#修改完保存并运行
source /etc/profile

2.2 Zookeeper集群安装

#安装wget
yum -y install wget

#node1下载Zookeeper
wget http://archive.apache.org/dist/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz

#解压
tar -zxvf apache-zookeeper-3.5.9-bin.tar.gz -C /export/server

#创建zookeeper数据存储目录
mkdir /export/server/zookeeper/data

#重命名配置文件
mv /export/server/zookeeper/conf/zoo_sample.cfg /export/server/zookeeper/conf/zoo.cfg
#修改配置文件zoo.cfg
vi /export/server/zookeeper/conf/zoo.cfg
#对应修改以下内容
tickTime=2000
dataDir=/export/server/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888

#myid的配置,创建文件myid,内容写1(node1节点写1,node2节点写2,以此类推,用于不同节点上zookeeper的标识)
vi /export/server/zookeeper/data/myid

#分发,在node1上
cd /export/server
#使用scp命令分发到节点2和3上
scp -r apache-zookeeper-3.5.9-bin node2:`pwd`/
scp -r apache-zookeeper-3.5.9-bin node3:`pwd`/

#在3个节点上创建软链接
ln -s /export/server/apache-zookeeper-3.5.9-bin /export/server/zookeeper

#node2上修改myid文件,内容写2
vi /export/server/zookeeper/data/myid
#node3上修改myid文件,内容写3
vi /export/server/zookeeper/data/myid


#启动Zookeeper
/export/server/zookeeper/bin/zkServer.sh start

#jps命令查看启动的进程,看到 QuorumPeerMain 这个进程即为启动成功
jps

#验证zookeeper是否配置成功
/export/server/zookeeper/bin/zkCli.sh
#然后在控制台输入
ls /
#出现[zookeeper]表示zookeeper配置成功

2.3 Kafka集群安装

#node1下载
wget http://archive.apache.org/dist/kafka/2.4.1/kafka_2.12-2.4.1.tgz

#解压
tar -zxvf kafka_2.12-2.4.1.tgz -C /export/server/

#修改配置文件 server.properties
vi /export/server/kafka/config/server.properties
#修改以下内容
broker.id=1
listeners=PLAINTEXT://node1:9092
log.dirs=/export/server/kafka/data
zookeeper.connect=node1:2181,node2:2181,node3:2181

#分发,在node1上
cd /export/server
#使用scp命令分发到节点2和3上
scp -r kafka_2.12-2.4.1 node2:`pwd`/
scp -r kafka_2.12-2.4.1 node3:`pwd`/

#在3个节点上创建软链接
ln -s /export/server/kafka_2.12-2.4.1 /export/server/kafka

#node2上修改配置文件 server.properties
vi /export/server/kafka/config/server.properties
#修改以下内容
broker.id=2
listeners=PLAINTEXT://node2:9092

#node3上修改配置文件 server.properties
vi /export/server/kafka/config/server.properties
#修改以下内容
broker.id=3
listeners=PLAINTEXT://node3:9092

#在3个节点上节点上启动kafka(一般选择下面的后台启动方式)
/export/server/kafka/bin/kafka-server-start.sh /export/server/kafka/config/server.properties
#如果启动报错 "Error: VM option 'UseG1GC' is experimental and must be enabled via -XX:+UnlockExperimentalVMOptions",则可修改此配置文件 /export/server/kafka/bin/kafka-run-class.sh ,如图4所示,删掉这段文字即可
vi /export/server/kafka/bin/kafka-run-class.sh

#后台运行
nohup /export/server/kafka/bin/kafka-server-start.sh /export/server/kafka/config/server.properties 2>&1 >> /export/server/kafka/kafka-server.log &

#jps命令查看启动的进程,看到Kafka这个进程即为启动成功
jps

#验证kafka是否配置成功
#在node1创建一个主题
/export/server/kafka_2.12-2.4.1/bin/kafka-topics.sh --create --zookeeper node1:2181 --replication-factor 1 --partitions 3 --topic test

#在nide1执行,启动一个模拟的数据生产者,会出现一个命令提示符,此时先不输入
/export/server/kafka_2.12-2.4.1/bin/kafka-console-producer.sh --broker-list node1:9092 --topic test

#在node2或node3执行如下命令,启动一个模拟的数据消费者
/export/server/kafka_2.12-2.4.1/bin/kafka-console-consumer.sh --bootstrap-server node1:9092 --topic test --from-beginning

#此时回到节点1随便输入内容然后回车,会在另外节点看到输出内容,表示kafka安装配置成功

图4:启动错误处理

docker rabbitmq 两台服务器 docker部署多台服务器_spark_06

2.4 Hadoop集群安装

#node1下载
wget http://archive.apache.org/dist/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz

#解压
tar -zxvf hadoop-3.3.0.tar.gz -C /export/server/

修改配置文件

#所有要修改的配置文件路径,在node1上
cd /export/server/hadoop/etc/hadoop

vi hadoop-env.sh

#在文件开始处加入以下内容:

export JAVA_HOME=/export/server/jdk
export HADOOP_HOME=/export/server/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_LOG_DIR=$HADOOP_HOME/logs/yarn
export HADOOP_LOG_DIR=$HADOOP_HOME/logs/hdfs
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 YARN_PROXYSERVER_USER=root

vi core-site.xml

#先删除文件里所有内容,然后粘贴如下内容

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://node1:8020</value>
    <description></description>
  </property>

  <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
    <description></description>
  </property>
</configuration>

vi hdfs-site.xml

#先删除文件里所有内容,然后粘贴如下内容

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
    <property>
        <name>dfs.datanode.data.dir.perm</name>
        <value>700</value>
    </property>

  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/data/nn</value>
    <description>Path on the local filesystem where the NameNode stores the namespace and transactions logs persistently.</description>
  </property>

  <property>
    <name>dfs.namenode.hosts</name>
    <value>node1,node2,node3</value>
    <description>List of permitted DataNodes.</description>
  </property>

  <property>
    <name>dfs.blocksize</name>
    <value>268435456</value>
    <description></description>
  </property>


  <property>
    <name>dfs.namenode.handler.count</name>
    <value>100</value>
    <description></description>
  </property>

  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/data/dn</value>
  </property>
</configuration>

vi mapred-env.sh

#在文件开始加入以下内容:
export JAVA_HOME=/export/server/jdk
export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1000
export HADOOP_MAPRED_ROOT_LOGGER=INFO,RFA

vi mapred-site.xml

#先删除文件里所有内容,然后粘贴如下内容

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    <description></description>
  </property>

  <property>
    <name>mapreduce.jobhistory.address</name>
    <value>node1:10020</value>
    <description></description>
  </property>


  <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>node1:19888</value>
    <description></description>
  </property>


  <property>
    <name>mapreduce.jobhistory.intermediate-done-dir</name>
    <value>/data/mr-history/tmp</value>
    <description></description>
  </property>


  <property>
    <name>mapreduce.jobhistory.done-dir</name>
    <value>/data/mr-history/done</value>
    <description></description>
  </property>
<property>
  <name>yarn.app.mapreduce.am.env</name>
  <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
<property>
  <name>mapreduce.map.env</name>
  <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
<property>
  <name>mapreduce.reduce.env</name>
  <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
</configuration>

vi yarn-env.sh

#在文件开始加入以下内容:
export JAVA_HOME=/export/server/jdk
export HADOOP_HOME=/export/server/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_LOG_DIR=$HADOOP_HOME/logs/yarn
export HADOOP_LOG_DIR=$HADOOP_HOME/logs/hdfs

vi yarn-site.xml

#先删除文件里所有内容,然后粘贴如下内容

<?xml version="1.0"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->
<configuration>

<!-- Site specific YARN configuration properties -->
<property>
    <name>yarn.log.server.url</name>
    <value>http://node1:19888/jobhistory/logs</value>
    <description></description>
</property>

  <property>
    <name>yarn.web-proxy.address</name>
    <value>node1:8089</value>
    <description>proxy server hostname and port</description>
  </property>


  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
    <description>Configuration to enable or disable log aggregation</description>
  </property>

  <property>
    <name>yarn.nodemanager.remote-app-log-dir</name>
    <value>/tmp/logs</value>
    <description>Configuration to enable or disable log aggregation</description>
  </property>


<!-- Site specific YARN configuration properties -->
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>node1</value>
    <description></description>
  </property>

  <property>
    <name>yarn.resourcemanager.scheduler.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
    <description></description>
  </property>

  <property>
    <name>yarn.nodemanager.local-dirs</name>
    <value>/data/nm-local</value>
    <description>Comma-separated list of paths on the local filesystem where intermediate data is written.</description>
  </property>


  <property>
    <name>yarn.nodemanager.log-dirs</name>
    <value>/data/nm-log</value>
    <description>Comma-separated list of paths on the local filesystem where logs are written.</description>
  </property>


  <property>
    <name>yarn.nodemanager.log.retain-seconds</name>
    <value>10800</value>
    <description>Default time (in seconds) to retain log files on the NodeManager Only applicable if log-aggregation is disabled.</description>
  </property>



  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    <description>Shuffle service that needs to be set for Map Reduce applications.</description>
  </property>
</configuration>

vi workers

#添加所有节点   
node1
node2
node3

分发到其他节点

#分发,在node1上
cd /export/server
#使用scp命令分发到节点2和3上
scp -r hadoop-3.3.0 node2:`pwd`/
scp -r hadoop-3.3.0 node3:`pwd`/

#在3个节点上创建软链接
ln -s /export/server/hadoop-3.3.0 /export/server/hadoop

在node1上创建目录

mkdir -p /data/nn
mkdir -p /data/dn
mkdir -p /data/nm-log
mkdir -p /data/nm-local

在node2和node3上创建目录

mkdir -p /data/dn
mkdir -p /data/nm-log
mkdir -p /data/nm-local

配置3个节点环境变量

#在3个节点的 /etc/profile 配置文件里加入如下内容
export HADOOP_HOME=/export/server/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

#执行使更改生效
source /etc/profile

服务启动与验证

#node1上执行,格式化NameNode
hadoop namenode -format

#node1上启动hadoop的hdfs集群
start-dfs.sh
#停止 stop-dfs.sh

#node1上启动hadoop的yarn集群
start-yarn.sh
#停止 stop-yarn.sh

#node1上启动历史服务器
mapred --daemon start historyserver
#停止 mapred --daemon start historyserver

#node1、node2、node3执行jps
jps
#看到图5所示这些进程,表示启动成功

#到浏览器中打开:http://宿主机ip:10101、http://宿主机ip:10102
#能打开表示HDFS和YARN服务正常

#验证hadoop集群的运行是否正常,在node1上
cd ~
#创建测试文件test.txt,随便填入一些内容
vi test.txt
#上传文件到HDFS中
hadoop fs -put test.txt /test.txt
#执行命令
hadoop jar /export/server/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount -Dmapred.job.queue.name=root.root /test.txt /output
#如能成功执行,计算出文本字数,表示hadoop集群安装部署成功

图5:jps进程

docker rabbitmq 两台服务器 docker部署多台服务器_hadoop_07