Hadoop on docker
一、这只是一个步骤说明,旨在教大家怎么在docker上搭建hadoop集群以及附着于hadoop的其他环境(hive,pig,hbase,spark……)。
二、详细步骤
1、在服务器上下载并且配置docker:
最新版的ubuntu和centos中都已经添加了docker的源
$ 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参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。