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参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容