目前网上在docker上部署spark的介绍比较简单和没有相关启动使用的操作,本文重点在于docker相关的操作.
本环境运用的单个宿主主机,而不是跨主机集群,本spark集群环境存在的含义或许在于便于本地开发测验运用,十分轻量级和快捷。这个布置进程,最好在之前有过必定的hadoop,spark集群布置经历的根底,本文要点在于Docker相关的操作,至于hadoop和spark集群的布置,极力推荐这两个网页:
Hadoop集群:http://blog.csdn.net/stark_sum ... 24279。
Spark集群:http://blog.csdn.net/stark_sum ... 58081
主机体系:ubuntu14.04,64位,内存4G,主机名docker。(实践上是在虚拟机上装置的)
软件版别:hadoop-2.6.0,jdk1.7.0_79,scala-2.10.5,spark-1.2.0-bin-hadoop2.4,docker版别:1.9.1,镜像:ubuntu14.04。
建立环境前调研成果描绘:
现在网上在docker上布置spark的介绍比较简略和没有相关发动运用的操作,布置大致分为两类状况:
1. 直接在docker库房pull下来。这个办法我尝试了一下,不主张运用,首要下载镜像比较大,2G多,其次下载之后形似只能单机发动,也便是伪分布式,并不是集群(我自己没有实践运用过,看到的相关材料是这样说的)。如下sequenceiq/spark:1.2.0这个镜像:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
sequenceiq/spark 1.2.0 334aabfef5f1 10 months ago 2.115 GB
2. 自己运用根底镜像建立环境。本文选用这种办法,由于自己也是刚触摸docker一个多月,还不会运用dockerfile,所以运用的是commit办法制造的集群。
详细布置进程
榜首步,相关软件预备。
经过对spark源码傍边docker文件夹的阅览得出的思路,运用数据卷同享数据。相关的集群软件都放在/opt目录下,意图是为后边发动集群的时分运用docker数据卷同享和永久保存数据,不会跟着容器的删去而丢掉。spark源码docker文件夹解读参阅网页:http://blog.csdn.net/yunlong34 ... 33731
操作阐明,直接把java等软件解压到/opt下,总共是四个,java,hadoop,scala,spark。不需求在宿主主机做任何修正,包含/etc/hosts,/etc/profile增加变量等,由于是在容器傍边运用,宿主主机并不会用到。解压之后如下:
- root@docker:/opt#ll
- total32
- drwxr-xr-x7rootroot409612月2222:12./
- drwxr-xr-x23rootroot409611月3019:35../
- drwxr-xr-x12rootroot409612月2222:07hadoop-2.6.0/
- drwxr-xr-x8rootroot40964月112015jdk1.7.0_79/
- drwxr-xr-x9rootroot409612月2213:54scala-2.10.5/
- drwxrwxr-x12rootroot409612月2222:19spark-1.2.0-bin-hadoop2.4/
然后把hadoop和spark 的配置文件修正,这一步首要是靠之前的相关根底操作了,能够参阅上面给出的两个网站修正配置文件,我是直接复制我之前集群的配置文件替换的,然后再结合后边的主机名,ip等行稍作修正就行了。假如之前没有布置过集群,这一步的作业量是相当大的。
需求特别注意的一点是hadoop的配置文件中的hdfs-sit.xml中的dfs.datanode.data.dir,这个也便是hdfs的datanode的文件夹,也是经过小技巧修正为file:/root/data,为什么这么修正后边有解说,终究的想要的意图是经过链接文件,链接到数据卷/opt的hadoop目录里边,这样数据就能保存在容器之外了,不会跟着容器的删去而丢掉。修正如下:
- dfs.datanode.data.dir
- file:/root/data
第二步,制造根底镜像。(首要作业)
本集群的思路是尽或许的削减额定的作业量,运用的是固定网络环境,这或许和docker自身的网络不固定性相悖,所以运用了一点小技巧修正的网络,这也是这个办法不能大规模运用的原因,也算是一个坏处吧。我看到有人运用动态的ip注册,我还没有了解到哪个境地,在后期的学习中再渐渐完善吧。节点容器主机名和ip规划如下:
主节点容器主机名hostname:node0,IP:172.17.0.150。
从节点容器主机名hostname:node1,IP:172.17.0.151。
从节点容器主机名hostname:node2,IP:172.17.0.152。
下面就开端一步一步的来设置:
1.检查镜像,运用ubuntu:14.04做为根底镜像,假如没有就pull一个吧。
- root@docker:/opt#dockerimages
- REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZE
- ubuntu14.04ca4d7b1b9a518weeksago187.9MB
2.发动一个容器,装置vim和ssh。
- root@docker:/opt#dockerrun-itubuntu:14.04/bin/bash
- root@67f272584448:/#apt-get-yinstallvimopenssh-server
3.修正ssh配置文件,答应root登陆。
- root@67f272584448:/#vim/etc/ssh/sshd_config
找到:PermitRootLogin without-password
修正为:PermitRootLogin yes
4.生成ssh公钥,输入ssh-keygen,一向回车就行了。着里需求阐明的是,三个节点的公钥都是相同的,为了简略起见而运用了小技巧。假如比较了解ssh的话,我说的这些相当于废话了,后边还会有触及的。
- root@67f272584448:/#ssh-keygen
此刻/root/.ssh文件夹里如下:
- root@67f272584448:/#ls/root/.ssh/
- id_rsaid_rsa.pub
- root@67f272584448:/#cat/root/.ssh/id_rsa.pub>>/root/.ssh/authorized_keys
- root@67f272584448:/#ls/root/.ssh/
- authorized_keysid_rsaid_rsa.pub
5.下面开端要害步骤了。
把需求的变量写入/root/.bashrc,为什么不写入/etc/profile呢,由于我试了一下,写入/etc/proflie生成镜像发动容器的时分变量不能收效。
看到这儿,信任下面的变量都是很熟悉吧:
- exportJAVA_HOME=/opt/jdk1.7.0_79
- exportCLASSPATH=.:/opt/jdk1.7.0_79/lib/dt.jar:/opt/jdk1.7.0_79/lib/tools.jar
- exportHADOOP_HOME=/opt/hadoop-2.6.0
- exportSCALA_HOME=/opt/scala-2.10.5
- exportSPARK_HOME=/opt/spark-1.2.0-bin-hadoop2.4
- exportPATH=$JAVA_HOME/bin:$PATH:$SCALA_HOME/bin:$SPARK_HOME/bin
6.这个是终究一步了,在/root下新建一个run.sh脚本,对容器所做的修正,悉数写入这个脚本了,先把脚本贴出来,再解说吧。
- 1#!/bin/bash
- 2
- 3echo"172.17.0.150node0">/etc/hosts
- 4echo"172.17.0.151node1">>/etc/hosts
- 5echo"172.17.0.152node2">>/etc/hosts
- 6
- 7case$HOSTNAMEin
- 8"node0")
- 9ifconfigeth0172.17.0.150
- 10sed-i's/root@.*$/root@node0/g'/root/.ssh/authorized_keys
- 11;;
- 12"node1")
- 13ifconfigeth0172.17.0.151
- 14sed-i's/root@.*$/root@node0/g'/root/.ssh/authorized_keys
- 15ln-s/opt/hadoop-2.6.0/dfs/node1/root/data
- 16;;
- 17"node2")
- 18ifconfigeth0172.17.0.152
- 19sed-i's/root@.*$/root@node0/g'/root/.ssh/authorized_keys
- 20ln-s/opt/hadoop-2.6.0/dfs/node2/root/data
- 21;;
- 22*)
- 23echo"null"
- 24;;
- 25esac
- 26
- 27/etc/init.d/sshstart-D
- 28
1)3,4,5行,替换hosts。发动集群的时分,习惯性的喜爱运用主机名,而不是运用ip,所以做了这个修正。另一个原因是,容器在重启之后hosts和ip是会改变的,所以每次发动都要修正。
2)7到25行,是运用容器的主机名来做三个修正。
- 榜首,修正主机的IP,也便是咱们的三个节点都是固定ip的,这个指令需求privileged。
- 第二,设置ssh免登录,也就authorized_keys中终究一个字段root@......悉数修正为root@node0,这样node0节点就能免登录到node1,node2,和自己node0。
- 第三,运用衔接文件,把hdfs的数据保存到数据卷的相关目录,也便是保存到了容器之外。运用衔接文件时一个技巧,hdfs的配置文件都是/root/data,实践上却保存到了不同的文件目录上去。在上面的hadoop的配置文件中做的一个特别的修正dfs.datanode.data.dir,file:/root/data,这个是hdfs的实践存储数据的目录,经过软衔接到数据卷目录,终究把数据保存在容器之外,这样当容器删去时,hdfs里边的数据并没有消失,新建容器就能够再次运用数据了。
3)27行,这个便是发动ssh的,要害的是-D这个参数,假如不加,发动容器的时分run -d容器就会中止,不会运转。
4)终究保存退出,再修正一下履行权限,退出容器
- root@67f272584448:~#chmod744/root/run.sh
- root@67f272584448:~#exit
7.运用commit提交镜像吧。
0
- dfs.datanode.data.dir
- file:/root/data
从上面能够看出,镜像只要260MB,是十分小的。
到此整个根底镜像就做好了,其中有或许犯错的当地是,hadoop和spark的配置文件修正的问题,这儿是无关docker常识的“预备作业”。
第三步,发动容器,发动集群,并测验。
终究这步是最最爽的时分了,一个指令,集群就发动起来了。
其实下面大部分的篇幅是在解说我的思路,发动集群自身是很简略的hadoop,spark常识。
一、发动容器集群
我写了一个小脚本docker_start.sh,里边三行是发动三个容器的指令,先看一眼:
1
- dfs.datanode.data.dir
- file:/root/data
下面解说一下这个发动指令的各个参数:
1)-d这个指令能够成功履行的原因是run.sh这个脚本的/etc/init.d/ssh start -D这一行的-D这个参数,容器才干成功后台up。
2)--name node0,这个是node0的容器名。
3)-h node0,这儿的node0是容器主机名,也便是hostname。
4)-v /opt:/opt,便是数据卷,四个目录在这儿java,hadoop,scala,spark,而且hdfs的数据存储目录在hadoop-2.6.0目录里,dfs文件夹里有三个目录,最好手动提早新建name,node1和node2,其实是能够写入run.sh脚本里边新建的,可是我现已不想回头去修正run.sh了。
2
- dfs.datanode.data.dir
- file:/root/data
name文件夹是hadoop的配置文件指定的:
3
- dfs.datanode.data.dir
- file:/root/data
node1和node2是run.sh脚本经过衔接文件曩昔的实践hdfs存储数据的目录:
4
- dfs.datanode.data.dir
- file:/root/data
5)--privileged,这个参数是取得最高权限,才能够履行run.sh脚本里边的修正ip的指令。
ifconfig eth0 172.17.0.150
6)/root/run.sh,便是发动容器的时分,履行一下咱们提早写好的脚本,对容器做一下修正了,尽管这些修正歪曲了docker的一些特性,不过关于咱们这个本地的小环境来说,应该仍是有点实践运用的价值的。
二、进入node0容器,发动并测验hdfs
其实,到这儿,就现已差不多完毕了,下面便是hadoop和spark的常识了
首要,先看一下发动的三个节点快乐一下吧
5
- dfs.datanode.data.dir
- file:/root/data
进入node0容器
6
- dfs.datanode.data.dir
- file:/root/data
此刻的容器都是现已做过修正的,能够参看以下相关的信息,比方,ifconfig,/etc/hosts,hostname,/root/.ssh/authorized_keys,等。
下面就发动hadoop的hdfs吧,由于这儿只用到hdfs所以就不论yarn了,榜首次发动hdfs先来个格式化,然后,还要输入若干个yes,这个yes是榜首次ssh登陆的时分需求的,我就不贴出来格式化等相关的代码了。
然后便是发动hdfs:
7
- dfs.datanode.data.dir
- file:/root/data
输入jps检查一下node0上的进程
8
- dfs.datanode.data.dir
- file:/root/data
下面就能够运用hdfs了,能够向hdfs上传几个文件试试,也能够经过webUI浏览器看一下hdfs的状况,总而言之,便是hdfs的常识了,我就不废话了。