【第1期】使用Docker虚拟化技术搭设Hadoop环境

一、Docker简介

     Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。(以上摘自“百度百科”)


二、Docker安装

2.1 Docker简介

    使用yum安装Docker最新版本,经验证,目前能安装Docker最新版本(1.10.3)为CentOS7,因此本次安装Docker的版本为CentOS7。

    配置yum源:

cd /etc/yum.repos.d
vi docker.repo
--------------文件内容-----------------------
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

    清除yum,并安装docker

yum clean all
yum install docker-engine

    直至安装成功后,设置docker开机自启动

systemctl enable docker

   默认情况下,docker新开一个容器能使用的磁盘容量为10G(未来版本不知道会不会优化这个限制)。因此,需要修改docker配置文件,使得可以使用宿主主机的所有容量。

vi /lib/systemd/system/docker.service
修改[Service]标签下的ExecStart属性值
-------------- 文件内容 -----------------
ExecStart=/usr/bin/docker daemon -H fd:// -s overlay

  重启docker服务

service docker restart

三、Hadoop镜像制作

3.1 Hadoop版本

  本次使用的Java版本为jdk-8u73-linux-x64.rpm,可在甲骨文官网下载,这里不赘述。

  本次使用的Hadoop版本为2.5.2,可在官网下载http://hadoop.apache.org/releases.html

 

  如图,下载2.5.2版本的binary包。至于source源码包,根据实际情况需要下载即可。


2.3 Hadoop集群机器配置

   本次Docker镜像预定配合的机器集群信息如图

主机描述 主机IP 主机名
Master 172.17.1.220 hadoop-master.richardchan.nom
Slave1 172.17.1.221 hadoop-slave1.richardchan.nom
Slave2 172.17.1.222 hadoop-slave2.richardchan.nom
Slave3 172.17.1.223 hadoop-slave3.richardchan.nom

2.4 镜像制作

2.4.1 获得操作系统基础镜像

  下载docker官网发布的CentOS-6.6操作系统镜像

docker pull centos:6.6

  下载完毕后,使用命令查看镜像,可以看到已经下载的镜像

docker images

  docker本身支持使用Dockerfile来制作镜像。但是由于在制作hadoop镜像过程中,需要配置ssh无密码登录。这个操作需要交互式完成。因此使用Dockerfile并无法适用我们本次制作hadoop镜像。因此,只能手工一步步来操作了。

2.4.2 启动一个新容器

  在生成docker容器来制作之前,我们需要清除,我们目前需要对外提供什么端口,环境变量是什么。因此即使在docker容器中配置了环境变量文件.profile。但由于docker的内部机制。实际上重启docker容器或又容器生成镜像时,环境变量文件并不会生效。也就是说,我们在生成docker容器的时候,就必须显示指定这些信息。  环境变量信息

变量 取值
HADOOP_COMMON_LIB_NATIVE_DIR /opt/hadoop/lib/native
HADOOP_OPTS /opt/hadoop/lib
JAVA_HOME /usr/java/jdk1.8.0_73
JAVA_BIN /usr/java/jdk1.8.0_73/bin
CLASSPATH .:/usr/java/jdk1.8.0_73/lib/dt.jar:/usr/java/jdk1.8.0_73/lib/tools.jar
HADOOP_HOME /opt/hadoop
PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/java/jdk1.8.0_73/bin:/opt/hadoop/bin

  需要开启端口 22 ,用于ssh免登录 

  使用以下命令启动一个新的容器,容器名字为hadoop-base,主机名为hadoop-base.richardchan.nom

docker run -d -it --expose=22 -e "HADOOP_COMMON_LIB_NATIVE_DIR=/opt/hadoop/lib/native" -e "HADOOP_OPTS=-Djava.library.path=/opt/hadoop/lib" -e "JAVA_HOME=/usr/java/jdk1.8.0_73" -e "JAVA_BIN=/usr/java/jdk1.8.0_73/bin" -e "CLASSPATH=.:/usr/java/jdk1.8.0_73/lib/dt.jar:/usr/java/jdk1.8.0_73/lib/tools.jar" -e "HADOOP_HOME=/opt/hadoop" -e "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/java/jdk1.8.0_73/bin:/opt/hadoop/bin" --net=none -h hadoop-base.richardchan.nom --name hadoop-base centos:6.6 /bin/bash

  分配IP地址172.17.1.211,用于在容器中使用yum来安装软件

pipework docker0 hadoop-base 172.17.1.211/16@172.17.0.1

  将准备好的java安装包和hadoop安装包上传到容器中

docker cp jdk-8u73-linux-x64.rpm hadoop-base:/opt
docker cp hadoop-2.5.2.tar.gz hadoop-base:/opt

  登录到docker容器hadoop-base

docker exec -it hadoop-base /bin/bash

  安装java

cd /opt
chmod +x /opt/jdk-8u73-linux-x64.rpm
rpm -ivh /opt/jdk-8u73-linux-x64.rpm

rm -rf /opt/jdk-8u73-linux-x64.rpm

  添加hadoop用户和用户组

groupadd hadoop
useradd hadoop -g hadoop

chown -R hadoop:hadoop /opt

 现在想要解压hadoop安装包,但是centos6.6可能未安装tar工具,这里先安装一下

yum install -y tar

  解压hadoop安装包,并修改解压后hadoop目录名(该步骤使用hadoop用户)

su hadoop   # 使用su命令由root切到hadoop用户

tar -zxvf hadoop-2.5.2.tar.gz
mv /opt/hadoop-2.5.2 /opt/hadoop

rm -rf hadoop-2.5.2.tar.gz

  安装ssh服务端和客户端(该步骤使用root用户)

exit               # 接上个步骤,使用exit即可由hadoop用户切回root用户

yum install openssh-server
yum install openssh-clients

chkconfig sshd on # 设置sshd开机自启动

  生成私钥和密钥对(该步骤使用hadoop用户)

su hadoop  # 使用su命令由root切到hadoop用户

ssh-keygen -t rsa -P ''
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

# 以下必须赋权,不然会有问题
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh

  配置sshd使用私钥公钥的认证方式(该步骤使用root用户)

exit   # 接上个步骤,使用exit可以由hadoop切回root用户

vi /etc/ssh/sshd_config
修改以下内容,即去注释即可
---------- 文件内容 ----------
RSAAuthentication yes # 启用 RSA 认证
PubkeyAuthentication yes # 启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径(和上面生成的文件同)

  重启sshd服务

service sshd restart

  以下步骤就开始配置hadoop(使用hadoop用户)

  创建目录

su hadoop   # 使用su可由root切到hadoop用户

mkdir /opt/hadoop/tmp            # hadoop临时目录
mkdir -p /opt/hdfs/namenode      # namenode目录
mkdir -p /opt/hdfs/datanode      # datanode目录

  配置core-site.xml

vi /opt/hadoop/etc/hadoop/core-site.xml

----------- 文件内容 -----------
<configuration>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/hadoop/tmp</value>
    <description>A base for other temporary directories.</description>
  </property>
  <!-- file system properties -->
  <property>
    <name>fs.default.name</name>
    <value>hdfs://hadoop-master.richardchan.nom:9000</value>
  </property>
</configuration>

  配置hdfs-site.xml

<configuration>
  <property>
    <name>dfs.replication</name> 
    <value>3</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/opt/hdfs/namenode</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/opt/hdfs/datanode</value>
  </property>
</configuration>

  配置mapreduce-site.xml。由于在hadoop2.5.2版本中,该配置文件为mapred-site.xml.template,因此需要复制一份为mapreduce-site.xml,再修改配置信息

cp /opt/hadoop/etc/hadoop/mapred-site.xml.template /opt/hadoop/etc/hadoop/mapreduce-site.xml

vi /opt/hadoop/etc/hadoop/mapreduce-site.xml
------------ 文件内容 ------------
<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>http://hadoop-master.richardchan.nom:9001</value>
  </property>
  <property>
    <name>mapreduce.framework.name</name> 
    <value>yarn</value>
  </property>
</configuration>

  配置yarn-site.xml

<configuration>
  <!-- Site specific YARN configuration properties -->
   <property>
       <name>yarn.nodemanager.aux-services</name>
       <value>mapreduce_shuffle</value>
   </property>
   <property>
       <name>yarn.resourcemanager.address</name>
       <value>hadoop-master.richardchan.nom:8032</value>
   </property>
   <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>hadoop-master.richardchan.nom:8030</value>
   </property>
   <property>
<name>yarn.resourcemanager.resource-tracker.address</name> <value>hadoop-master.richardchan.nom:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>hadoop-master.richardchan.nom:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>hadoop-master.richardchan.nom:8088</value> </property> </configuration>

  配置slaves

vi /opt/hadoop/etc/hadoop/slaves
--------- 文件内容 ---------
hadoop-slave1.richardchan.nom
hadoop-slave2.richardchan.nom
hadoop-slave3.richardchan.nom

  配置hadoop-env.sh

vi /opt/hadoop/etc/hadoop/hadoop-env.sh
------------ 文件结尾添加 ------------
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native
export HADOOP_OPTS="-Djava.library.path=${HADOOP_PREFIX}/lib"
export JAVA_HOME=/usr/java/jdk1.8.0_73

  配置yarn-env.sh

vi /opt/hadoop/etc/hadoop/hadoop-env.sh
------------ 文件结尾添加 ------------
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native
export HADOOP_OPTS="-Djava.library.path=${HADOOP_PREFIX}/lib"
export JAVA_HOME=/usr/java/jdk1.8.0_73

  到此为止,即可退出容器

exit   # 由hadoop用户切回root用户
exit   # 退出容器

2.4.3 生成hadoop-base镜像

首先生成一个简单的hadoop-base镜像

docker commit -a "Richard Chan" -m "base on Hadoop2.5.2" hadoop-base richardchan/hadoop-base

2.4.4 生成hadoop2.5.2-base镜像

  由于目前为止,如果直接richardchan/hadoop-base镜像来开启一个新的容器时,容器的sshd服务并不会自动启动(可能是docker的内部机制造成的),所以,我们需要在这个镜像的基础上用Dockerfile再进行简单的加工一下

vi Dockerfile
-------- 文件内容 --------
FROM richardchan/hadoop-base

MAINTAINER Richard Chan <545036958@qq.com>

EXPOSE 22

CMD /usr/sbin/sshd -D

  上述CMD将设置sshd的开机自动启动。

  最终生成镜像richardchan/hadoop2.5.2-base

docker build -t richardchan/hadoop2.5.2-base .

2.4.3 删除hadoop-base镜像

  生成完毕后,richardchan/hadoop-base镜像就可以删掉了。

docker rmi -f richardchan/hadoop-base

  至此,richardchan/hadoop2.5.2-base镜像制作完成。


三、使用测试

  先生成4台hadoop虚拟容器,分别是MasterSlave1Slave2Slave3(host主机信息表在此设置)

docker run -d -it --add-host hadoop-master.richardchan.nom:172.17.1.220 --add-host hadoop-slave1.richardchan.nom:172.17.1.221 --add-host hadoop-slave2.richardchan.nom:172.17.1.222 --add-host hadoop-slave3.richardchan.nom:172.17.1.223 --net=none -h hadoop-master.richardchan.nom --name hadoop-master richardchan/hadoop2.5.2-base
docker run -d -it --add-host hadoop-master.richardchan.nom:172.17.1.220 --add-host hadoop-slave1.richardchan.nom:172.17.1.221 --add-host hadoop-slave2.richardchan.nom:172.17.1.222 --add-host hadoop-slave3.richardchan.nom:172.17.1.223 --net=none -h hadoop-slave1.richardchan.nom --name hadoop-slave1 richardchan/hadoop2.5.2-base
docker run -d -it --add-host hadoop-master.richardchan.nom:172.17.1.220 --add-host hadoop-slave1.richardchan.nom:172.17.1.221 --add-host hadoop-slave2.richardchan.nom:172.17.1.222 --add-host hadoop-slave3.richardchan.nom:172.17.1.223 --net=none -h hadoop-slave2.richardchan.nom --name hadoop-slave2 richardchan/hadoop2.5.2-base
docker run -d -it --add-host hadoop-master.richardchan.nom:172.17.1.220 --add-host hadoop-slave1.richardchan.nom:172.17.1.221 --add-host hadoop-slave2.richardchan.nom:172.17.1.222 --add-host hadoop-slave3.richardchan.nom:172.17.1.223 --net=none -h hadoop-slave3.richardchan.nom --name hadoop-slave3 richardchan/hadoop2.5.2-base

  给虚拟容器分配IP地址

pipework docker0 hadoop-master 172.17.1.220/16@172.17.0.1
pipework docker0 hadoop-slave1 172.17.1.221/16@172.17.0.1
pipework docker0 hadoop-slave2 172.17.1.222/16@172.17.0.1
pipework docker0 hadoop-slave3 172.17.1.223/16@172.17.0.1

  进入master容器,分配上面生成的密钥

docker exec -it hadoop-master /bin/bash

  使用hadoop用户,直接追加公钥到authorized_keys(这里的公钥在制作容器的时候可以查看 more /home/hadoop/.ssh/id_rsa.pub 这里不赘述)

su hadoop
echo "" > ~/.ssh/authorized_keys
echo "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAu/KPnYg9Tlr9XYgDFsTLPzCJpgyEcXH08qUSJjvbIf8ZBRhqLuxoMhRxrywH6G8V/IJyLRcituYzc3CbKlnWGhtVQrdj6xENgWwy3BkYWIZ/FV13FDzcdmjRP/U6gykkOhErezukJafGFDncMP73d/Wf9YXfhvK9zuVlq9iyO4ZufeaBTUctkxHibZ/e6RzjrVxyqfgUfTYkeMFZzapHbFe7sQ+RsYSVJQMBsRselii5BSDPTh4it58O5gp6xXsGY/+a1485qKFmrGwm74/bVtAvnCAU+3oqe2s7G4GrNqiZdtHsLhxREy8LTEa6HdLd8RL0K8YPnK9RrRn2iku1Zw== hadoop@hadoop-slave1.richardchan.nom" >> ~/.ssh/authorized_keys
echo "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAu/KPnYg9Tlr9XYgDFsTLPzCJpgyEcXH08qUSJjvbIf8ZBRhqLuxoMhRxrywH6G8V/IJyLRcituYzc3CbKlnWGhtVQrdj6xENgWwy3BkYWIZ/FV13FDzcdmjRP/U6gykkOhErezukJafGFDncMP73d/Wf9YXfhvK9zuVlq9iyO4ZufeaBTUctkxHibZ/e6RzjrVxyqfgUfTYkeMFZzapHbFe7sQ+RsYSVJQMBsRselii5BSDPTh4it58O5gp6xXsGY/+a1485qKFmrGwm74/bVtAvnCAU+3oqe2s7G4GrNqiZdtHsLhxREy8LTEa6HdLd8RL0K8YPnK9RrRn2iku1Zw== hadoop@hadoop-slave2.richardchan.nom" >> ~/.ssh/authorized_keys
echo "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAu/KPnYg9Tlr9XYgDFsTLPzCJpgyEcXH08qUSJjvbIf8ZBRhqLuxoMhRxrywH6G8V/IJyLRcituYzc3CbKlnWGhtVQrdj6xENgWwy3BkYWIZ/FV13FDzcdmjRP/U6gykkOhErezukJafGFDncMP73d/Wf9YXfhvK9zuVlq9iyO4ZufeaBTUctkxHibZ/e6RzjrVxyqfgUfTYkeMFZzapHbFe7sQ+RsYSVJQMBsRselii5BSDPTh4it58O5gp6xXsGY/+a1485qKFmrGwm74/bVtAvnCAU+3oqe2s7G4GrNqiZdtHsLhxREy8LTEa6HdLd8RL0K8YPnK9RrRn2iku1Zw== hadoop@hadoop-slave3.richardchan.nom" >> ~/.ssh/authorized_keys

  对可信任的host主机进行配置(这一步在虚拟容器之间使用“ssh 主机名”后,最后生成的known_hosts,可以记录下来)

echo "" > ~/.ssh/known_hosts
chmod 644 ~/.ssh/known_hosts
echo "hadoop-master.richardchan.nom ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA81rjLgthG9fpmLr41zWhnbMe1jYWfcg7mKMKUAa9EsbFY6P2eDiXQsCRt0vjDXNHpgUN8p9Xth4mxQu/TFlqetNE9hb2jZNnbtFvoBKaVbd8zLlazixG9zbG2AGC2gtpc7PtyDOUb0GW4KyDXzWqA97i4ihvl/e7UqBHRuCNqrqLK5ez8EdtO0ZyCsAqtSaUwLTnj/hH02tjJYvf5szNzo0wPZ5dOkTFZemvIXTZWvsIFjXlW5Ny69j4lstkxzC/hOn1rNs1o9EkQK7LZM1nWJYIp28KhtlAxVkMr8QnVqagkEBKYx9EPeUpneemq7iknM/R+wPGPLQ3TrWmMAioQQ==" >> ~/.ssh/known_hosts
echo "hadoop-slave1.richardchan.nom ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA81rjLgthG9fpmLr41zWhnbMe1jYWfcg7mKMKUAa9EsbFY6P2eDiXQsCRt0vjDXNHpgUN8p9Xth4mxQu/TFlqetNE9hb2jZNnbtFvoBKaVbd8zLlazixG9zbG2AGC2gtpc7PtyDOUb0GW4KyDXzWqA97i4ihvl/e7UqBHRuCNqrqLK5ez8EdtO0ZyCsAqtSaUwLTnj/hH02tjJYvf5szNzo0wPZ5dOkTFZemvIXTZWvsIFjXlW5Ny69j4lstkxzC/hOn1rNs1o9EkQK7LZM1nWJYIp28KhtlAxVkMr8QnVqagkEBKYx9EPeUpneemq7iknM/R+wPGPLQ3TrWmMAioQQ==" >> ~/.ssh/known_hosts
echo "hadoop-slave2.richardchan.nom ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA81rjLgthG9fpmLr41zWhnbMe1jYWfcg7mKMKUAa9EsbFY6P2eDiXQsCRt0vjDXNHpgUN8p9Xth4mxQu/TFlqetNE9hb2jZNnbtFvoBKaVbd8zLlazixG9zbG2AGC2gtpc7PtyDOUb0GW4KyDXzWqA97i4ihvl/e7UqBHRuCNqrqLK5ez8EdtO0ZyCsAqtSaUwLTnj/hH02tjJYvf5szNzo0wPZ5dOkTFZemvIXTZWvsIFjXlW5Ny69j4lstkxzC/hOn1rNs1o9EkQK7LZM1nWJYIp28KhtlAxVkMr8QnVqagkEBKYx9EPeUpneemq7iknM/R+wPGPLQ3TrWmMAioQQ==" >> ~/.ssh/known_hosts
echo "hadoop-slave3.richardchan.nom ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA81rjLgthG9fpmLr41zWhnbMe1jYWfcg7mKMKUAa9EsbFY6P2eDiXQsCRt0vjDXNHpgUN8p9Xth4mxQu/TFlqetNE9hb2jZNnbtFvoBKaVbd8zLlazixG9zbG2AGC2gtpc7PtyDOUb0GW4KyDXzWqA97i4ihvl/e7UqBHRuCNqrqLK5ez8EdtO0ZyCsAqtSaUwLTnj/hH02tjJYvf5szNzo0wPZ5dOkTFZemvIXTZWvsIFjXlW5Ny69j4lstkxzC/hOn1rNs1o9EkQK7LZM1nWJYIp28KhtlAxVkMr8QnVqagkEBKYx9EPeUpneemq7iknM/R+wPGPLQ3TrWmMAioQQ==" >> ~/.ssh/known_hosts
echo "0.0.0.0 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA81rjLgthG9fpmLr41zWhnbMe1jYWfcg7mKMKUAa9EsbFY6P2eDiXQsCRt0vjDXNHpgUN8p9Xth4mxQu/TFlqetNE9hb2jZNnbtFvoBKaVbd8zLlazixG9zbG2AGC2gtpc7PtyDOUb0GW4KyDXzWqA97i4ihvl/e7UqBHRuCNqrqLK5ez8EdtO0ZyCsAqtSaUwLTnj/hH02tjJYvf5szNzo0wPZ5dOkTFZemvIXTZWvsIFjXlW5Ny69j4lstkxzC/hOn1rNs1o9EkQK7LZM1nWJYIp28KhtlAxVkMr8QnVqagkEBKYx9EPeUpneemq7iknM/R+wPGPLQ3TrWmMAioQQ==" >> ~/.ssh/known_hosts

  格式化namenode

hadoop namenode -format

  启动hadoop

/opt/hadoop/sbin/start-all.sh

 查看hadoop是否开启成功

jps -l

我是【Richard在菩提树下】

  如果,您认为阅读这篇博文让您有些收获,不妨点击一下右下角的【推荐】。

  如果,您希望更容易地发现我的新博文,不妨点击一下左下角的【关注我】。

  如果,您对我的博文所讲述的内容有兴趣,请继续关注我后续的博文。

  本文版权归作者和博客园共有,欢迎转载,但未经作业同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则作者将保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/bubi/p/5407276.html