前言

在上一篇博客从零开始准备了一台hadoop的机器

准备工作

域名映射

docker exec -it hadoop1 bash
docker exec -it hadoop2 bash
docker exec -it hadoop3 bash

分别进入三台机器vim /etc/hosts添加如下的域名映射

172.17.0.2      master
172.17.0.3      slave1
172.17.0.4      slave2

添加完成后可以用域名互相ping一下,确保能ping通再进行下一步。

ping master
ping slave1
ping slave2

免密配置

先在master启动ssh/etc/init.d/ssh start接着ssh-keygen三次回车生成密钥,然后将公钥保持到信任的keys中cat ~/.ssh/id_rsa.pub > authorized_keys
另外两台重复这个操作,这样一来三个节点都各自有个authorized_keys文件,接下来要将这三个文件合并起来,尽量避免windows的编辑而采用cp、cat来实现:
首先将三台机器的keys拿出来

docker cp hadoop1:/root/.ssh/authorized_keys ./authorized_keys_1
docker cp hadoop2:/root/.ssh/authorized_keys ./authorized_keys_2
docker cp hadoop3:/root/.ssh/authorized_keys ./authorized_keys_3

再将三个文件合并为authorized_keys
cat authorized_keys_1 authorized_keys_2 authorized_keys_3 > authorized_keys
可以查看新生成的文件,包含了三台机器的公钥
在这里插入图片描述
然后将新生成的authorized_keys文件复制回三个节点

docker cp ./authorized_keys hadoop1:/root/.ssh/authorized_keys
docker cp ./authorized_keys hadoop2:/root/.ssh/authorized_keys
docker cp ./authorized_keys hadoop3:/root/.ssh/authorized_keys

一定不要忘记检查authorized_keys所属组和权限,因为linux和mac复制文件到容器中的权限可能不符合要求。
分别进入三台节点chown root:root /root/.ssh/authorized_keyschmod 400 /root/.ssh/authorized_keys
确保每台机器的权限、拥有者、所属组如此即可
在这里插入图片描述
最后就可以通过ssh免密登陆主机了,在三台机器分别执行如下指令,确保互相之间都能够免密登陆。

ssh master
ssh slave1
ssh slave2

两个常用脚本

为了便于之后的操作,在master节点的/bin/中写如两个脚本vim /bin/xcallvim /bin/xsync,并增加课执行权限chmod u+x /bin/xcallchmod u+x /bin/xsync

  • xcall
#!/bin/bash
if [ $# -lt 1 ]
        then
                echo "There is no commond to excute!"
                exit
fi

LOGIN_USER_NAME=`whoami`

for CLU_HOSTS in master slave1 slave2
do
        echo "----------------$CLU_HOSTS-------------------"
        ssh $LOGIN_USER_NAME@$CLU_HOSTS $*
done
  • xsync
#!/bin/bash
if [ $# -lt 1 ]
        then
                echo "There is no file to send!"
                exit
fi

P=$1

FILE_NAME=`basename $P`
FILE_PATH=`dirname $P`
DIR_PATH=`cd -P $FILE_PATH;pwd`

LOGIN_USER_NAME=`whoami`

for CLU_HOSTS in slave1 slave2
do
        echo "------------------$CLU_HOSTS-----------------------"
        rsync -rlv $DIR_PATH/$FILE_NAME $LOGIN_USER_NAME@$CLU_HOSTS:$DIR_PATH
done

关于脚本的编写,具体可以看这篇文章https://blog.csdn.net/weixin_44112790/article/details/86933415

搭配使用JPS

1.首先创建软连接
ln -s /opt/modules/jdk1.8.0_144/bin/jps /usr/local/bin/jps
在这里插入图片描述
2.用刚刚编写的xsync分发
xsync /usr/local/bin/jps
在这里插入图片描述
3.测试一下xcall以及jps
xcall jps
在这里插入图片描述

hadoop配置

完成了所有的准备工作,终于可以开始hadoop的配置了
首先检查一下java和hadoop的环境变量是否正确,不正确的话刷新一下环境变量source /etc/profile,然后进入hadoop的配置目录cd /opt/modules/hadoop-2.7.2/etc/hadoop/修改配置文件

hdfs相关

在文件的config中添加如下内容

  • core-site.xml
  				<!-- 指定 HDFS 中 NameNode 的地址 -->
                <property>
                        <name>fs.defaultFS</name>
                        <value>hdfs://master:9000</value>
                </property>
                <!-- 指定 hadoop 运行时产生文件的存储目录 -->
                <property>
                        <name>hadoop.tmp.dir</name>
                        <value>/opt/modules/hadoop-2.7.2/data/tmp</value>
                </property>
  • hdfs-site.xml
  				<!-- 副本数量  -->
                <property>
                        <name>dfs.replication</name>
                        <value>3</value>
                </property>
                <!-- 辅助名称结点 -->
                <property>
                        <name>dfs.namenode.secondary.http-address</name>
                        <value>slave2:50090</value>
                </property>
  • 指定从节点vim slaves
master
slave1
slave2
  • 环境变量
    vim hadoop-env.sh修改JAVA_HOME
export JAVA_HOME=/opt/modules/jdk1.8.0_144

mapreduce

mv mapred-site.xml.template mapred-site.xml重命名一下
vim mapred-site.xml添加如下内容

        <!-- 指定 mr 运行在 yarn 上 -->
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
  • 环境变量
    vim mapred-env.sh修改JAVA_HOME
export JAVA_HOME=/opt/modules/jdk1.8.0_144

yarn

vim yarn-site.xml修改yarn-site.xml

 		<property>
                <name>yarn.resourcemanager.hostname</name>
                <value>slave1</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
         <property>
                 <name>yarn.resourcemanager.webapp.address</name>
                 <value>172.17.0.3:8088</value>
         </property>
  • 环境变量
    vim hadoop-env.sh修改JAVA_HOME
export JAVA_HOME=/opt/modules/jdk1.8.0_144

分发文件

xsync /opt/modules/hadoop-2.7.2/etc/hadoop/分发刚刚修改的文件,然后查看一下xcall cat /opt/modules/hadoop-2.7.2/etc/hadoop/core-site.xml可以发现三个节点的配置文件都已经更新。

准备启动

格式化

hdfs namenode -format一定要注意这一步的操作用户,我之前都是root,这里也是root操作

启动

由于ResourceManager不再master不能通过start-all.sh,否则ResourceManager无法启动,在mater通过start-dfs.sh在slave1通过start-yarn.sh分别启动hdfs和yarn
xcall jps可以看到集群按规划启动了相应的服务
在这里插入图片描述

web访问

我的是win10情况比较复杂,docker是先在win10中虚拟了linux再中虚拟的linux中允许docker;如果是mac或者linux情况就比较简单。
docker-machine ip default查看虚拟linux的ip,一般是192.168.99.100,windows直接能访问这个ip
在这里插入图片描述
Oracle VM VirtualBox只能将我win10的端口映射到192.168.99.100的端口即装有docke的虚拟linux中,不能直接映射到docker创建的容器中。
在这里插入图片描述
直接通过192.168.99.100:50070可以访问hdfs的web界面,192.168.99.100:8088可以访问yarn的web界面。

初始化脚本

由于docker的容器重启会关闭ssh以及清除掉hosts,导致集群无法正常运行。我编写了一个脚本来解决这个问题。
在master节点中vim /usr/local/bin/node_init.sh,对于不同的节点,修改追加的ip和host即可

#!/bin/bash
echo "172.17.0.3      slave1" >> /etc/hosts
echo "172.17.0.4      slave2" >> /etc/hosts
/etc/init.d/ssh start
exit 0

记得添加可执行权限chmod u+x /usr/local/bin/node_init.sh
node_init.sh就可以直接运行,但是容器中的ubuntu不能设置开机自启动,只能每次自己手动初始化如下

docker exec -d hadoop1 node_init.sh
docker exec -d hadoop2 node_init.sh
docker exec -d hadoop3 node_init.sh
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐