【第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虚拟容器,分别是Master\Slave1\Slave2\Slave3(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在菩提树下】
如果,您认为阅读这篇博文让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博文,不妨点击一下左下角的【关注我】。
如果,您对我的博文所讲述的内容有兴趣,请继续关注我后续的博文。
本文版权归作者和博客园共有,欢迎转载,但未经作业同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则作者将保留追究法律责任的权利。