Hadoop完全分布式集群搭建
一、CentOS 7 准备
1. 配置主机名、密码
主机名和ip地址设置
10.1.75.26 hadoop1
10.1.75.27 hadoop2
10.1.75.19 hadoop3
10.1.75.32 hadoop4
10.1.75.33 hadoop5
10.1.75.40 hadoop6
vim /etc/hosts
密码统一设置为了111111
2. 免密登录
生成公匙
ssh-keygen -t rsa
配置到其他电脑的免密登录
ssh-copy-id root@hadoop1
ssh-copy-id root@hadoop2
ssh-copy-id root@hadoop3
ssh-copy-id root@hadoop4
ssh-copy-id root@hadoop5
ssh-copy-id root@hadoop6
3. 创建我的命令
mkdir /mybin
在这里存放我自己的sh脚本
添加环境变量
vim /etc/profile
在文件末尾添加
export PATH="/mybin/:$PATH"
刷新配置
source /etc/profile
4. 创建脚本命令执行
vim todo
输入命令
#!/bin/bash
if (($#==0)); then
echo "nothing to do";
exit
fi
echo --------------------$*----------------------
for i in hadoop1 hadoop2 hadoop3 hadoop4 hadoop5 hadoop6
do
echo ---------------------$i-------------------
ssh $i "$@"
done
添加可执行权限
接下来只需要输入
todo 任何命令
即可任意执行
5. 文件同步
脚本名:tongbu
#!/bin/bash
pcount=$#
if((pcount==0));then
echo "nothing to do";
exit;
fi
p1=$1 fname=`basename $p1`
echo fname=$fname
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
user=`whoami`
for i in hadoop1 hadoop2 hadoop3 hadoop4 hadoop5 hadoop6; do
echo --------------- $i ----------------
rsync -av $pdir/$fname $user@$i:$pdir
done
二、安装JDK和HADOOP环境
1. 上传软件安装包
创建目录/opt/software
和/opt/modules
mkdir /opt/software
mkdir /opt/modules
使用mobaXterm上传安装包apache-hive-3.1.3-bin.tar.gz
、hadoop-3.3.3.tar.gz
、jdk-8u11-linux-x64.tar.gz
2. 解压缩文件
tar -zxf jdk-8u11-linux-x64.tar.gz -C /opt/modules/
tar -zxvf hadoop-3.3.3.tar.gz -C /opt/modules/
3. 配置环境变量
创建配置文件
vim /etc/profile.d/my_env.sh
配置环境变量
# 配置jdk环境变量
export JAVA_HOME=/opt/modules/jdk1.8.0_11
# 配置Hadoop环境变量
export HADOOP_HOME=/opt/modules/hadoop-3.3.3
# 拼接系统 PATH 路径
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
刷新环境配置
source /etc/profile
三、Hadoop的节点分配
搭配经典HA集群,使用六台Centos进行搭建。
1. zookeeper安装
zookeeper下载
上传文件后解压
tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz -C /opt/modules
切换路径并更名
cd /opt/modules/
mv apache-zookeeper-3.8.0-bin/ zookeeper-3.8.0
配置zoo.cfg
在zoo_sample.cfg
中添加,删除原有的dataDir,然后更名为zoo.cfg
cd /opt/modules/zookeeper-3.8.0/conf
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
# zookeeper 数据路径
dataDir=/opt/modules/zookeeper-3.8.0/zkData
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888
配置myid
创建目录/opt/modules/zookeeper-3.8.0/zkData
与前面配置的路径相同,也就是配置的数据路径进行创建
cd /opt/modules/zookeeper-3.8.0/zkData
vim myid
输入与之前的id:1(同样2、3)
同步到2、3主机
复制脚本tongbu,更改为只同步到2、3机上。
cd /opt/modules/
tongbu23 zookeeper-3.8.0
修改myid为对应的2/3
ssh root@hadoop2
cd /opt/modules/zookeeper-3.8.0/zkData
vim myid
# 改为2
ssh root@hadoop3
cd /opt/modules/zookeeper-3.8.0/zkData
vim myid
# 改为3
配置环境变量ZOOKEEPER_HOME
cd /etc/profile.d
vim my_env.sh
添加环境变量
# 配置Zookeeper环境变量
# 配置jdk环境变量
export JAVA_HOME=/opt/modules/jdk1.8.0_11
# 配置Hadoop环境变量
export HADOOP_HOME=/opt/modules/hadoop-3.3.3
# 配置Zookeeper环境变量
export ZOOKEEPER_HOME=/opt/modules/zookeeper-3.8.0
# 拼接系统 PATH 路径
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_H
OME/bin
同步并刷新配置
tongbu23 /etc/profile
todo source /etc/profile
2. 配置hadoop
配置Hadoop-env.sh
cd /opt/modules/hadoop-3.3.3/etc/hadoop
vim hadoop-env.sh
添加如下
export JAVA_HOME=/opt/modules/jdk1.8.0_11
export HADOOP_CONF_DIR = /opt/modules/hadoop-3.3.3/etc/hadoop
配置core-site.xml
cd /opt/modules/hadoop-3.3.3/etc/hadoop
vim core-site.xml
更改内容
<configuration>
<!--用来指定hdfs的主节点,ns为固定属性名,表示两个namenode-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--用来指定hadoop运行时产生文件的存放目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/modules/hadoop-3.3.3/data</value>
</property>
<!--执行zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
</configuration>
3. 配置hdfs-site.xml
cd /opt/modules/hadoop-3.3.3/etc/hadoop
vim hdfs-site.xml
<configuration>
<!--执行hdfs的nameservice为ns,和core-site.xml保持一致-->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!--ns下有两个namenode,分别是nn1,nn2-->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!--nn1的RPC通信地址-->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>hadoop1:9000</value>
</property>
<!--nn1的http通信地址-->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>hadoop1:50070</value>
</property>
<!--nn2的RPC通信地址-->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>hadoop2:9000</value>
</property>
<!--nn2的http通信地址-->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>hadoop2:50070</value>
</property>
<!--指定namenode的元数据在JournalNode上的存放位置,这样,namenode2可以从jn集群里获取
最新的namenode的信息,达到热备的效果-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop4:8485;hadoop5:8485;hadoop6:8485/ns</value>
</property>
<!--指定JournalNode存放数据的位置-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/modules/hadoop-3.3.3/journal</value>
</property>
<!--开启namenode故障时自动切换-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--配置切换的实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--配置隔离机制-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!--配置隔离机制的ssh登录秘钥所在的位置-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!--配置namenode数据存放的位置,可以不配置,如果不配置,默认用的是core-site.xml里配置的hadoop.tmp.dir的路径-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///opt/modules/hadoop-3.3.3/data/namenode</value>
</property>
<!--配置datanode数据存放的位置,可以不配置,如果不配置,默认用的是core-site.xml里配置的hadoop.tmp.dir的路径-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///opt/modules/hadoop-3.3.3/data/datanode</value>
</property>
<!--配置block副本数量-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--设置hdfs的操作权限,false表示任何用户都可以在hdfs上操作文件-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
4. 配置mapred-site.xml
cd /opt/modules/hadoop-3.3.3/etc/hadoop
vim mapred-site.xml
<configuration>
<property>
<!--指定mapreduce运行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
5. 配置yarn-site.xml
cd /opt/modules/hadoop-3.3.3/etc/hadoop
vim yarn-site.xml
<configuration>
<!-- 开启YARN HA -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定两个resourcemanager的名称 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 配置rm1,rm2的主机 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop3</value>
</property>
<!--开启yarn恢复机制-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--执行rm恢复机制实现类-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 配置zookeeper的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
<description>For multiple zk services, separate them with comma</description>
</property>
<!-- 指定YARN HA的名称 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-ha</value>
</property>
<property>
<!--指定yarn的老大 resoucemanager的地址-->
<name>yarn.resourcemanager.hostname</name>
<value>hadoop1</value>
</property>
<property>
<!--NodeManager获取数据的方式-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
6. 配置 workers文件
没有就自己建,填写数据节点主机名
cd /opt/modules/hadoop-3.3.3/etc/hadoop
vim workers
hadoop4
hadoop5
hadoop6
出现问题,在hadoop2.x中,此处应该建立的是文件
slaves
,但在hadoop3.x中已经换为了workers,让我好找,出现问题就是datanode和nodemanager都不启动
7. 根据配置文件创建对应文件夹
cd /opt/modules/hadoop-3.3.3
mkdir journal
mkdir -p data/namenode data/datanode
8. 文件统一
cd /opt/modules
tongbu hadoop-3.3.3
tongbu jdk1.8.0_11
建议内网尝试?
四、Hadoop初次集群启动
1. zookeeper启动
zkServer.sh start
报错1
修正前方错误,要求zookeeper下的zoo_sample.cfg中添加配置,并且改名为zoo.cfg
原以为启动成功,使用myjps发现只有Hadoop1上成功启动,检查日志
报错2
启动的时候!需要在每台节点上启动,真的无语子
todo zkServer.sh start
2. 格式化zookeeper
todo zkServer.sh status
查看那台电脑是leader,切换到其上
ssh hadoop2
hdfs zkfc -formatZK
3. 启动journalnode集群(在4,5,6上)
ssh hadoop4
hadoop-daemon.sh start journalnode
ssh hadoop5
hadoop-daemon.sh start journalnode
ssh hadoop6
hadoop-daemon.sh start journalnode
4. 格式化hadoop1 namenode
ssh hadoop1
hdfs namenode -format
5. 启动hadoop1 上的namenode
ssh hadoop
hadoop-daemon.sh start namenode
6. 把hadoop2上的namenode节点变为standby namenode节点
ssh hadoop2
hdfs namenode -bootstrapStandby
7. 启动hadoop2上的namenode节点
ssh hadoop2
hadoop-daemon.sh start namenode
8. 启动4、5、6上的datanode
ssh hadoop4
hadoop-daemon.sh start datanode
ssh hadoop5
hadoop-daemon.sh start datanode
ssh hadoop6
hadoop-daemon.sh start datanode
9. 启动zkfc(FalioverControllerActive)
在hadoop1、hadoop2上执行
ssh hadoop1
hadoop-daemon.sh start zkfc
ssh hadoop2
hadoop-daemon.sh start zkfc
10. 在hadoop1上启动 主ResourceManger
ssh hadoop1
start-yarn.sh
报错!信息:
原因是没有添加YARN的设置路径等,在start-yarn.sh和stop-yarn.sh中添加第一行添加配置
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
为了解决类似问题还需要再start-dfs.sh和stop-dfs.sh中第一行添加配置
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_ZKFC_USER=root
11. 在hadoop3上启动副resourcemanger
ssh hadoop3
arn-daemon.sh start resourcemanager
五、后续集群集群
启动
ssh hadoop1
todo zkServer.sh start
start-all.sh
停止
ssh hadoop1
stop-all.sh
todo zkServer.sh stop
六、集群测试
1. myjps
ssh hadoop1
myjps
2. 查看namenode信息
输入网址查看standby节点数据:
Hadoop1 namenode信息 http://10.1.75.26:50070
输入 输入网址查看active节点数据:
Hadoop2 namenode信息 http://10.1.75.27:50070
3. 停掉正在运行的namenode
ssh hadoop2
hadoop-daemon.sh stop namenode
hadoop1 从standby变为active
4. 查看yarn的管理地址
输入网址查看standby节点数据:
Hadoop1 yarn信息 http://10.1.75.26:8088
此时应该不能访问hadoop3上的resourcemanager
停掉Hadoop1的yarn
ssh hadoop1
yarn-daemon.sh stop resourcemanager
此时发生自动切换