在(centos7)搭建基于docker的hadoop集群:一文中,形成了安装有vim、jdk、ssh的centos镜像,现在我们在这个的基础上继续搭建haoop。

在正式开始前,了解一些docker容器的操作命令

docker  ps:查看活动的容器

docker ps -a:查看所有的容器(包括终止状态的)

docker images:查看镜像


docker run:基于镜像新建一个容器

docker container start 容器id:启动已经终止的容器,但不会进入容器,容器在后台执行

docker container stop 容器id:终止容器

docker container rm 容器id:删除终止状态的容器

docker image rm 镜像id:删除镜像

进入容器有两个命令:attach和exec

docker attach 容器id:进入容器,使用exit退出时,容器会终止

docker exec -it 容器id  bash:进入容器,使用exit退出时,容器不会终止(推荐)

一、安装Hadoop

    以之前保存的centos/basic 镜像新建一个名为master的容器,容器中是centos系统,主机名为 master。

命令为:docker run -it -v /home/hadoop/build:/root/build -h master  --name master  centos/basic  /bin/bash

命令 中-v: 表示容器中的centos系统/root/build目录与本地/home/hadoop/build共享;方便包hadoop安装文件从本地上传到Docker内部的centos系统。


打开一个新的终端输入命令docker ps查看开启的名为master的容器


开启系统之后,我们把下载下来的Hadoop安装文件放到共享目录/home/hadoop/build下面,然后在Docker内部centos系统的/root/build目录即可获取到Hadoop安装文件;在Docker内部的Ubuntu系统安装Hadoop和本地安装一样

放好Hadoop的安装文件后,进入Docker内部centos系统的/root/build目录


解压到/usr/local目录下:tar -zxvf hadoop-2.9.0.tar.gz -C /usr/local

进入/usr/local目录下后,并将hadoop-2.9.0目录名重命名为hadoop:mv hadoop-2.9.0 hadoop

如果不是root用户登录的,还要修改hadoop文件权限

chown -R 用户名 hadoop

进入hadoop目录下,使用命令./bin/hadoop version验证是否安装成功


二、配置Hadoop

配置的这些文件都在/usr/local/hadoop/etc/hadoop/目录下

1、修改core-site.xml

<configuration>
      <property>
          <name>hadoop.tmp.dir</name>
          <value>file:/usr/local/hadoop/tmp</value>
          <description>Abase for other temporary directories.</description>
      </property>
      <property>
          <name>fs.defaultFS</name>
          <value>hdfs://master:9000</value>
      </property>
</configuration>

2、修改hdfs-site.xml

再打开hdfs-site.xml输入以下内容:

<configuration>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/namenode_dir</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/datanode_dir</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
</configuration>

3、修改mapred-site.xml

一开始mapred-site.xml并不不存在,使用命令复制cp mapred-site.xml.template mapred-site.xml得到。然后修改内容

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

4、修改yarn-site.xml

 <configuration>
  <!-- Site specific YARN configuration properties -->
      <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
      </property>
      <property>
          <name>yarn.resourcemanager.hostname</name>
          <value>master</value>
      </property>
  </configuration>

5、打开hadoop-env.sh

#假设现在/usr/local/hadoop目录下
vim ./etc/hadoop/hadoop-env.sh
# 将export JAVA_HOME=${JAVA_HOME}替换成
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/

到此配置完成了,然后将此容器保存为名为centos/hadoop镜像。新开一个终端中如图输入命令:


三、搭建基于docekr的hadoop集群

开启三个新的终端。然后基于centos/hadoop镜像,创建三个容器,容器名分别为master、slave01和slave02

命令: docker run -it -h master  --name  master  centos/hadoop  /bin/bash

            docker run -it -h slave01  --name slave01  centos/hadoop  /bin/bash

            docker run -it -h slave02  --name slave02  centos/hadoop  /bin/bash



在开启基于centos/hadoop镜像,名为master的容器前,可以先把之前基于centos/basic 镜像,名字也为master的容器终止,  然后删掉;

命令:docker container stop 容器id

          docekr container rm 容器id

然后创建基于centos/hadoop镜像,名为master的容器:

docker run -it -h master  --name master centos/hadoop  /bin/bash

最终主机中共有三个容器,分别为maste、slave01和slave02

在每个容器主机中开启ssh服务

/usr/sbin/sshd -D &

用ssh localhost 查看ssh服务是否开启成功

接着配置master,slave01和slave02的地址信息,这样他们才能找到彼此,分别打开/etc/hosts可以查看本机的ip和主机名信息,最后得到三个ip和主机地址信息如下:

172.17.0.2      master
172.17.0.3      slave01
172.17.0.4      slave02

最后把上述三个地址信息分别复制到master,slave01和slave02的/etc/hosts即可,我们可以用如下命令来检测下是否master是否可以连上slave01和slave02

ssh slave01
ssh slave02

如果出现ssh: connect to host localhost port 22: Connection refused,那么可能是ssh服务没开启

开启ssh服务:/usr/sbin/sshd -D &

ctrl+c可以退出命令。

最后打开master上的slaves文件,输入两个slave的主机名:

vim /usr/local/hadoop/etc/hadoop/slaves
# 将localhost替换成两个slave的主机名
slave01
slave02

在master终端上,首先进入/usr/local/hadoop,然后运行如下命令

cd /usr/local/hadoop
bin/hdfs namenode -format
sbin/start-all.sh

这时Hadoop集群就已经开启,我们可以在master,slave01和slave02上分别运行命令jps查看运行结果;

master节点:


slave01节点


slave02节点


问题1:

每次关机再开机后,执行start-all.sh后,namenode并没有启动。出现这个问题的主要原因是hadoop的临时文件 默认位置为${HADOOP_HOME}/tmp目录,该目录在系统开机时会自动清空,存储在里面的namenode信息也就丢失了。解决办法:

创建目录比如${HADOOP_HOME}/hadoop.tmp,并修改core-site.xml

 <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/hadoop.tmp</value>
        <description>Abase for other temporary directories.</description>

    </property>

问题2(真的很坑):There are 0 datanode(s) running and no node(s) are excluded in this operation.

centos7的防火墙是firewall,不是iptables
关闭防火墙:
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐