如何使用Docker搭建大数据Hadoop环境?学会这9步,快速上手

本文目的是帮助几乎从未接触过Docker和大数据Hadoop的同学,快速上手搭建Docker大数据Hadoop环境。其实Docker很简单,你可以把它想象成一个Tomcat服务器,之所以这样比喻,主要是Docker容器最佳实践场景是快速部署项目。让我们马上开始吧。

首先介绍一下环境:

本次搭建的平台是基于Windows下Vmware中安装的CentOS7虚拟机,在虚拟机中完成所有操作。本文重点在Docker和Hadoop,至于虚拟机的搭建,本文不再赘述。

操作系统:CentOS Linux release 7.5.1804

Docker版本:1.13.1

Hadoop版本:hadoop-2.6.0-cdh5.14.0.tar.gz

JDK版本:jdk-8u162-linux-x64.tar.gz

一.什么是Docker

Docker 最初是 dotCloud 公司创始人 SolomonHykes 在法国期间发起的一个公司内部项目,它是基于dotCloud 公司多年云服务技术的一次革新,用Go 语言实现,并于 2013 年 3月以Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。源码下载:https://github.com/Docker/Docker

主要功能:支持应用部署。

二、为什么要使用 Docker

更高效的利用系统资源。不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。

更快速的启动时间。由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。

一致的运行环境。不会再出现“这段代码在我机器上没问题啊” 这类问题。

持续交付和部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合持续集成(ContinuousIntegration) 系统进行集成测试。

三、容器

Docker是容器,可以理解为轻量级的虚拟机。但是这里需要明确的一个概念是,容器比虚拟机更轻量级,一个操作系统上,应该能部署上千个Docker容器,这是虚拟机无法比拟的。Docker和虚拟机对比如下:

四、三大核心概念

镜像(Image)。Docker 镜像是一个特殊的文件系统。镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。

容器(Container)。镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样。容器是镜像的一个实例。

仓库(Repository)。存储、分发镜像的服务器;一个服务器可以有多个仓库。最常使用的 Registry 公开服务是官方的 DockerHub。分发镜像的服务器=数据库服务器 仓库=数据库

五、安装Docker

1. 对于CenterOS7系统,内置Docker,可以直接安装

[root@hadoop111 ~]# yum install -y docker

复制代码

2. 启动Docker

[root@hadoop111 ~]# service docker startRedirecting to /bin/systemctl start docker.serviceJob for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

复制代码

注意:这里你可能遇到一个问题,无法启动Docker。大体上有如下两个原因:

第一,firewalld.service没有关闭。

[root@hadoop111 ~]# systemctl disable firewalld[root@hadoop111 ~]# systemctl stop firewalld

复制代码

第二,selinux没有关闭。请查看本机并关闭

[root@hadoop111 ~]# vi /etc/selinux/config

复制代码

修改SELINUX=disabled,如下

reboot重启并查看状态

[root@hadoop111 ~]# sestatus

复制代码

SELinux status: disabled

3. 启动Docker,很可能需要卸载重装Docker才能启动

[root@hadoop111 ~]# yum remove docke[root@hadoop111 ~]# yum install docker[root@hadoop111 ~]# service docker start

复制代码

六、利用Docker获取CentOS镜像,并建立一个容器

1.下载CentOS

[root@hadoop111 ~]# docker pull centos #该命令会自动下载最新版本docker官方的centos,目前是7.5

复制代码

Using default tag: latestTrying to pull repository docker.io/library/centos ... latest: Pulling from docker.io/library/centos7dc0dca2b151: Pull complete Digest: sha256:b67d21dfe609ddacf404589e04631d90a342921e81c40aeaf3391f6717fa5322Status: Downloaded newer image for docker.io/centos:latest 

2. 查看镜像

[root@hadoop111 ~]# docker images

复制代码

REPOSITORY TAG IMAGE ID CREATED SIZE

docker.io/centos latest 49f7960eb7e4 8 daysago 200 MB

3.创建容器并启动

[root@hadoop111 ~]# docker run --privileged=true -it --name=hadoop centos /bin/bash

复制代码

[root@cf869bdd4561 /]# #注意,此时你已经进入容器,你会发现root@cf869bdd4561的主机名发生变化

复制代码

4.查看容器

首先克隆一个新的窗口,新窗口连接的是虚拟机,原窗口连接的是容器

[root@hadoop111 ~]# docker ps #注意,请根据主机名判断操作的到底是容器还是虚拟机

复制代码

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

cf869bdd4561 centos "/bin/bash" 5 minutes ago Up 5 minutes hadoop

七、Docker容器中下载并安装Java

1. 下载JDK

jdk-8u162-linux-x64.tar.gz获取链接,请下载该版本或更高版本。

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

2. 上传JDK到虚拟机

3. 从虚拟机把JDK复制到Docker中

在/opt目录中创建software目录,来存放我们的安装包

[root@cf869bdd4561 /]# cd /opt #注意这里是容器的连接窗口,从这里开始,务必请读者注意操作的是虚拟机还是容器

[root@cf869bdd4561 opt]# ls

[root@cf869bdd4561 opt]# mkdir software

[root@cf869bdd4561 opt]# ls

复制代码

software

复制虚拟机中的安装包到Docker容器中 #注意这里操作的是虚拟机

[root@hadoop111 ~]# docker cp /opt/software/jdk-8u162-linux-x64.tar.gz cf869bdd4561:/opt/software

复制代码

有必要简单解释一下:89d8c85c6b03为docker容器的ID号

4. 在Docker容器中解压JDK

[root@cf869bdd4561 software]# ls

复制代码

jdk-8u162-linux-x64.tar.gz

[root@cf869bdd4561 software]# tar -zxvf jdk-8u162-linux-x64.tar.gz

复制代码

5. 添加环境变量

[root@cf869bdd4561 software]# vi /etc/profile

复制代码

添加如下内容

export JAVA_HOME=/opt/software/jdk1.8.0_162

export JRE_HOME=${JAVA_HOME}/jre

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

export PATH=${JAVA_HOME}/bin:$PATH

复制代码

6.保存退出后刷新变量

[root@cf869bdd4561 software]# source /etc/profile

复制代码

7.通过java -version测试是否生效

[root@cf869bdd4561 software]# java -versionjava version "1.8.0_162"Java(TM) SE Runtime Environment (build 1.8.0_162-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)

复制代码

八、SSH的安装以及配置

1. 通过yum 安装 SSH

[root@cf869bdd4561 software]# yum install openssh-server #出现提示,一律输入y[root@cf869bdd4561 software]#yum install openssh-clients #出现提示,一律输入y

复制代码

2. 启动sshd,但是出现错误,无法正常启动

[root@cf869bdd4561 software]# /usr/sbin/sshdCould not load host key: /etc/ssh/ssh_host_rsa_keyCould not load host key: /etc/ssh/ssh_host_ecdsa_keyCould not load host key: /etc/ssh/ssh_host_ed25519_key

复制代码

解决方法如下:

[root@cf869bdd4561 hadoop]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''

[root@cf869bdd4561 hadoop]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''

[root@cf869bdd4561 hadoop]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''

复制代码

Generating public/private dsa key pair.Your identification has been saved in /etc/ssh/ssh_host_ed25519_key.Your public key has been saved in /etc/ssh/ssh_host_ed25519_key.pub.The key fingerprint is:SHA256:vvGgz78OpXzh2appyJIHfoos8PYzfHPBJvU14In5X6o root@cf869bdd4561The key's randomart image is:+---[DSA 1024]----+| || . || + o || + o o || oSoo. . ||. . .o++o+ . ||.. o + +B.+..o ||..o.B BooO .o || oo.oO.=*+Eo |+----[SHA256]-----+

ssh-keygen 中的参数 -q 表示以quiet方式执行,也就是不输出执行情况。 -t 表示生成的host key 的类型

3. 设置root密码,并测试登陆到本机

[root@cf869bdd4561 ssh]# yum install net-tools #安装网络工具,出现提示,一律输入y

[root@cf869bdd4561 ssh]# /usr/sbin/sshd #开启sshd服务

[root@cf869bdd4561 ssh]# ps -ef|grep ssh #查看是否开启成功

[root@cf869bdd4561 ssh]# passwd root

复制代码

Changing password for user root.New password:BAD PASSWORD: The password fails the dictionary check - it does not contain enough DIFFERENT charactersRetype new password:passwd: all authentication tokens updated successfully.

4. 设置本机免密码登陆

[root@cf869bdd4561 ~]# ssh-keygen

复制代码

Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): # 按enter, 使用默认的目录和文件名Enter passphrase (empty for no passphrase): # 按enter, 使用空密码Enter same passphrase again: # 按enter, 重复密码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:c5:3b:1f:cc:07:d5:6b:e3:12:57:c2:84:a3:2e:97:32 root@f795f10ac377The key's randomart image is:+--[ RSA 2048]----+| +o. || . o.o o|| o... .o|| ..+ o = || S.o.+ * .|| E +o + . || = . . || || |+-----------------+

这时在~/.ssh/目录下就会出现公钥和私钥

[root@cf869bdd4561 .ssh]# pwd/root/.ssh

[root@cf869bdd4561 .ssh]# lsid_rsa id_rsa.pub

复制代码

创建authorized_keys文件,并把公钥复制到文件中

[root@cf869bdd4561 .ssh]# cp id_rsa.pub authorized_keys

[root@cf869bdd4561 .ssh]# ssh root@localhost #直接登录没有输入密码

复制代码

The authenticity of host 'localhost (::1)' can't be established.ECDSA key fingerprint is SHA256:Eqz14YEENUCrAShfwmT5ip+PSlhycE6iBOg93CZusL8.ECDSA key fingerprint is MD5:14:c7:1a:d2:39:e5:fd:1b:27:b6:77:8c:ae:a5:de:d4.Are you sure you want to continue connecting (yes/no)? yes #可能会需要输入yes,第二次再SSH不需要Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.[root@cf869bdd4561 ~]# exitlogoutConnection to localhost closed.

九、Hadoop安装以及配置

1. 下载Hadoop的tar包

hadoop-2.6.0-cdh5.14.0.tar.gz获取链接如下,请下载本版本或更高版本

https://www.cloudera.com/documentation/enterprise/release-notes/topics/cdh_vd_cdh_package_tarball_514.html#cm_vd_cdh_package_tarball_514

2. 上传至虚拟机

3. 复制到Docker容器中,注意这个动作是在虚拟机下

[root@hadoop111 ~]#docker cp /opt/software/hadoop-2.6.0-cdh5.14.0.tar.gzcf869bdd4561:/opt/software

复制代码

4. 解压

[root@cf869bdd4561software]# tar -zxvf hadoop-2.6.0-cdh5.14.0.tar.gz #注意,操作的是容器

复制代码

5. 添加Hadoop相关的环境变量

[root@cf869bdd4561software]# vi /etc/profile

复制代码

添加以下内容

export HADOOP_HOME=/opt/software/hadoop-2.6.0-cdh5.14.0

export PATH=${JAVA_HOME}/bin:${HADOOP_HOME}/bin:$PATH

复制代码

刷新文件

[root@cf869bdd4561 software]# source /etc/profile

复制代码

6. 修改配置文件

cd到Hadoop的配置文件路径/opt/software/hadoop-2.6.0-cdh5.14.0/etc/hadoop

[root@cf869bdd4561 hadoop]# vi core-site.xml

复制代码

添加如下内容

hadoop.tmp.dir

file:/data/hadoop/tmp

fs.defaultFS

hdfs://localhost:9000

复制代码

[root@cf869bdd4561 hadoop]# vi hdfs-site.xml

复制代码

添加如下内容

dfs.replication

1

dfs.namenode.name.dir

file:/data/hadoop/dfs/name

dfs.datanode.data.dir

file:/data/hadoop/dfs/data

复制代码

[root@cf869bdd4561 hadoop]# vi hadoop-env.sh

复制代码

添加如下内容

JAVA_HOME=/opt/software/jdk1.8.0_162

复制代码

7. 格式化namenode

[root@cf869bdd4561 hadoop]# mkdir -p /data/hadoop/tmp #创建数据存放文件

[root@cf869bdd4561 hadoop]# yum install which #如果没有which命令会影响后续的工作,所以需要安装

[root@cf869bdd4561 hadoop]# hdfs namenode -format

复制代码

8. 启动

[root@cf869bdd4561 sbin]# ./start-all.sh #创建文件,注意sbin目录没有加到环境变量下,所以需要在该目录下执行启动命令

[root@cf869bdd4561 sbin]# jps

复制代码

1457 NameNode

1570 DataNode

1955 NodeManager

1717 SecondaryNameNode

1863 ResourceManager

2254 Jps

9. 测试

[root@cf869bdd4561sbin]# hdfs dfs -mkdir /data

复制代码

18/06/1209:57:01 WARN util.NativeCodeLoader: Unable to load native-hadoop library foryour platform... using builtin-java classes where applicable

[root@cf869bdd4561sbin]# hdfs dfs -ls / #查看文件

复制代码

18/06/1209:57:08 WARN util.NativeCodeLoader: Unable to load native-hadoop library foryour platform... using builtin-java classes where applicable

Found 1 items

drwxr-xr-x - root supergroup 0 2018-06-12 09:57 /data

好了,恭喜大家,到此一个Docker下的Hadoop环境搭建完毕。

10. 为了分享给别人使用,你可以把它保存成镜像

[root@hadoop111~]# docker commit cf869bdd4561hadoopone #注意操作的是虚拟机

复制代码

下次,该镜像可以直接创建容器。你的环境真正做到了,一次搭建,到处运行。

首发网址:解放号社区

解放号社区官方公众号

推荐阅读更多精彩内容