基于Docker的Hadoop集群安装

前情回顾

之前在搭建大数据集群的时候,一直使用的是VMware虚拟机中直接搭建集群,这样的操作需要考虑到硬件设备的综合性能。今天为大家介绍一下如何使用Docker容器中安装Hadoop集群,接下来将会为大家详细的介绍搭建的方法以及需要注意的事项。

一、准备环境
1. 安装Docker
sudo apt-get install docker
2.准备Hadoop的压缩包

在这里直接将我之前使用的tar包提供给大家:
链接:https://pan.baidu.com/s/1-S6ln7KLiYytY8qUtKYKcw 提取码:9rw9
同样的大家也可以去官网下载,这里给大家提供了所有的Hadoop版本的下载地址:
下载链接:https://archive.apache.org/dist/hadoop/common/

3.Docker去sudo

在Ubuntu下,在执行Docker时,每次都要输入sudo,解决方法就是把当前用户执行权限添加到相应的docker用户组里面。

sudo groupadd docker;// 添加一个新的docker用户组
sudo gpasswd -a username docker	//添加当前用户到docker用户组里
sudo service docker restart //重启Docker后台监护进程
docker ps 试试,如果没有实现当前运行的容器,则系统重启,则生效
sudo reboot
4.下拉镜像并运行

因为国内网络环境,镜像的获取会非常慢,尽管docker在大陆建立的镜像,但还是慢,这里可以用国内的镜像,分别有网易的蜂巢,阿里云,daocloud,其实如果你不提交镜像的话,用docker官方在境内的服务器也是可以的,我这里用了docker官方的镜像
这里永久性保留更改,修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值。
{
“registry-mirrors”: [“https://registry.docker-cn.com”]
}
修改保存后重启 Docker 以使配置生效。
然后执行

docker pull ubuntu:16.04

如果不加冒号后面的tag的话,会默然下拉lastest版本.
运行镜像(就变成的容器)

docker run -it ubuntu 
5.安装Java

此时容器已经启动,在容器中安装java

sudo add-apt-repository ppa:webupd8team/java
sodu apt-get update
apt-get install oracle-java8-installer

这里安装的是java8,当然你可以安装其他版本的java,就把oracle-java8-installer中的数字改成你所需要的安装版本型号即可。

6.安装wget,ifconfig,ping,vim

ubuntu的镜像默认只有最简单的系统,所以这些工具要自己安装,这三个工具后面都要用到.

apt-get install wget			#wget
apt-get install net-tools		#ifconfig
apt-get install iputils-ping    #ping
apt-get install vim			#你可以下载自己喜欢的编辑器,不一定是vim
二、开始构建
1.安装Hadoop

首先创建Hadoop安装目录

mkdir hadoop
2.配置环境变量

修改~/.bashrc文件。在文件末尾加入下面配置信息

export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HADOOP_HOME=/root/hadoop/hadoop-2.7.3
export HADOOP_CONFIG_HOME=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
3.配置Hadoop

这里创建了三个目录,后续配置的时候会用到:

  • tmp:作为Hadoop的临时目录
  • namenode:作为NameNode的存放目录
  • datanode:作为DataNode的存放目录
root@admin:~# cd $HADOOP_HOME/
root@admin:~/hadoop/hadoop-2.7.3# mkdir tmp
root@admin:~/hadoop/hadoop-2.7.3# mkdir namenode
root@admin:~/hadoop/hadoop-2.7.3# mkdir datanode

我们开始修改Hadoop的配置文件。主要配置core-site.xml、hdfs-site.xml、mapred-site.xml这三个文件。

root@admin:~/hadoop/hadoop-2.7.3# cd $HADOOP_CONFIG_HOME/
root@admin :~/hadoop/hadoop-2.7.3/etc/hadoop# cp mapred-site.xml.template mapred-site.xml
1. vim core-site.xml
<configuration>
    <property>
            <name>hadoop.tmp.dir</name>
            <value>/root/hadoop/hadoop-2.7.3/tmp</value>
    </property>

    <property>
            <name>fs.default.name</name>
            <value>hdfs://master:9000</value>
            <final>true</final>
    </property>
</configuration>
2.vim hdfs-site.xml配置
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
        <final>true</final>
    </property>

    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/root/hadoop/hadoop-2.8.0/namenode</value>
        <final>true</final>
    </property>

    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/root/hadoop/hadoop-2.7.3/datanode</value>
        <final>true</final>
    </property>
</configuration>

注意:
我们后续搭建集群环境时,将配置一个Master节点和两个Slave节点。所以dfs.replication配置为2。
dfs.namenode.name.dir和dfs.datanode.data.dir分别配置为之前创建的NameNode和DataNode的目录路径

3. vim mapred-site.xml配置

Hadoop安装文件中提供了一个mapred-site.xml.template,所以我们之前使用了命令cp mapred-site.xml.template mapred-site.xml,创建了一个mapred-site.xml文件。

<configuration>
    <property>
        <name>mapred.job.tracker</name>
        <value>master:9001</value>
    </property>
</configuration>

这里只有一个配置项mapred.job.tracker,我们指向master节点机器。

4.修改JAVA_HOME环境变量

使用命令vim hadoop-env.sh,修改如下配置:

export JAVA_HOME=/usr/lib/jvm/java-8-oracle
5.格式化 namenode

这是很重要的一步,执行命令hadoop namenode -format

6.安装SSH

搭建集群环境,自然少不了使用SSH。这可以实现无密码访问,访问集群机器的时候很方便。

sudo apt-get install ssh

SSH装好了以后,由于我们是Docker容器中运行,所以SSH服务不会自动启动。需要我们在容器启动以后,手动打开SSH服务。

service ssh start

注意,可能许多人会在后面的启动master时出现下面的问题.因为我在安装时参考的博客就出现了这种问题,网上各种解决方案,基本上都是安装openssh-server,和 openssh-client但是还是不行,有的还有改端口,因为ssh默认是22端口,我试了也不行.其实我上面这个命令就解决了这个问题,因为docker不会自动启动你后面安装的服务程序的,执行service ssh start就是手动打开这个服务.启动后就没有问题了.
connect to host 172.17.0.1 port 22:connection refused

7.生成密钥
cd ~/
ssh-keygen -t rsa -P '' -f ~/.ssh/id_dsa
cd .ssh
cat id_dsa.pub >> authorized_keys

注意: 这里,我的思路是直接将密钥生成后写入镜像,免得在买个容器里面再单独生成一次,还要相互拷贝公钥,比较麻烦。当然这只是学习使用,实际操作时,应该不会这么搞,因为这样所有容器的密钥都是一样的!

8.保存镜像副本

这里我们将安装好Hadoop的镜像保存为一个副本。

root@admin:~# exit
root@lacalhost:~$ docker commit -m "hadoop install" 2c241377ccdf ubuntu:hadoop

这里注意docker commit -m “注释” 容器id 镜像名:tag名

到目前为止,hadoop的安装已经结束了,下面就是完全分布式的搭建了.

三、Hadoop分布式环境搭建

因为分布式是三个或者以上的机器之间通讯,所以必须知道对方的ip地址和从属关系.但是docker容器每次结束后是不会保留之前的记录的,除非提交为镜像,所以需要每次启动容器后检查ip地址,配置hosts文件和master节点的slaves文件来确定从属关系,这里建议第一次先查看各个子节点的ip地址,以后基本上是不会变的,除非你用动态ip,或者启动顺序有变.一些博客上是手动改配置文件的,这里我写了shell文件来解决此时,只需要早启动每个容器后执行这个脚本即可,并且建议把这个脚本就写入镜像中,作为一个node镜像,下次只需要启动就行

1.vim set.sh
if [ $(hostname) == "master" ]
then
	if [ `grep "slave1" $HADOOP_CONFIG_HOME/slaves` ]
	then
		echo "slave1 has exist"
	else
		echo "slave1" >> $HADOOP_CONFIG_HOME/slaves
	fi

	if [ `grep "slave2" $HADOOP_CONFIG_HOME/slaves` ]
	then
		echo "slave2 has exist"
	else	
		echo "slave2" >> $HADOOP_CONFIG_HOME/slaves
	fi
fi

cp /etc/hosts /etc/hosts.tmp
sed -i '$d' /etc/hosts.tmp
cat /etc/hosts.tmp > /etc/hosts
rm /etc/hosts.tmp

echo -e "172.17.0.2\\tmaster\\n172.17.0.3\\tslave1\\n172.17.0.4\\tslave2" >> /etc/hosts
#这里的ip地址用你自己的,用ifconfig查看

保存后给文件加执行权限,chmod +x set.sh

2.写入镜像中
docker commit -m “add set file” f5ce7cff868d ubuntu:node
启动三个容器(相当三个虚拟机)
启动master容器, -h 是给容器设置的主机名
docker run -ti -h master ubuntu:node
启动slave1容器
docker run -ti -h slave1 ubuntu:node
启动slave2容器
docker run -ti -h slave2 ubuntu:node

在每个容器中运行./set.sh文件,

3.启动Hadoop

在master节点上执行$HADOOP_CONFIG_HOME/sbin/start-all.sh命令,启动Hadoop

master

猜你喜欢

转载自blog.csdn.net/Victory_Lei/article/details/100540351