docker环境下搭建hadoop集群(ubuntu16.04 LTS系统)

  • 我的思路是这样:

安装ubuntu系统---->下载docker---->在docker里拉取hadoop镜像---->在此镜像里创建三个容器(Master、Slave1、Slave2)---->完成完全分布式

1.   安装ubuntu系统(无论你是安装的单系统,还是用虚拟机安装了ubuntu)

       如果想安装单系统,步骤如下:

(1)  把ubuntu镜像下载到电脑桌面(版本自选)。

(2)  再把ultraiso下载到U盘,然后解压安装在U盘

   (3)  制作U盘启动工具,参考链接为:https://blog.csdn.net/yaoyut/article/details/78003061

      在“便捷启动→写入新的驱动器引导扇区“这个步骤中,如果出现设备正忙,写入引导扇区失败的错误,这时你把杀毒软件还有其他软件都关闭,然后把U盘拔下来,再插入,问题就解决了。

   (4)  重启电脑,根据自己的电脑情况进入BOIS界面(相信小伙伴们都用u盘重装过电脑,这里我就不再赘述),

这时候参考 :https://blog.csdn.net/ramse/article/details/52716937 

假如你进入BOIS界面时没有跟链接中的界面一样,那么可能是两个问题  a、制作U盘启动失败,需重新制作。  b、重启电脑时没有把u盘作为首选启动盘,这个问题百度可以搜到解决。

   2.  安装docker

参考链接为:https://blog.csdn.net/diligent_lee/article/details/79098302

 英语好的可以看这个:https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository

安装了ubuntu16.04 LTS后,并安装了docker 18.06.1-ce,如下图所示

zhangqingfeng@zhangqingfeng:~$ docker version
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:24:56 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       e68fc7a
  Built:            Tue Aug 21 17:23:21 2018
  OS/Arch:          linux/amd64
  Experimental:     false

这里你可能使用sudo docker version作为命令,如果想去掉sudo,可以参考链接:https://www.jianshu.com/p/95e397570896

3.  拉取hadoop镜像,你可以选择Docker Hub库或者阿里云库,我选的是阿里云库,它有加速器

首先应该注册:  阿里云库:https://cr.console.aliyun.com

                              Docker Hub库: https://hub.docker.com/

从阿里云库拉取hadoop镜像,当然里面不是所有镜像都管用,可以选择下载的区域,多试几次吧

我拉取的镜像是:registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop

                        和  registry.cn-hangzhou.aliyuncs.com/aofch/hadoop      选择其一即可,我接下来用的第一个镜像,因为这个镜像把我们需要的工具基本下好了,比如 jdk、hadoop、spark,省了不少事呢!

因为阿里云有加速器,你在找hadoop镜像的时候,在网页左边会有”镜像加速器“的条目,点进去会教你配置加速器。当然里面就是一段代码,你退出docker,即按下Ctrl+D,然后输入以下代码:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://lqbkkmob.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

4.  接下来就是创建容器了,并对容器进行配置及ssh的互联

a.   敲上指令docker pull registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop

zhangqingfeng@zhangqingfeng:~$ docker pull registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop

b.   经过一段时间后,镜像已经下载到本地计算机,可使用指令docker images查看是否下载成功:

zhangqingfeng@zhangqingfeng:~$ docker images
REPOSITORY                                                   TAG                 IMAGE ID            CREATED             SIZE
registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop   latest              8b768e1604ad        4 months ago        2.11GB

c.   这时,我们要在这个hadoop镜像里创建三个容器(Master、Slave1、Slave2),敲上如下指令:(我们先把三个容器创建出来,再慢慢里面添加配置)docker run -it --name Master -h Master registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop /bin/bash

zhangqingfeng@zhangqingfeng:~$ docker run -it --name Master -h Master registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop /bin/bash
[root@Master local]# 

d.   此时把Master空的容器创建出来了,当然里面什么也没配置,这时候敲上Ctrl+P+Q,会返回到初始目录,并且不会退出Master容器,假如你按下Ctrl+C,也会退出到初始目录,但是,这时候也把Master容器退出了,敲上Ctrl+P+Q后会出现下面情景,代码如下:

[root@Master local]# zhangqingfeng@zhangqingfeng:~$ 
zhangqingfeng@zhangqingfeng:~$

e.   修改一下代码的容器名,依次创建出容器Slave1和容器Slave2:

zhangqingfeng@zhangqingfeng:~$ docker run -it --name Slave1 -h Slave1 registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop /bin/bash
[root@Slave1 local]# zhangqingfeng@zhangqingfeng:~$ 
zhangqingfeng@zhangqingfeng:~$ docker run -it --name Slave2 -h Slave2 registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop /bin/bash 
[root@Slave2 local]# zhangqingfeng@zhangqingfeng:~$ 
zhangqingfeng@zhangqingfeng:~$

f.   至此,三个空容器已经创建完成,接下来我们要使用ssh把三个容器连接起来

我的docker里面空空如也,没有指令apt-get,没有指令gedit,但是里面有yum,可以用yum下载vim来编辑文件,还可以用yum下载openssh-clients,openssh-server,如果你在docker里面连yum都没有,那么你先使用Ctrl+P+Q退出,在初始目录用apt-get下载一个yum(指令是  sudo apt-get  install yum ),然后在docker里面就可以使用了。

先对Master容器进行配置,进入Master容器,敲上指令    docker attach Master

zhangqingfeng@zhangqingfeng:~$ docker attach Master
[root@Master local]# 

我们先下载vim,敲上指令  yum -y install vim

[root@Master local]# yum -y install vim
.......过程省略
Complete!
[root@Master local]# 

再把openssh-clients和openssh-server下载下来,注意按我说的顺序下载,先下openssh-clients

[root@Master local]# yum -y install openssh-clients
.......
Complete!
[root@Master local]# yum -y install openssh-server
.......
Complete!
[root@Master local]

g.  这时我们配置Master容器的ssh密钥

先执行指令  /usr/sbin/sshd,会出现下列情景

[root@Master local]# /usr/sbin/sshd
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
sshd: no hostkeys available -- exiting.

再执行指令    /usr/sbin/sshd-keygen -A  ,出现下列情景

[root@Master local]# /usr/sbin/sshd-keygen -A
/usr/sbin/sshd-keygen: line 10: /etc/rc.d/init.d/functions: No such file or directory
Generating SSH2 RSA host key: /usr/sbin/sshd-keygen: line 63: success: command not found

Generating SSH2 ECDSA host key: /usr/sbin/sshd-keygen: line 105: success: command not found

Generating SSH2 ED25519 host key: /usr/sbin/sshd-keygen: line 126: success: command not found

再次输入一遍   /usr/sbin/sshd   即可

[root@Master local]# /usr/sbin/sshd
[root@Master local]# 

上述三步必不可少,不然会出现   ssh: connect to host localhost port 22: Cannot assign requested address   等错误

这时的错误参考链接为:https://blog.csdn.net/leon_wzm/article/details/78690439?utm_source=debugrun&utm_medium=referral

然后我们就开始制作密钥了,输入指令  ssh-keygen -t rsa   ,然后都按  Enter  键

[root@Master local]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:BPC1QSB9LcIro8HoVtPSFoHMvDjMqgmdkhCoi+M167c root@Master
The key's randomart image is:
+---[RSA 2048]----+
|. + +=+o+.       |
|o  = ++ooo.      |
|++. + o+o.       |
|+=o=o+..         |
|=+o++o  S        |
|Oo+o             |
|=+. o            |
|o. . .           |
|  ...E.          |
+----[SHA256]-----+
[root@Master local]# 

生成的密钥如图所示存在  /root/.ssh/id_rsa.pub  文件中了,我们需要把密钥存储在 /root/.ssh/authorized_keys  文件中,指令是: cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys  

[root@Master local]# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
[root@Master local]#

此时,你可以使用指令   cat /root/.ssh/authorized_keys   查看authorized_keys 文件中是否有你刚才存入的密钥

[root@Master local]# cat /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCnfGoobPBQlX38ePTP88oTWeYZvaR73ADrDPTyEEX6Fy4Og4IQcd6pq5g0vjUdVxCVnes7Us+CpKvPkrqjAqDPm/oY61jplDZCzxEG45kbHl06SY8X/+Km12PsKjOKWDJzCwTs1u0EnXL1UDmFePGhv/MJNPti+hM+itNM/QWfk6ObzFjDY6sGexe3zRqi9fdZLZVNFL3PPIfS0cHdA/Vw+8FXeEfFifTwRNwOVG9rKEsL2TyhCcynn4hRJ9AFwl18GvJn5eLxuPeVVuKn8yzGpDhVvuntdGVxCcGgaWiwyb/W8mtxozXP1C5fKkM6fghj46kK9MdtR14f49Tkc5JB root@Master
[root@Master local]#

到这里,你的Master容器的ssh已经配好了,可以使用指令  ssh localhost  验证一下  ,敲上之后,需要再输入 yes,虽然有warning,但是不用管它,带回配置了  /etc/ssh/sshd_config  文件就什么警告也没了,验证完了 敲上 Ctrl+D即可断开与localhost的ssh连接

[root@Master local]# ssh localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:TrBwBsvNKUoilsNryQVTpHVmBgBHLnFUuBFcQdQafJs.
ECDSA key fingerprint is MD5:cb:69:58:d4:c0:f8:60:71:4d:5b:59:bf:07:d4:da:af.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
[root@Master ~]# logout
Connection to localhost closed.
[root@Master local]# 

为了ssh链接时的美观简洁,我们配置其/etc/ssh/sshd_config  文件,输入指令   vim  /etc/ssh/sshd_config  进入编辑文件模式,

[root@Master local]# vim /etc/ssh/sshd_config

这里如果有同学不懂 vim 的使用,可以参考链接:https://blog.csdn.net/yu870646595/article/details/52045150

进去编辑文件之后,敲上 i ,此时进入编辑模式,按照我下面所列的代码,找到它,并改成我这样

Port 22
PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
PrintLastLog no

然后按下  Esc 键,进入命令模式, 再敲上指令  :wq   退出这个编辑文件界面,回到Master容器界面

再敲上指令  vim  /etc/ssh/ssh_config   ,找到  StrictHostKeyChecking no  (大约在第35行) ,将以前的  # 去掉,并把  ask  改成  no

[root@Master local]# vim /etc/ssh/ssh_config 
StrictHostKeyChecking no

改完之后同样敲上 Esc 键,进入命令模式, 再敲上指令  :wq   退出这个编辑文件界面,回到Master容器界面

这时候按下Ctrl+P+Q,返回到初始目录,查看此时三个容器的ip地址,输入命令: docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq) 

[root@Master local]# read escape sequence    
zhangqingfeng@zhangqingfeng:~$ docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
/Master - 172.17.0.2
/Slave1 - 172.17.0.3
/Slave2 - 172.17.0.4
zhangqingfeng@zhangqingfeng:~$

然后进入Master容器(指令是docker attach Master),打开 /etc/hosts 文件,把上述内容填上,目的是给每个节点的 ip 附上名字,ssh连接的时候就可以直接  ssh Slave1,而不是 ssh 172.17.0.3 这么麻烦了,所以,我们再次敲上指令 docker attach Master  进入Master 容器 ,编辑 /etc/hosts 文件,所以敲上指令 vim /etc/hosts   ,进入编辑模式,将容器名及其对应的 ip 填入 ,修改完之后回到Master 容器,如果还有不会使用vim修改文件的小伙伴请看这个链接:https://blog.csdn.net/yu870646595/article/details/52045150

zhangqingfeng@zhangqingfeng:~$ docker attach Master
[root@Master local]# vim /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      Master
172.17.0.3      Slave1
172.17.0.4      Slave2

至此,Master 容器已经配置完成,然后我们敲上 Ctrl+P+Q  退出当前的Master容器,然后敲上 docker  attach Slave1 ,进入Slave1容器,用和Master容器相同的方法,把Slave1也配置一遍(就是从下载vim开始到配置/etc/hosts文件这几个步骤),再用相同的方式 把 Slave2 也配置完。

h.   三个容器Master、Slave1、Slave2 的配置终于接近尾声,仅差最后一步,我们需要把三个容器的每个密钥都要放在自己容器的/root/.ssh/authorized_keys  文件中,只有这样才能把三个容器的互信建立起来假如你不这样做,你在Master容器中用ssh连接其他容器(比如连接Slave1),那么它会提示你输入Slave1的密码,而这个密码你输入什么也不对

这时的错误参考链接为:https://blog.csdn.net/kunlong0909/article/details/7284174

因为每个容器的  /root/.ssh/authorized_keys  文件都需要填入 所有容器的密钥,而此时我们刚配置完Slave2容器,那么直接输入 vim  /root/.ssh/authorized_keys  ,进去文件,然后按 i 进入编辑模式,把Slave2的密钥拷贝到一个文件中(你在电脑桌面新建一个临时文件即可),保存结束,退出文件,然后Ctrl+P+Q退出Slave2容器,然后 敲上 docker attach Slave1 ,进入Slave1 容器,相同的方式把Slave1的密钥也拷贝出来,然后退出Slave1,进入Master容器,把刚才拷贝的两个密钥追加到/root/.ssh/authorized_keys 文件中(就是进入这个文件切换为编辑模式,把那两个密钥复制过来就行),然后把这个三个密钥拷贝出来,复制到Slave1的  /root/.ssh/authorized_keys  文件中,也同样复制到Slave1的  root/.ssh/authorized_keys  文件中。用到的详细指令如下:

(1)   vim /root/.ssh/authorized_keys    进去之后  按下 i ,复制密钥到一个临时新建的文件(你在桌面临时建一个就行)

(2)   按下  Esc  , 敲上   :wq    保存并退出文件, 敲上  Ctrl+P+Q  退回初始目录 ,

(3)   docker  attach  Slave1  进入Slave1容器

(4)  重复第(1)(2)步

(5)   docker  attach  Master   进入Master容器

(6)   vim /root/.ssh/authorized_keys    进去之后  按下 i ,把刚才复制的两个密钥放到到这个文件中,并把这个三个密钥临时存到一  个文件中

(7)   按下  Esc  , 敲上   :wq    保存并退出文件, 敲上  /usr/sbin/sshd   再敲上  Ctrl+P+Q  退回初始目录 ,

(8)   docker  attach  Slave1  进入Slave1容器

(9)  vim /root/.ssh/authorized_keys    进去之后  按下 i ,删除所有,把刚才复制的三个密钥放到到这个文件中

(10)  按下  Esc  , 敲上   :wq    保存并退出文件,敲上  /usr/sbin/sshd   再敲上  Ctrl+P+Q  退回初始目录

(11)docker  attach  Slave2  进入Slave2容器

(12)   vim /root/.ssh/authorized_keys    进去之后  按下 i ,删除所有,把刚才复制的三个密钥放到到这个文件中

(13)   按下  Esc  , 敲上   :wq    保存并退出文件, 敲上  Ctrl+P+Q  退回初始目录 , docker  attach  Master 进入 Master容器

敲上  /usr/sbin/sshd

在所有密钥都放入各个容器之后,我们进行验证一下,在Master容器中,我们输入指令 ssh Slave1 ,看到的情景有下面几个情况:

   如果你出现下面错误,那么你肯定没在每个容器中的 /etc/hosts  文件中输入所有的容器的名字及其对应的 ip 地址

[root@Master local]# ssh Slave1
ssh: Could not resolve hostname slave1: Name or service not known
[root@Master local]# ssh Slave2
ssh: Could not resolve hostname slave2: Name or service not known

②   假如你出现下面错误,那么你肯定没在退出每个容器前 敲上指令 /usr/sbin/sshd  ,看上述13个步骤的红字,很重要!

[root@Master local]# ssh Slave1
ssh: connect to host slave1 port 22: Connection refused
[root@Master local]#
[root@Master local]# ssh Slave2
ssh: connect to host slave1 port 22: Connection refused
[root@Master local]#

这时的错误参考链接为:https://blog.csdn.net/leon_wzm/article/details/78690439?utm_source=debugrun&utm_medium=referral

现在我们终于可以成功的验证了,现在 Master 容器中连接  Slave1 ,指令是ssh Slave1      如下图:

[root@Master local]# ssh Slave1
[root@Slave1 ~]# 

由图可知,成功了,敲上 Ctrl +D 断开与 Slave1 的连接 ,再验证与 Slave2  的连接,指令是 ssh  Slave2  ,成功后,Ctrl+D断开与 Slave2 的连接。

[root@Master local]# ssh Slave1
[root@Slave1 ~]# logout
Connection to slave1 closed.
[root@Master local]# ssh Slave2
[root@Slave2 ~]# 
[root@Slave2 ~]# logout
Connection to slave1 closed.
[root@Master local]#

③   假如你连接Slave1时,还提示了很多信息,不像我这样简洁,比如还有 LastLogin 之类的提示信息,那你肯定是每个容器vim  /etc/ssh/sshd_config    vim  /etc/ssh/ssh_config  文件的配置没有跟我的一样,在上述步骤 g 中,会有这两个文件的配置。

I.    ssh互联成功之后,我们便开始使用hadoop进行实战,但在这之前还需配置每个容器的环境变量

  首先我们查看JAVA_HOME的地址,在 hadoop-env.sh 文件中,我们并不知道这个文件的具体路径,没关系,我们只需知道它的名字,使用指令  find / -name hadoop-env.sh   搜索它即可,(注意这时候我们目前是在Master容器界面里)

[root@Master local]# find / -name hadoop-env.sh
/usr/local/hadoop-2.7.5/etc/hadoop/hadoop-env.sh
[root@Master local]# 

我们 用指令 vim /usr/local/hadoop-2.7.5/etc/hadoop/hadoop-env.sh  进入这个文件,看到JAVA_HOME这一行,记录它的路径然后退出这个文件即可:

[root@Master local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.8.0_162

在这个镜像中,JAVA_HOME路径给我们设置好了,我们需要记住这个地址,待会会在其他配置中用到。

接下来我们依次配置每个容器core-site.xmlyarn-site.xmlmapred-site.xml hdfs-site.xml 文件

   首先使用 find / -name core-site.xml 的具体路径,然后用指令  vim + 文件路径  进入这个文件

[root@Master local]# find / -name core-site.xml
/usr/local/hadoop-2.7.5/etc/hadoop/core-site.xml
[root@Master local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/core-site.xml

里面的配置改成如下图所示:然后 :wq 保存退出

<!-- Put site-specific property overrides in this file. -->
<configuration>
      <property>
          <name>fs.defaultFS</name>
          <value>hdfs://Master:9000</value>
      </property>
      <property>
         <name>io.file.buffer.size</name>
         <value>131072</value>
     </property>
     <property>
          <name>hadoop.tmp.dir</name>
          <value>/usr/local/hadoop-2.7.5/tmp</value>
     </property>
</configuration>

  进入yarn-site.xml 进行配置,结束后保存退出。

[root@Master local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/yarn-site.xml
  limitations under the License. See accompanying LICENSE file.
-->
<configuration>
     <property>
         <name>yarn.nodemanager.aux-services</name>
         <value>mapreduce_shuffle</value>
     </property>
     <property>
         <name>yarn.resourcemanager.address</name>
         <value>Master:8032</value>
     </property>
     <property>
         <name>yarn.resourcemanager.scheduler.address</name>
         <value>Master:8030</value>
     </property>
     <property>
         <name>yarn.resourcemanager.resource-tracker.address</name>
         <value>Master:8031</value>
     </property>
     <property>
         <name>yarn.resourcemanager.admin.address</name>
         <value>Master:8033</value>
     </property>
     <property>
         <name>yarn.resourcemanager.webapp.address</name>
         <value>Master:8088</value>
     </property>
     <property>
         <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
         <value>org.apache.hadoop.mapred.ShuffleHandler</value>
     </property>
</configuration>

   进入mapred-site.xml  进行配置,结束后保存退出

[root@Master local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/mapred-site.xml
<!-- Put site-specific property overrides in this file. -->
<configuration>
 <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

   进入hdfs-site.xml  进行配置,结束后保存退出

[root@Master local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/hdfs-site.xml
<!-- Put site-specific property overrides in this file. -->
<configuration>
    <property>
      <name>dfs.replication</name>
      <value>2</value>
    </property>
    <property>
      <name>dfs.namenode.name.dir</name>
      <value>file:/usr/local/hadoop-2.7.5/hdfs/name</value>
    </property>
</configuration>

J.   在步骤I 中是配置 Master 容器的环境变量,我们还需要进入Slave1容器,相同的代码把 Slave1的环境变量也配置完,当然容器slave2也是如此。唯一不同的是在步骤⑤ 的hdfs-site.xml中,Master容器设置的是namenode,而Slave1和Slave2设置的是datanode,如下图

[root@Slave1 local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/hdfs-site.xml
<!-- Put site-specific property overrides in this file. -->
<configuration>
    <property>
      <name>dfs.replication</name>
      <value>2</value>
    </property>
    <property>
      <name>dfs.datanode.data.dir</name>
      <value>file:/usr/local/hadoop-2.7.5/hdfs/data</value>
    </property>
</configuration>

K.   现在我们在Master容器中通过ssh连接Slave1(或Slave2),删除其hdfs所有目录 (这个目录就在刚才的hdfs-site.xml文件中,忘了的话你再vim打开它,把datanode保存的路径记下来,我的是 /usr/local/hadoop-2.7.5/hdfs/data) ,并重新创建,代码如下。因为下一步的格式化只能用一次,用两次的话就需要用到这一步,为了保险,我们在第一次就直接用这一步,以免不必要的麻烦。

[root@Master local]# ssh Slave1
[root@Slave1 ~]# rm -rf /usr/local/hadoop-2.7.5/hdfs
[root@Slave1 ~]# mkdir -p /usr/local/hadoop-2.7.5/hdfs/data

② 在Slave1删除并创建之后,我们 Ctrl+D 断开与Slave1的ssh连接,然后 使用指令 ssh Slave2 与Slave2容器进行连接,与Slave1相同,我们需要把hdfs目录删除,并重新创建,结束之后我们 Ctrl+D 断开与Slave2的连接,回到Master容器界面,代码如下:

[root@Slave1 ~]# logout                                          
Connection to slave1 closed.
[root@Master local]# ssh Slave2
[root@Slave2 ~]# 
[root@Slave2 ~]# rm -rf /usr/local/hadoop-2.7.5/hdfs
[root@Slave2 ~]# mkdir -p /usr/local/hadoop-2.7.5/hdfs/data
[root@Slave2 ~]# logout                                          
Connection to slave1 closed.
[root@Master local]#

③ Slave1和Slave2都已经删除并重建 hdfs 目录了,现在我们把Master容器也这么做,注意Master容器创建的是 name子文件,不再是 data 子文件里

[root@Master local]# rm -rf /usr/local/hadoop-2.7.5/hdfs
[root@Master local]# mkdir -p /usr/local/hadoop-2.7.5/hdfs/name
[root@Master local]#

L.   现在我们格式化 NameNode HDFS 目录, 在Master容器中,使用指令 hdfs namenode -format

[root@Master local]# hdfs namenode -format
..........一堆代码,此处省略
[root@Master local]#

M.   ①我们需要进入sbin 文件,来启动hadoop 集群,我们不清楚 sbin 文件的具体路径,所以我们可以使用 指令 find / -name sbin  找到路径,然后 cd +路径   进入这个路径。

[root@Master local]# find / -name sbin
/usr/local/sbin
/usr/local/hadoop-2.7.5/sbin
/usr/local/spark-2.3.0-bin-hadoop2.7/sbin
/usr/lib/debug/usr/sbin
/usr/lib/debug/sbin
/usr/sbin
/sbin
[root@Master local]# cd /usr/local/hadoop-2.7.5/sbin
[root@Master sbin]# 

②  然后我们使用指令 ./start-all.sh  来启动集群

[root@Master sbin]# ./start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
Starting namenodes on [Master]
Master: starting namenode, logging to /usr/local/hadoop-2.7.5/logs/hadoop-root-namenode-Master.out
Slave1: starting datanode, logging to /usr/local/hadoop-2.7.5/logs/hadoop-root-datanode-Slave1.out
Slave2: starting datanode, logging to /usr/local/hadoop-2.7.5/logs/hadoop-root-datanode-Slave2.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop-2.7.5/logs/hadoop-root-secondarynamenode-Master.out
starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop-2.7.5/logs/yarn--resourcemanager-Master.out
Slave1: starting nodemanager, logging to /usr/local/hadoop-2.7.5/logs/yarn-root-nodemanager-Slave1.out
Slave2: starting nodemanager, logging to /usr/local/hadoop-2.7.5/logs/yarn-root-nodemanager-Slave2.out
[root@Master sbin]#

③  使用 jps 查看 namenode 是否启动,此时看的是Master容器的namenode是否启动。

[root@Master sbin]# jps
192 NameNode
562 ResourceManager
824 Jps
392 SecondaryNameNode
[root@Master sbin]#

④  这里我们可以使用  ssh Slave1  (或ssh Slave2)进入Slave1容器,然后使用指令  jps  查看datanode是否启动,此时会出现

-bash: jps: command not found 错误,如图:

[root@Master sbin]# ssh Slave1
[root@Slave1 ~]# jps
-bash: jps: command not found

这时我们需要配置 /etc/profile文件,每个容器(包括Master、Slave1、Slave2)都需要配置这个文件,使用指令  vim /etc/profile,末尾添加代码 :

export JAVA_HOME=/usr/local/jdk1.8.0_162
export HADOOP_HOME=/usr/local/hadoop-2.7.5
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

保存退出后,执行生效刚才的 /etc/profile 文件,即使用指令 source /etc/profile    ,如图所示:

[root@Master local]# vim /etc/profile
....进入之后末尾添加下列代码(根据自己的实际配置填写,比如java版本可能每个人都不一样)
export JAVA_HOME=/usr/local/jdk1.8.0_162
export HADOOP_HOME=/usr/local/hadoop-2.7.5
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
.....保存退出后

[root@Master local]# source /etc/profile

每个容器都配置结束后,我们再通过ssh进入其他容器,便可以使用  jps hadoop fs xx 指令了。

⑤ 我们可以使用指令 hadoop dfsadmin -report   查看其他容器有没有启动

[root@Master sbin]# hadoop dfsadmin -report
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

Configured Capacity: 982232104960 (914.77 GB)
Present Capacity: 901762801664 (839.83 GB)
DFS Remaining: 901762752512 (839.83 GB)
DFS Used: 49152 (48 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0

-------------------------------------------------
Live datanodes (2):

Name: 172.17.0.3:50010 (Slave1)
Hostname: Slave1
Decommission Status : Normal
Configured Capacity: 491116052480 (457.39 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 15263760384 (14.22 GB)
DFS Remaining: 450881376256 (419.92 GB)
DFS Used%: 0.00%
DFS Remaining%: 91.81%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Tue Sep 18 03:58:01 UTC 2018

Name: 172.17.0.4:50010 (Slave2)
Hostname: Slave2
Decommission Status : Normal
Configured Capacity: 491116052480 (457.39 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 15263760384 (14.22 GB)
DFS Remaining: 450881376256 (419.92 GB)
DFS Used%: 0.00%
DFS Remaining%: 91.81%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Tue Sep 18 03:58:01 UTC 2018


[root@Master sbin]#

到此,我们的docker环境下的hadoop集群已经搭建成功!

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

最后,我想奉上在搭建过程中用到的命令

0. 重启docker服务
sudo service docker restart
1.查看所有容器的ip
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq
2. 拉取一个镜像
docker pull <镜像名称>
3. 查看所有镜像
docker images
5. 查看正在运行的容器
docker ps
6. 查看所有容器(包括正在运行和不在运行的容器)
docker ps -a
7. 在镜像里创建一个容器并以前台交互模式启动它
docker run -it --name <容器名> -h <容器名> <镜像名字> /bin/bash
8. 退出容器,但不关闭它(关闭之后还得启动,并且设置的/etc/hosts内容都没有了)
Ctrl+P+Q
9. 再次进入容器 
docker attach <容器名>
10. 在容器内下载插件(使用yum)
yum -y install <插件名>
11. 在容器内删除插件(使用yum)
yum remove <插件名>
12. 查找文件的路径
find / -name <文件名>
13. 进入文件
cd <文件路径>
14. 容器内编辑文件(使用vim)
vim <文件路径>    -----打开文件
i                 -----切换到编辑模式
Esc               -----切换到命令模式
$                 -----移到本行的最后
/关键字           -----查找字符
dd                -----删除光标所在行
:q                -----不保存退出
:wq               -----保存退出

本文参考链接还有:https://blog.csdn.net/Leafage_M/article/details/72633408

                                    https://www.jianshu.com/p/3d5cc7165c15

                                    https://blog.csdn.net/u013548453/article/details/80936027

  • 10
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 30
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值