安装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.xml 和 yarn-site.xml 和 mapred-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 保存退出
fs.defaultFS hdfs://Master:9000 io.file.buffer.size 131072 hadoop.tmp.dir /usr/local/hadoop-2.7.5/tmp
③ 进入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. -->
yarn.nodemanager.aux-services mapreduce_shuffle yarn.resourcemanager.address Master:8032 yarn.resourcemanager.scheduler.address Master:8030 yarn.resourcemanager.resource-tracker.address Master:8031 yarn.resourcemanager.admin.address Master:8033 yarn.resourcemanager.webapp.address Master:8088 yarn.nodemanager.aux-services.mapreduce.shuffle.class org.apache.hadoop.mapred.ShuffleHandler
④ 进入mapred-site.xml 进行配置,结束后保存退出
[root@Master local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/mapred-site.xml
mapreduce.framework.name yarn
⑤ 进入hdfs-site.xml 进行配置,结束后保存退出
[root@Master local]# vim /usr/local/hadoop-2.7.5/etc/hadoop/hdfs-site.xml
dfs.replication 2 dfs.namenode.name.dir file:/usr/local/hadoop-2.7.5/hdfs/name
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
dfs.replication 2 dfs.datanode.data.dir file:/usr/local/hadoop-2.7.5/hdfs/data
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