基于Docker的Hadoop完全分布式安装

8 篇文章 0 订阅
7 篇文章 0 订阅

之前安装Hadoop是用VMWare创建虚拟机,然后安装伪分布式,因为虚拟机太慢,太卡,实在没有玩下去的心情了,现在想到Docker可以实现虚拟化,看看能不能安装Hadoop,网上查了查,果然可以,并且博客还不少,但都是有些小问题,并且过程不详细,没有问题解决的答案,在我踩了好多坑后,现在记录一下我在基于Docker的Hadoop完全分布式安装时的过程和遇到的问题,希望能帮到后来的童鞋.

首先,Docker是啥

我也解释不清,不要怼我,因为我只是了解了一小部分,只是会用而已,据说很牛逼,其实就是个基于Linux文件系统的虚拟化软件,基础是 Linux 容器(LXC)等技术,可以虚拟出一套独立于宿主机环境的开发环境(命名空间).如果你想具体了解请自行百度,一般云计算,运维都会学docker的,这里只要会用就行.

安装docker

sudo apt-get install docker

我这里是ubuntu16.04,不同的环境可能还要安装其他软件,请自行百度.对于linux的用户,直接install docker就行,其他的软件依赖会显示的,你在安装即可.这一步一般不会有问题的.

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

下拉镜像并运行

因为国内网络环境,镜像的获取会非常慢,尽管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 

安装java

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

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

我这里安装的是java8,当然你可以安装其他版本的java,就把oracle-java8-installer中的数字改改就行.

安装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

安装Hadoop

首先创建Hadoop安装目录,

mkdir hadoop

下载Hadoop

wget http://archive.apache.org/dist/hadoop/common/hadoop-2.8.3/hadoop-2.8.3.tar.gz
tar -xvzf hadoop-2.6.0.tar.gz

当然你可以安装其他版本的Hadoop,官网下载地址,这里注意下载地址,这里我给了官网的地址,下载地址在网页中,有可能你会下载的是网页页面,用file filename这个命令查查,我当时就在这里出错了.

配置环境变量

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

export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HADOOP_HOME=/root/hadoop/hadoop-2.8.0
export HADOOP_CONFIG_HOME=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

配置Hadoop

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

tmp:作为Hadoop的临时目录
namenode:作为NameNode的存放目录
datanode:作为DataNode的存放目录

root@2c241377ccdf:~# cd $HADOOP_HOME/
root@2c241377ccdf:~/hadoop/hadoop-2.8.0# mkdir tmp
root@2c241377ccdf:~/hadoop/hadoop-2.8.0# mkdir namenode
root@2c241377ccdf:~/hadoop/hadoop-2.8.0# mkdir datanode

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

root@2c241377ccdf :~/hadoop/hadoop-2.8.0# cd $HADOOP_CONFIG_HOME/
root@2c241377ccdf :~/hadoop/hadoop-2.8.0/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.8.0/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.8.0/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节点机器。

修改JAVA_HOME环境变量

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

export JAVA_HOME=/usr/lib/jvm/java-8-oracle

格式化 namenode

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

安装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

生成访问密钥

cd ~/
ssh-keygen -t rsa -P '' -f ~/.ssh/id_dsa
cd .ssh
cat id_dsa.pub >> authorized_keys

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

保存镜像副本

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

root@2c241377ccdf:~# 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镜像,下次只需要启动就行

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

把这个写入镜像中

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文件,

启动Hadoop

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

master
这里写图片描述

slave1
这里写图片描述

slave2
这里写图片描述
安装成功.

Referance

https://www.cnblogs.com/onetwo/p/6419925.html
https://blog.csdn.net/lanonola/article/details/51384956

  • 7
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

siyan985

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值