基于 Docker 搭建 Hadoop 分布式及 Docker 基本操作使用

Docker的介绍及安装

Docker的介绍

Docker的整个生命周期有三部分组成:镜像(image)+容器(container)+仓库(repository)简单来讲,镜像是文件,容器是进程容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件,在Docker的生命周期中,最核心的两个部分,一个是镜像 (Images),一个是容器 (Containers)。

镜像运行起来就是容器,容器服务运行的过程中,基于原始镜像做了改变,比如安装了程序,添加了文件,也可以提交回去成为新的镜像文件。docker提供了一个很简单的机制来创建镜像或更新现有的镜像。用户甚至可以从其他人那里下载一个已经做好的镜像直接使用。

基于平台

Docker CE支持Cosmic 18.10、Bionic 18.04 (LTS)、Xenial 16.04 (LTS)三个版本的Ubuntu64位系统,本文的操作系统版本为:16.04.5 LTS。

Hadoop2.7.1

Docker 20.10.7

Docker的安装

检验系统是否符合安装条件以及更新软件列表

因为Docker是基于64位的Linux系统使用的,我们首先做的第一步就是查看我们linux系统是否符合。我们可以通过如下命令来查看我们Linux系统的版本。

more /etc/os-release

linux系统版本

我们可以看到我们的linux系统版本是Xenial 16.04 (LTS)是否安装条件,如果你之前安装过Docker那就你就进行如下操作进行卸载旧版的Docker,如果之前未装老版本docker,该步骤可忽略。

sudo apt-get remove docker docker-engine docker.io containerd runc #卸载旧Docker

旧docker卸载以及查看
当你的linux系统符合安装条件,以及确认卸载或没有Docker条件下,我们通过如下命令对软件表进行更新,下图是更新成功的效果图。

sudo apt-get update

更新软件列表

如果你在更新软件列表时因网络不佳等原因 突然中断 那么当你下一次更新软件列表的你就和出现下面这个错误
更新软件列表时中断
这个错误原因是因为你上次更新时,突然中断更新,就会出现系统自动保护功能,哪怕你再次连上网或者再次更新都会显示对更新目录加锁,这个时候就要对上车更新的临时文件进行清除,然后再次更新就好了。

#这个命令就是清除更新的临时文件
sudo apt-get clean
sudo rm -rf /var/lib/apt/lists/*

如果上述方法还是不行,那么就试试强制解锁命令

sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/loc

安装Docker及测试

在上面我们对软件列表进行了更新,那是因为我们接下来要安装CA证书,因为访问Docker使用的是HTTPS协议,命令如下

 sudo apt-transport-https ca-certificates curl \
    gnupg-agent software-properties-common

同时我们为Docker添加GPG 密钥(为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥)我们加入阿里源,不要加入官方源,如果加入官方的源就会报很多奇怪的错误,加入阿里源使用如下两行命令,然后再次更新软件包

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 设置稳定版本的apt仓库地址
sudo add-apt-repository \
	"deb [arch=amd64] https://download.docker.com/linux/ubuntu/ \
	 $(lsb_release -cs) stable"
#更新软件包
sudo apt-get update

如果你已经添加过官网的源 请在/etc/apt/sources.list 最后那几行删掉并从新修改文件内容,修改后结果如下图所示

阿里源加入
验证密钥是否添加成功,结果如下图所示

sudo apt-key fingerprint 0EBFCD88 #验证密钥

验证密钥

上述操作没有问题的情况下我们就开始安装DcokerCE和containerd,在下面这个命令中它会自动安装最新的版本,如果你想指定安装版本就需要先查看Docker现有版本并进行指定版本安装。

sudo apt-get install docker-ce docker-ce-cli containerd.io  #安装Docker CE

安装Docker

对安装的Docker版本进行查看
查看
如果安装指定版本,先用如下命令进行查看现有版本,再进行安装

# 查看Docker现有版本
sudo apt-cache madison docker-ce

#对版本进行指定安装,比如你想安装18.09.0这个版本
sudo apt-get install docker-ce=18.09.0~ce~3-0~ubuntu docker-ce-cli=18.09.0~ce~3-0~ubuntu containerd.io

安装好Docker后,首先启动Docker,然后进行一个简单的尝试,比如一个经理的命令Hello-world,命令运行成功如下图所示

#启动
sudo service docker start
# Hello world 经典命令
sudo docker run hello-world

Hello World

Docker镜像构建及Hadoop集群搭建

Docker镜像构建及对现有镜像拉取

上面我们以经对Docker进行简单的操作,下面我们进行Docker镜像文件的构建,以及对数据仓库(docker hub)中的Ubuntu镜像进行拉取操作。添加用户权限-首先创建Docker用户组,然后添加当前用户到Docker用户组中,因为我们采用的是Hadoop用户登录的linux系统,在下列操作后我们注册当前登录,然后再次使用Hadoop用户登录系统。

sudo groupadd docker
sudo usermod -aG docker Hadoop

接下来就要从Docker中安装Ubuntu,采取直接从Docker上下载Ubuntu的镜像文件,之后从Docker hub上拉取Ubuntu镜像到本地,并对现有镜像进行查看命令如下:

#拉取Ubuntu镜像文件到本地
docker pull ubuntu
#对现有的镜像文件进行查看
docker images

现有images

Ubuntu中软件安装及保存成镜像文件

我们进入Docker中的Ubuntu系统,但在进入前要做一个准备工作,那就是在我们如今所在的hadoop用户下通过mkdir命令创建一个子目录build,用于向Docker内部的Ubuntu系统传输文件。并启动Ubuntu镜像

子目录

docker run -it -v /home/hadoop/build:/root/build --name ubuntu ubuntu
# docker run 表示运行一个镜像
# -it可以理解为在当前终端上与docker内部的ubuntu系统交互
#-v 表示docker内部的ubuntu系统/root/build目录与本地/home/hadoop/build共享;这可以很方便将本地文件上传到Docker内部的Ubuntu系统;
# --name ubuntu 表示Ubuntu镜像启动名称
#ubuntu 表示docker run启动的镜像文件;

刚安装好的Ubuntu系统,是一个很纯净的系统,很多软件是没有安装的,所以我们需要先更新下Ubuntu系统的源以及安装一些必备的软件。

# 更新Ubuntu系统的源
apt-get update

# 安装vim编译器
apt-get install vim

# 安装sshd(因为在开启分布式Hadoop时,需要用到ssh连接slave)
apt-get install ssh

#运行sshd服务器
/etc/init.d/ssh start

这样开启镜像时,每次都要手动sshd服务,有没有什么方法使得每次在登陆Ubuntu系统时自动启动sshd呢?

这时候你就要把sshd启动命令加入系统环境变量~/.bashrc文件中,同时配置好ssh无密码连接本地sshd服务命令如下:

ssh-keygen -t rsa #一直按回车键即可 获取密钥
cat ~/.ssh/id_rsa.pub >> authorized_keys 

把sshd加入环境变量中
因为Hadoop有用到Java,因此还需要安装JDK;直接输入以下命令来安装JDK,安装完成如图13所示

JDK安装成功
这个命令会安装比较多的库,可能耗时比较长;等这个命令运行结束之后,即安装成功;然后我们需要配置环境变量,编辑~/.bashrc文件并使之生效即可

source ~/.bashrc #环境变量生效

加入环境变量

我们在Docker内部的容器做的修改是不会自动保存到镜像的,当我们关闭后重新打开容器,之前的设置会全部消失,因此保存当前的配置是非常重要的一步, 为了达到复用配置信息,我们在每个步骤完成之后,都保存成一个新的镜像,然后开启保存的新镜像即可首先我们要到这个网址注册一个账号https://hub.docker.com/,接下来打开一个新的终端在本地的Ubuntu中输入以下命令,并输入账号密码,如下图所示

docker login 

账号密码

登录之后,在本地的Ubuntu系统查看当前运行的容器信息,可以看出,当前运行的Ubuntu镜像ID是156c89c6d818(如图16),接着在本地的Ubuntu系统把修改后的容器保存成一个新的镜像,镜像名称是ubuntu/jdkinstalled,代表着JDK安装成功的Ubuntu版本,并对现有镜像进行查看
正在运行容器

	docker login 
	#保存镜像(对容器进行打包)
	docker commit [CONTAINER ID] ubuntu/jdkinstalled 

镜像保存

现有镜像

Hadoop镜像文件配置

接下来我们开始安装Hadoop把hadoop压缩包放到目录/home/Hadoop/build 这个目录是我们本地Ubuntu与Docker的镜像交互目录

hadoop压缩包在交互目录中
启动我们前面所保存安装好JDK的镜像文件,在Docker内部对hadoop压缩包进行解压,并对解压后的hadoop文件进行改名和查看版本启动安装好的JDK的镜像文件
在对解压后的Hadoop版本进行查看时出现一个错误(图21),就是环境变量中我们下载的java和hadoop版本不匹配的问题,这个时候我仿照在非Docker容器内搭建Hadoop分布式的方法,使用在以前书中第二种安装jdk方式对jdk重新进行安装,并加入环境变量中。问题原因

apt-get install default-jre default-jdk #第二中安装JDK的方式

解决并查看hadoop版本

接下来我们配置hadoop分布式集群使用vim编译器修改/usr/local/Hadoop/etc/Hadoop目录下的配置文件hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml 这5个文件

vim etc/hadoop/hadoop-env.sh #配置hadoop-env.sh文件
vim etc/hadoop/core-site.xml #配置core-site.xml文件
vim etc/hadoop/hdfs-site.xml #配置hdfs-site.xml文件
vim etc/hadoop/mapred-site.xml #配置mapred-site.xml文件
vim etc/hadoop/yarn-site.xml #配置yarn-site.xml文件

配置hadoop-env.sh文件
core-site

hdfs-site

mapred-site
yarn-site

Hadoop集群搭建

接下来我们在本地Ubuntu系统中打开3个终端并分别运行一个容器运行刚才保存的镜像文件,分别作为hadoop的3个节点,master,slave01,slave02

# 在第一个终端中执行下面命令
docker run -it -h master --name master ubuntu/hadoopinstalled
# 在第二个终端中执行下面命令
docker run -it -h slave01 --name slave01 ubuntu/hadoopinstalled
# 在第三个终端中执行下面命令
docker run -it -h slave02 --name slave02 ubuntu/hadoopinstalled

master节点

接下来对3个节点进行IP地址的映射,使得它们互相找到对方 在/etc/hosts查看它们的IP地址(图33),然后对slave01和slave02进行尝试连接。

IP映射

ssh slave01 #连接slave01
ssh slave02 #连接slave02

这个时候出现了一个错误,这是因为ssh连接中拒绝访问 你要修改ssh的配置文件 使得它接受访问,在每一个容器节点对ssh文件的配置进行修改,并对每个节点进行密码格式化重新设置密码,保证密码是对的。

连接节点错误

passwd root # 格式化密码
vi /etc/ssh/sshd_config   # 修改ssh配置文件
/etc/init.d/ssh restart   #重启ssh

找到PermitRootLogin这一行 在它的后面修改为yes,之后重启一下重启ssh服务就可以搞定了,再次尝试连接,成功结果

ssh配置修改

各节点连接成功
但是这样我们还要每次输入密码才能进入子节点,比较麻烦,我们设置ssh免密登录

ssh-keygen #生成公钥私钥对

公钥对截图

	# 传给各个子节点
	ssh-copy-id -i ~/.ssh/id_rsa.pub slave01
	ssh-copy-id -i ~/.ssh/id_rsa.pub slave02
	

免密登录
配置master节点上的slaves文件,使得master节点启动命令时可以使得两个子节点也一起启动

配置slave文件
至此hadoop集群已经完成配置,现在我们在master对namenode进行格式化操作并启动集群同时在各个节点查看jps运行结果
格式化成功图

master节点jps

总结

当我们退出容器后一定要把容器保存成镜像文件 这样我们下次才可以方便使用,不然容器关闭再打开后就会把全部配置抹掉,(容器就想一个瓶子一样,你退出后他会把水倒空,下次进去时你需要再次添加水,但是镜像文件不一样,镜像文件是一直存在的,你也可以上传镜像文件在你申请的账号docker hub中发给别人使用,这就是docker的便捷强大之处。
\noindent\qquad Docker容器可以搭建很多东西,比如python,mysql等等,你也可以使用别人的镜像文件,比如我在上述操作中,最开始使用的ubuntu就是从镜像源中拉取过来的。

docker运作中使用的默认仓库是docker hub公共仓库,用户创建了自己的镜像之后就可以使用push命令将它上传到共有或者私有的仓库。这样下次再另外一台机器上使用这个镜像的时候只需要从仓库里面pull下来就可以了,类似于python的包一样。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值