目前网上在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在本地建立hadoop,spark集群(docker搭建hadoop集群)  Docker 容器 第1张

建立环境前调研成果描绘:

现在网上在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增加变量等,由于是在容器傍边运用,宿主主机并不会用到。解压之后如下:

  1. root@docker:/opt#ll
  2. total32
  3. drwxr-xr-x7rootroot4096122222:12./
  4. drwxr-xr-x23rootroot4096113019:35../
  5. drwxr-xr-x12rootroot4096122222:07hadoop-2.6.0/
  6. drwxr-xr-x8rootroot40964112015jdk1.7.0_79/
  7. drwxr-xr-x9rootroot4096122213:54scala-2.10.5/
  8. drwxrwxr-x12rootroot4096122222: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目录里边,这样数据就能保存在容器之外了,不会跟着容器的删去而丢掉。修正如下:

  1. dfs.datanode.data.dir
  2. 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一个吧。

  1. root@docker:/opt#dockerimages
  2. REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZE
  3. ubuntu14.04ca4d7b1b9a518weeksago187.9MB

2.发动一个容器,装置vim和ssh。

  1. root@docker:/opt#dockerrun-itubuntu:14.04/bin/bash
  2. root@67f272584448:/#apt-get-yinstallvimopenssh-server

3.修正ssh配置文件,答应root登陆。

  1. root@67f272584448:/#vim/etc/ssh/sshd_config

找到:PermitRootLogin without-password

修正为:PermitRootLogin yes

4.生成ssh公钥,输入ssh-keygen,一向回车就行了。着里需求阐明的是,三个节点的公钥都是相同的,为了简略起见而运用了小技巧。假如比较了解ssh的话,我说的这些相当于废话了,后边还会有触及的。

  1. root@67f272584448:/#ssh-keygen

此刻/root/.ssh文件夹里如下:

  1. root@67f272584448:/#ls/root/.ssh/
  2. id_rsaid_rsa.pub
  3. root@67f272584448:/#cat/root/.ssh/id_rsa.pub>>/root/.ssh/authorized_keys
  4. root@67f272584448:/#ls/root/.ssh/
  5. authorized_keysid_rsaid_rsa.pub

5.下面开端要害步骤了。

把需求的变量写入/root/.bashrc,为什么不写入/etc/profile呢,由于我试了一下,写入/etc/proflie生成镜像发动容器的时分变量不能收效。

看到这儿,信任下面的变量都是很熟悉吧:

  1. exportJAVA_HOME=/opt/jdk1.7.0_79
  2. exportCLASSPATH=.:/opt/jdk1.7.0_79/lib/dt.jar:/opt/jdk1.7.0_79/lib/tools.jar
  3. exportHADOOP_HOME=/opt/hadoop-2.6.0
  4. exportSCALA_HOME=/opt/scala-2.10.5
  5. exportSPARK_HOME=/opt/spark-1.2.0-bin-hadoop2.4
  6. exportPATH=$JAVA_HOME/bin:$PATH:$SCALA_HOME/bin:$SPARK_HOME/bin

6.这个是终究一步了,在/root下新建一个run.sh脚本,对容器所做的修正,悉数写入这个脚本了,先把脚本贴出来,再解说吧。

  1. 1#!/bin/bash
  2. 2
  3. 3echo"172.17.0.150node0">/etc/hosts
  4. 4echo"172.17.0.151node1">>/etc/hosts
  5. 5echo"172.17.0.152node2">>/etc/hosts
  6. 6
  7. 7case$HOSTNAMEin
  8. 8"node0")
  9. 9ifconfigeth0172.17.0.150
  10. 10sed-i's/root@.*$/root@node0/g'/root/.ssh/authorized_keys
  11. 11;;
  12. 12"node1")
  13. 13ifconfigeth0172.17.0.151
  14. 14sed-i's/root@.*$/root@node0/g'/root/.ssh/authorized_keys
  15. 15ln-s/opt/hadoop-2.6.0/dfs/node1/root/data
  16. 16;;
  17. 17"node2")
  18. 18ifconfigeth0172.17.0.152
  19. 19sed-i's/root@.*$/root@node0/g'/root/.ssh/authorized_keys
  20. 20ln-s/opt/hadoop-2.6.0/dfs/node2/root/data
  21. 21;;
  22. 22*)
  23. 23echo"null"
  24. 24;;
  25. 25esac
  26. 26
  27. 27/etc/init.d/sshstart-D
  28. 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)终究保存退出,再修正一下履行权限,退出容器

  1. root@67f272584448:~#chmod744/root/run.sh
  2. root@67f272584448:~#exit

7.运用commit提交镜像吧。

  1. dfs.datanode.data.dir
  2. file:/root/data
0

从上面能够看出,镜像只要260MB,是十分小的。

到此整个根底镜像就做好了,其中有或许犯错的当地是,hadoop和spark的配置文件修正的问题,这儿是无关docker常识的“预备作业”。

第三步,发动容器,发动集群,并测验。

终究这步是最最爽的时分了,一个指令,集群就发动起来了。

其实下面大部分的篇幅是在解说我的思路,发动集群自身是很简略的hadoop,spark常识。

一、发动容器集群

我写了一个小脚本docker_start.sh,里边三行是发动三个容器的指令,先看一眼:

  1. dfs.datanode.data.dir
  2. file:/root/data
1

下面解说一下这个发动指令的各个参数:

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了。

  1. dfs.datanode.data.dir
  2. file:/root/data
2

name文件夹是hadoop的配置文件指定的:

  1. dfs.datanode.data.dir
  2. file:/root/data
3

node1和node2是run.sh脚本经过衔接文件曩昔的实践hdfs存储数据的目录:

  1. dfs.datanode.data.dir
  2. file:/root/data
4

5)--privileged,这个参数是取得最高权限,才能够履行run.sh脚本里边的修正ip的指令。

ifconfig eth0 172.17.0.150

6)/root/run.sh,便是发动容器的时分,履行一下咱们提早写好的脚本,对容器做一下修正了,尽管这些修正歪曲了docker的一些特性,不过关于咱们这个本地的小环境来说,应该仍是有点实践运用的价值的。

二、进入node0容器,发动并测验hdfs

其实,到这儿,就现已差不多完毕了,下面便是hadoop和spark的常识了

首要,先看一下发动的三个节点快乐一下吧

  1. dfs.datanode.data.dir
  2. file:/root/data
5

进入node0容器

  1. dfs.datanode.data.dir
  2. file:/root/data
6

此刻的容器都是现已做过修正的,能够参看以下相关的信息,比方,ifconfig,/etc/hosts,hostname,/root/.ssh/authorized_keys,等。

下面就发动hadoop的hdfs吧,由于这儿只用到hdfs所以就不论yarn了,榜首次发动hdfs先来个格式化,然后,还要输入若干个yes,这个yes是榜首次ssh登陆的时分需求的,我就不贴出来格式化等相关的代码了。

然后便是发动hdfs:

  1. dfs.datanode.data.dir
  2. file:/root/data
7

输入jps检查一下node0上的进程

  1. dfs.datanode.data.dir
  2. file:/root/data
8

下面就能够运用hdfs了,能够向hdfs上传几个文件试试,也能够经过webUI浏览器看一下hdfs的状况,总而言之,便是hdfs的常识了,我就不废话了。

转载请说明出处
知优网 » 运用Docker在本地建立hadoop,spark集群(docker搭建hadoop集群)

发表评论

您需要后才能发表评论