Hadoop on docker

一、这只是一个步骤说明,旨在教大家怎么在docker上搭建hadoop集群以及附着于hadoop的其他环境(hive,pig,hbase,spark……)。

二、详细步骤

1、在服务器上下载并且配置docker:

最新版的ubuntu和centos中都已经添加了docker的源

Ubuntu:

$ sudo apt-get -y install docker.io

CentOS:

$ yum -y install docker.io

下载完了之后启动docker

$ sudo /etc/init.d/docker start

执行 sudo docker 发现docker已经咱装成功了

$ docker
Usage: docker [OPTIONS] COMMAND [arg...]

A self-sufficient runtime for linux containers.

Options:
--api-cors-header=                   Set CORS headers in the remote API
-b, --bridge=                        Attach containers to a network bridge
--bip=                               Specify network bridge IP
-D, --debug=false                    Enable debug mode
-d, --daemon=false                   Enable daemon mode
--default-ulimit=[]                  Set default ulimits for containers
--dns=[]                             DNS server to use

目前对docker的执行都是在root用户下面的,为了当前工作用户执行方面,可以把当前用户添加到docker组里面去(asha 为当前用户)

$ sudo groupadd docker
$ sudo gpasswd -a asha docker

2、docker 常用命令:

$ docker search superset                    #查看可用的镜像

$ docker images                             # 查看所有images

$ docker ps                                 # 查看所有活动容器

$ docker ps -a                              # 查看所有容器

$ docker rm `docker ps -a -q`               # 删除所有不活动的容器                

$ docker pull centos                        #从仓库拉取镜像

$ docker run -i -t centos /bin/bash         #运行一个镜像

$ docker commit 3a09b2588478 mynewimage     #将一个容器提交为镜像

$ docker save mynewimage | bzip2 -9 -c> /home/save.tar.bz2             #把某个镜像打包为tar文件

$ bzip2 -d -c < /home/save.tar.bz2 | docker load                       #加载镜像

$ docker rmi [image-id]  docker rmi -f [image-id]                      #删除镜像

$ cat /home/export.tar | sudo docker import - mynewimage               #导入Image镜像

3、单个hadoop环境的搭建

目前比较常用也是比较成熟的搭建hadoop环境的方法是用cloudera,也就是安装一台cloudera manage的服务器, 其他的安装都是在这台服务器的web上进行,鉴于想要发挥docker的优势,我们还是从头开始搭建hadoop集群环境。

由于安装完了 是还没有后镜像的,而 docker pull ubuntu命令仅仅能从docker官方仓库拉取镜像, 国内貌似很慢,好吧是根本拉动,所以我们从国内官方仓库上拉取,常用的是时速云,灵雀云,DaoCloud这几家, 我用的灵雀云。打开仓库页面,搜索ubuntu。点开任意一个,发现下载仓库地址 :docker pull index.alauda.cn/alauda/ubuntu

默认拉取的是最新版,我们可以选取我们想要的tag,比如ubuntu 14.04

$ docker pull index.alauda.cn/alauda/ubuntu:14.04
$ docker run -ti index.alauda.cn/alauda/ubuntu:14.04

这时我们进入了第一个容器 container的交互界面,这个可以看作是一个完全独立的Linux环境,我们将进行单机hadoop环境的搭建。 其中 root@0e80677833ea @后面的是主机名称,也是这个container的id,应该记住。

Ⅰ)、创建工作用户,我们命名为hadoop,并为之创建密钥

$ adduser hadoop   #一路回车
$ su - hadoop;
$ ssh-keygen -t rsa

这时 cd ~/.ssh 发现有 id_rsa和id_rsa.pub 我们继续设置免密码登录

$ cd .ssh ; ll
drwx------  2 asha asha 4096  1月  5 11:51 ./
drwxr-xr-x 42 asha asha 4096  1月 26 14:16 ../
-rw-------  1 asha asha 1679  1月  5 11:50 id_rsa
-rw-r--r--  1 asha asha  393  1月  5 11:50 id_rsa.pub
$ cp id_rsa.pub authorized_keys
$ ssh localhost

如果登陆成功,说明设置免密码成功。

Ⅱ)、下载java,并配置环境 从稳定性上考虑比较主流的方式是增加oracle的源,不太推荐用java的open-sdk

$ sudo apt-get install software-properties-common #已经安装请忽略
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer

配置工作用户的java环境变量.vim ~/.bashrc

export JAVA_HOME=/usr/lib/jvm/java-7-oracle
export PATH=$JAVA_HOME/bin:$PATH     

Ⅲ)、下载hadoop,目前用的是比较稳定的hadoop 2.6版本

$ sudo mkdir /apache                   # 创建hadoop相关项目的专用目录
$ sudo chown -R hadoop:hadoop apache   # 将该目录的权限赋给hadoop用户
$ wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz 
$ tar zxvf hadoop-2.6.0.tar.gz

Ⅳ)hadoop配置了,详细见三个配置文件。具体配置参见***(占位,以后再写) Ⅴ)推出container,:exit,exit。

4、通过container 提交镜像 上一步推出之后,我们用上次的container 作为镜像的来源,需要用到container id

$ docker commit 0e80677833ea ubuntu:hadoop
$ docker images

至此,我们已经创建了一个带hadoop环境的镜像,下一步我们会通过这镜像创建多个container 组成的集群

5、创建基于hadoop镜像的集群: 我们计划搭建一个四个节点的集群,其中包括3个工作节点和一个主节点,主节点命名为node1,工作节点分别命名为node2,node3,node4 开4个终端窗口,分别作如下操作:

$ docker run -ti -h node1 ubuntu:hadoop
$ docker run -ti -h node2 ubuntu:hadoop
$ docker run -ti -h node1 ubuntu:hadoop
$ docker run -ti -h node1 ubuntu:hadoop

这样就相当于创建四台机器的集群,注意:需要到每个集群的hosts里面重新配置node1,node2,node3,node4,以便能够免密码登录,当然 还可以做一个代理dns,此处还需要继续研究下。

因为是测试集群,集群搭建好了之后,需要依次执行下面操作,才能启动集群

  • 启动ssh :
    sudo /etc/init.d/ssh start

  • 格式化hdfs,在node1上执行下面命令,看是否成功
    hadoop namenode -format

  • 启动hadoop集群,在node1上 :
    /apache/hadoop/sbin/start-all.sh

  • 通过jps命令,如果出现如下进程,主节点运行无误:

8965 NameNode 9895 
9567 NodeManager 
9442 ResourceManager 
9285 SecondaryNameNode 
9088 DataNode

通过在主节点上运行 hadoop dfsadmin -report 查看其他节点是否启动

6、至此我们的hadoop集群就已经搭建完了,有几个地方需要注意:

Ⅰ) container 实际上是一个进程,所以如果主机(物理机)关机或者重启之后,container将不存在,所以尽量不要关机,关机的情况可以先提交成镜像。平时可以关闭终端窗口(xshell,secureCRT),但不可推出contianer(exit),否则数据会丢失。

Ⅱ) 如何进入已经存在的container: docker exec -ti /bin/bash 或者通过ssh -i tsa hadoop@node1
推荐前一种,后一种主要用于往docker的机群中传输文件(scp),或者作为集群的外部数据来源(比如可以把kafka搭建到这里),外部机器和docker 的服务器都是可以作为内网互相访问的。

挂载共享目录

以上我们大体了了解了怎么安装基于docker的hadoop集群。虽然一次产生镜像,多次启动进程的方式让复用性有了很大提高,但是还是有好多公共的比如配置文件打在了docker每个单独的进程中了,这是一种资源浪费也不便于对一致的配置文件统一的管理。这时候挂载共享目录就很重要了

docker挂载本地目录的方法:

Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定。 譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定:

docker run -it -v /hostdir:/dockerdir centos /bin/bash

这样在容器启动后,容器内会自动创建/dockerdir 的目录。通过这种方式,我们可以明确一点,即-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。

你可能感兴趣的:(Hadoop on docker)