Docker环境下搭建Hadoop集群

非原创,转载自 https://blog.csdn.net/weixin_42051109/article/details/82744993

安装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,如下图所示


  
  
  1. zhangqingfeng@zhangqingfeng:~$ docker version
  2. Client:
  3. Version: 18.06 .1-ce
  4. API version: 1.38
  5. Go version: go1 .10 .3
  6. Git commit: e68fc7a
  7. Built: Tue Aug 21 17: 24: 56 2018
  8. OS/Arch: linux/amd64
  9. Experimental: false
  10. Server:
  11. Engine:
  12. Version: 18.06 .1-ce
  13. API version: 1.38 (minimum version 1.12)
  14. Go version: go1 .10 .3
  15. Git commit: e68fc7a
  16. Built: Tue Aug 21 17: 23: 21 2018
  17. OS/Arch: linux/amd64
  18. 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,然后输入以下代码:


  
  
  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<- 'EOF'
  3. {
  4. "registry-mirrors": [ "https://lqbkkmob.mirror.aliyuncs.com"]
  5. }
  6. EOF
  7. sudo systemctl daemon-reload
  8. 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查看是否下载成功:


  
  
  1. zhangqingfeng@zhangqingfeng:~$ docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. 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


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

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


  
  
  1. [root@Master local] # zhangqingfeng@zhangqingfeng:~$
  2. zhangqingfeng@zhangqingfeng:~$

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


  
  
  1. zhangqingfeng@zhangqingfeng:~$ docker run -it --name Slave1 -h Slave1 registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop /bin/bash
  2. [root@Slave1 local] # zhangqingfeng@zhangqingfeng:~$
  3. zhangqingfeng@zhangqingfeng:~$ docker run -it --name Slave2 -h Slave2 registry.cn-beijing.aliyuncs.com/bitnp/docker-spark-hadoop /bin/bash
  4. [root@Slave2 local] # zhangqingfeng@zhangqingfeng:~$
  5. 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


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

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


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

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


  
  
  1. [root@Master local] # yum -y install openssh-clients
  2. .......
  3. Complete!
  4. [root@Master local] # yum -y install openssh-server
  5. .......
  6. Complete!
  7. [root@Master local]

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

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


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

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


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

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


  
  
  1. [root@Master local]# /usr/sbin/sshd
  2. [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  键


  
  
  1. [root@Master local] # ssh-keygen -t rsa
  2. Generating public/ private rsa key pair.
  3. Enter file in which to save the key (/root/.ssh/id_rsa):
  4. Created directory '/root/.ssh'.
  5. Enter passphrase (empty for no passphrase):
  6. Enter same passphrase again:
  7. Your identification has been saved in /root/.ssh/id_rsa.
  8. Your public key has been saved in /root/.ssh/id_rsa.pub.
  9. The key fingerprint is:
  10. SHA256:BPC1QSB9LcIro8HoVtPSFoHMvDjMqgmdkhCoi+M167c root@Master
  11. The key's randomart image is:
  12. +---[RSA 2048]----+
  13. |. + +=+o+. |
  14. |o = ++ooo. |
  15. |++. + o+o. |
  16. |+=o=o+.. |
  17. |=+o++o S |
  18. |Oo+o |
  19. |=+. o |
  20. |o. . . |
  21. | ...E. |
  22. +----[SHA256]-----+
  23. [root@Master local]#

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


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

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


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

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


  
  
  1. [root@Master local] # ssh localhost
  2. The authenticity of host 'localhost (127.0.0.1)' can't be established.
  3. ECDSA key fingerprint is SHA256:TrBwBsvNKUoilsNryQVTpHVmBgBHLnFUuBFcQdQafJs.
  4. ECDSA key fingerprint is MD5:cb: 69: 58:d4:c0:f8: 60: 71: 4d: 5b: 59:bf: 07:d4:da:af.
  5. Are you sure you want to continue connecting (yes/no)? yes
  6. Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
  7. [root@Master ~]# logout
  8. Connection to localhost closed.
  9. [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 ,此时进入编辑模式,按照我下面所列的代码,找到它,并改成我这样


  
  
  1. Port 22
  2. PermitRootLogin yes
  3. PubkeyAuthentication yes
  4. PasswordAuthentication yes
  5. ChallengeResponseAuthentication no
  6. UsePAM yes
  7. 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) 


  
  
  1. [root@Master local] # read escape sequence
  2. zhangqingfeng@zhangqingfeng:~$ docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
  3. /Master - 172.17 .0 .2
  4. /Slave1 - 172.17 .0 .3
  5. /Slave2 - 172.17 .0 .4
  6. 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


  
  
  1. zhangqingfeng@zhangqingfeng:~$ docker attach Master
  2. [root@Master local] # vim /etc/hosts

  
  
  1. 127.0 .0 .1 localhost
  2. :: 1 localhost ip6-localhost ip6-loopback
  3. fe00:: 0 ip6-localnet
  4. ff00:: 0 ip6-mcastprefix
  5. ff02:: 1 ip6-allnodes
  6. ff02:: 2 ip6-allrouters
  7. 172.17 .0 .2 Master
  8. 172.17 .0 .3 Slave1
  9. 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 地址


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

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


  
  
  1. [root@Master local] # ssh Slave1
  2. ssh: connect to host slave1 port 22: Connection refused
  3. [root@Master local]#
  4. [root@Master local] # ssh Slave2
  5. ssh: connect to host slave1 port 22: Connection refused
  6. [root@Master local]#

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

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


  
  
  1. [root@Master local] # ssh Slave1
  2. [root@Slave1 ~]#

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


  
  
  1. [root@Master local] # ssh Slave1
  2. [root@Slave1 ~] # logout
  3. Connection to slave1 closed.
  4. [root@Master local] # ssh Slave2
  5. [root@Slave2 ~]#
  6. [root@Slave2 ~] # logout
  7. Connection to slave1 closed.
  8. [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容器界面里)


  
  
  1. [root@Master local] # find / -name hadoop-env.sh
  2. /usr/local/hadoop -2.7 .5/etc/hadoop/hadoop-env.sh
  3. [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.xml 和 yarn-site.xml 和 mapred-site.xml 及 hdfs-site.xml 文件

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


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

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


  
  
  1. <!-- Put site-specific property overrides in this file. -->
  2. <configuration>
  3. <property>
  4. <name>fs.defaultFS </name>
  5. <value>hdfs://Master:9000 </value>
  6. </property>
  7. <property>
  8. <name>io.file.buffer.size </name>
  9. <value>131072 </value>
  10. </property>
  11. <property>
  12. <name>hadoop.tmp.dir </name>
  13. <value>/usr/local/hadoop-2.7.5/tmp </value>
  14. </property>
  15. </configuration>

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

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

  
  

  
  
  1. limitations under the License. See accompanying LICENSE file.
  2. -->
  3. <configuration>
  4. <property>
  5. <name>yarn.nodemanager.aux-services </name>
  6. <value>mapreduce_shuffle </value>
  7. </property>
  8. <property>
  9. <name>yarn.resourcemanager.address </name>
  10. <value>Master:8032 </value>
  11. </property>
  12. <property>
  13. <name>yarn.resourcemanager.scheduler.address </name>
  14. <value>Master:8030 </value>
  15. </property>
  16. <property>
  17. <name>yarn.resourcemanager.resource-tracker.address </name>
  18. <value>Master:8031 </value>
  19. </property>
  20. <property>
  21. <name>yarn.resourcemanager.admin.address </name>
  22. <value>Master:8033 </value>
  23. </property>
  24. <property>
  25. <name>yarn.resourcemanager.webapp.address </name>
  26. <value>Master:8088 </value>
  27. </property>
  28. <property>
  29. <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class </name>
  30. <value>org.apache.hadoop.mapred.ShuffleHandler </value>
  31. </property>
  32. </configuration>

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

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

  
  
  1. <!-- Put site-specific property overrides in this file. -->
  2. <configuration>
  3. <property>
  4. <name>mapreduce.framework.name </name>
  5. <value>yarn </value>
  6. </property>
  7. </configuration>

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

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

  
  
  1. <!-- Put site-specific property overrides in this file. -->
  2. <configuration>
  3. <property>
  4. <name>dfs.replication </name>
  5. <value>2 </value>
  6. </property>
  7. <property>
  8. <name>dfs.namenode.name.dir </name>
  9. <value>file:/usr/local/hadoop-2.7.5/hdfs/name </value>
  10. </property>
  11. </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

  
  

  
  
  1. <!-- Put site-specific property overrides in this file. -->
  2. <configuration>
  3. <property>
  4. <name>dfs.replication </name>
  5. <value>2 </value>
  6. </property>
  7. <property>
  8. <name>dfs.datanode.data.dir </name>
  9. <value>file:/usr/local/hadoop-2.7.5/hdfs/data </value>
  10. </property>
  11. </configuration>

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


  
  
  1. [root@Master local] # ssh Slave1
  2. [root@Slave1 ~] # rm -rf /usr/local/hadoop-2.7.5/hdfs
  3. [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容器界面,代码如下:


  
  
  1. [root@Slave1 ~] # logout
  2. Connection to slave1 closed.
  3. [root@Master local] # ssh Slave2
  4. [root@Slave2 ~]#
  5. [root@Slave2 ~] # rm -rf /usr/local/hadoop-2.7.5/hdfs
  6. [root@Slave2 ~] # mkdir -p /usr/local/hadoop-2.7.5/hdfs/data
  7. [root@Slave2 ~] # logout
  8. Connection to slave1 closed.
  9. [root@Master local]#

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


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

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


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

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


  
  
  1. [root@Master local] # find / -name sbin
  2. /usr/local/sbin
  3. /usr/local/hadoop -2.7 .5/sbin
  4. /usr/local/spark -2.3 .0-bin-hadoop2 .7/sbin
  5. /usr/lib/debug/usr/sbin
  6. /usr/lib/debug/sbin
  7. /usr/sbin
  8. /sbin
  9. [root@Master local] # cd /usr/local/hadoop-2.7.5/sbin
  10. [root@Master sbin]#

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


  
  
  1. [root@Master sbin]# ./start-all.sh
  2. This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
  3. Starting namenodes on [Master]
  4. Master: starting namenode, logging to /usr/local/hadoop -2.7 .5/logs/hadoop-root-namenode-Master.out
  5. Slave1: starting datanode, logging to /usr/local/hadoop -2.7 .5/logs/hadoop-root-datanode-Slave1.out
  6. Slave2: starting datanode, logging to /usr/local/hadoop -2.7 .5/logs/hadoop-root-datanode-Slave2.out
  7. Starting secondary namenodes [ 0.0 .0 .0]
  8. 0.0 .0 .0: starting secondarynamenode, logging to /usr/local/hadoop -2.7 .5/logs/hadoop-root-secondarynamenode-Master.out
  9. starting yarn daemons
  10. starting resourcemanager, logging to /usr/local/hadoop -2.7 .5/logs/yarn--resourcemanager-Master.out
  11. Slave1: starting nodemanager, logging to /usr/local/hadoop -2.7 .5/logs/yarn-root-nodemanager-Slave1.out
  12. Slave2: starting nodemanager, logging to /usr/local/hadoop -2.7 .5/logs/yarn-root-nodemanager-Slave2.out
  13. [root@Master sbin]#

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


  
  
  1. [root@Master sbin] # jps
  2. 192 NameNode
  3. 562 ResourceManager
  4. 824 Jps
  5. 392 SecondaryNameNode
  6. [root@Master sbin]#

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

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


  
  
  1. [root@Master sbin] # ssh Slave1
  2. [root@Slave1 ~] # jps
  3. -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    ,如图所示:


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

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

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


  
  
  1. [root@Master sbin] # hadoop dfsadmin -report
  2. DEPRECATED: Use of this script to execute hdfs command is deprecated.
  3. Instead use the hdfs command for it.
  4. Configured Capacity: 982232104960 ( 914.77 GB)
  5. Present Capacity: 901762801664 ( 839.83 GB)
  6. DFS Remaining: 901762752512 ( 839.83 GB)
  7. DFS Used: 49152 ( 48 KB)
  8. DFS Used%: 0.00%
  9. Under replicated blocks: 0
  10. Blocks with corrupt replicas: 0
  11. Missing blocks: 0
  12. Missing blocks (with replication factor 1): 0
  13. -------------------------------------------------
  14. Live datanodes (2):
  15. Name: 172.17.0.3:50010 (Slave1)
  16. Hostname: Slave1
  17. Decommission Status : Normal
  18. Configured Capacity: 491116052480 (457.39 GB)
  19. DFS Used: 24576 (24 KB)
  20. Non DFS Used: 15263760384 (14.22 GB)
  21. DFS Remaining: 450881376256 (419.92 GB)
  22. DFS Used%: 0.00%
  23. DFS Remaining%: 91.81%
  24. Configured Cache Capacity: 0 (0 B)
  25. Cache Used: 0 (0 B)
  26. Cache Remaining: 0 (0 B)
  27. Cache Used%: 100.00%
  28. Cache Remaining%: 0.00%
  29. Xceivers: 1
  30. Last contact: Tue Sep 18 03:58:01 UTC 2018
  31. Name: 172.17.0.4:50010 (Slave2)
  32. Hostname: Slave2
  33. Decommission Status : Normal
  34. Configured Capacity: 491116052480 (457.39 GB)
  35. DFS Used: 24576 (24 KB)
  36. Non DFS Used: 15263760384 (14.22 GB)
  37. DFS Remaining: 450881376256 (419.92 GB)
  38. DFS Used%: 0.00%
  39. DFS Remaining%: 91.81%
  40. Configured Cache Capacity: 0 (0 B)
  41. Cache Used: 0 (0 B)
  42. Cache Remaining: 0 (0 B)
  43. Cache Used%: 100.00%
  44. Cache Remaining%: 0.00%
  45. Xceivers: 1
  46. Last contact: Tue Sep 18 03:58:01 UTC 2018
  47. [root@Master sbin]#

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

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

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


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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值