一步一步详细搭建Spark集群在docker上

看了好多文章,都不是特别详细,现在通过综合所有的文章一起写个自己配置的过程。

一、先配置一个docker

docker pull daocloud.io/daocloud/tensorflow:nightly-devel

这个是带有tensorflow深度学习库的ubuntu14.04,因为我要用到tensorflow所以下的这个。如果是你,找一个带ubuntu14.04的即可。

sudo docker run -v /home/y:/mnt/y -it younfor/tensor:0.12

运行一个docker镜像然后-v指定映射路径方便共享文件
安装ssh

apt-get install ssh //如果找不到则要配置软件源再apt-get update即可,可以自行百度比较简单

然后启动

/usr/sbin/sshd // 最好加入vim ~/.bashrc, 写在最后,然后source ~/.bashrc

如果报错

Missing privilege separation directory: /var/run/sshd
mkdir 这个目录就行

将 /etc/ssh/sshd_config中PermitRootLogin xx 改为yes

cd ~/

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

cd .ssh

cat id_rsa.pub >> authorized_keys

开启ssh服务后验证是否可以使用,打印出当前时间
ssh localhost date

安装java

sudo add-apt-repository ppa:webupd8team/java  
sudo apt-get update  
sudo apt-get install oracle-java7-installer  

这样弄完后

java -version // 有东西则安装完成
vim ~/.bashrc
写入
export JAVA_HOME=/usr/lib/jvm/java-7-oracle/

安装zookeeper

http://archive.apache.org/dist/zookeeper/zookeeper-3.4.5/
下载解压到/usr

vim ~/.bashrc // 写入下面环境变量
export ZOOKEEPER_HOME=/usr/zookeeper-3.4.8
export PATH=$PATH:$ZOOKEEPER_HOME/bin
source ~/.bashrc
cp /usr/zookeeper-3.4.5/conf/zoo_sample.cfg /usr/zookeeper-3.4.5/conf/zoo.cfg 
#数据存储目录修改为:
dataDir=/root/zookeeper/tmp
#在最后添加Zkserver配置信息:
server.1=cloud1:2888:3888
server.2=cloud2:2888:3888
server.3=cloud3:2888:3888
然后在控制台
mkdir ~/zookeeper
mkdir ~/zookeeper/tmp
touch ~/zookeeper/tmp/myid
#~/zookeeper/tmp/myid文件中保存的数字代表本机的Zkserver编号
#在此设置cloud1为编号为1的Zkserver,之后生成cloud2和cloud3之后还需要分别修改此文件
echo 1 > ~/zookeeper/tmp/myid

安装hadoop

http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.6.5/hadoop-2.6.5.tar.gz
复制到/usr/hadoop-2.6.5
配置环境变量

export HADOOP_HOME=/usr/hadoop-2.6.5
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

修改Hadoop启动配置文件(/usr/hadoop-2.6.4/etc/hadoop/hadoop-env.sh):
1 #修改JAVA_HOME
2 export JAVA_HOME=xxx
修改核心配置文件(/usr/hadoop-2.6.5/etc/hadoop/core-site.xml):
贴到configuration中间

<property>
    <name>fs.defaultFS</name>
    <value>hdfs://ns1</value>
</property>
<property>
    <name>hadoop.tmp.dir</name>
    <value>/root/hadoop/tmp</value>
</property>
<property>
    <name>ha.zookeeper.quorum</name> 
    <value>cloud1:2181,cloud2:2181,cloud3:2181</value>
</property>

修改HDFS配置文件(/usr/hadoop-2.6.4/etc/hadoop/hdfs-site.xml):

dfs.nameservices 名称服务,在基于HA的HDFS中,用名称服务来表示当前活动的NameNode
dfs.ha.namenodes. 配置名称服务下有哪些NameNode
dfs.namenode.rpc-address.. 配置NameNode远程调用地址
dfs.namenode.http-address.. 配置NameNode浏览器访问地址
dfs.namenode.shared.edits.dir 配置名称服务对应的JournalNode
dfs.journalnode.edits.dir JournalNode存储数据的路径

<property>
    <name>dfs.nameservices</name>
    <value>ns1</value>
</property>
<property>
    <name>dfs.ha.namenodes.ns1</name>
    <value>nn1,nn2</value>
</property>
<property>
    <name>dfs.namenode.rpc-address.ns1.nn1</name>
    <value>cloud1:9000</value>
</property>
<property>
    <name>dfs.namenode.http-address.ns1.nn1</name>
    <value>cloud1:50070</value>
</property>
<property>
    <name>dfs.namenode.rpc-address.ns1.nn2</name>
    <value>cloud2:9000</value>
</property>
<property>
    <name>dfs.namenode.http-address.ns1.nn2</name>
    <value>cloud2:50070</value>
</property>
<property>
    <name>dfs.namenode.shared.edits.dir</name> 
    <value>qjournal://cloud1:8485;cloud2:8485;cloud3:8485/ns1</value>
</property>
<property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/root/hadoop/journal</value>
</property>
<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>
<property>
    <name>dfs.client.failover.proxy.provider.ns1</name>
    <value>
    org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
    </value>
</property>
<property>
    <name>dfs.ha.fencing.methods</name>
    <value>
    sshfence
    shell(/bin/true)
    </value>
</property>
<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
</property>
<property>
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>30000</value>
</property>

修改Yarn的配置文件(/usr/hadoop-2.6.4/etc/hadoop/yarn-site.xml):
yarn.resourcemanager.hostname RescourceManager的地址,NodeManager的地址在slaves文件中定义

<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>cloud1</value>
</property>
<property> 
    <name>yarn.nodemanager.aux-services</name> 
    <value>mapreduce_shuffle</value> 
</property>

修改/usr/hadoop-2.6.4/etc/hadoop/mapred-site.xml

         <configuration>
             <!-- 指定mr框架为yarn方式 -->
             <property>
                 <name>
                      mapreduce.framework.name
                  </name>
                 <value>yarn</value>
             </property>
         </configuration>

修改指定DataNode和NodeManager的配置文件(/usr/hadoop-2.6.4/etc/hadoop/slaves):
cloud1
cloud2
cloud3

安装spark

http://spark.apache.org/downloads.html
Spark安装包下载后,解压在/usr目录下。在~/.bashrc中添加环境变量:

export SPARK_HOME=/usr/spark-1.6.1-bin-hadoop2.6
export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH
 cp /usr/spark-1.6.1-bin-hadoop2.6/conf/spark-env.sh.template /usr/spark-1.6.1-bin-hadoop2.6/conf/spark-env.sh
 // 添加
export SPARK_MASTER_IP=cloud1
export SPARK_WORKER_MEMORY=128m 
export JAVA_HOME=/usr/jdk1.8.0_77 
export SCALA_HOME=/usr/scala-2.10.6 
export SPARK_HOME=/usr/spark-1.6.1-hadoop2.6 
export HADOOP_CONF_DIR=/usr/hadoop-2.6.5/etc/hadoop 
export SPARK_LIBRARY_PATH=$SPARK_HOME/lib 
export SCALA_LIBRARY_PATH=$SPARK_LIBRARY_PATH 
export SPARK_WORKER_CORES=1 
export SPARK_WORKER_INSTANCES=1 
export SPARK_MASTER_PORT=7077

修改指定Worker的配置文件(/usr/spark-1.6.1-bin-hadoop2.6/conf/slaves):
cloud1
cloud2
cloud3

部署分布式

先查看ip

ifconfig
//172.17.0.2

退掉docker窗口,回到你的电脑终端保存这个docker images

sudo docker ps -l
sudo docker commit a1f2ac36a2c9 新名字

基于Spark镜像创建cloud2和cloud3容器:

docker --name cloud2 -h cloud2 --add-host cloud1:172.17.0.2 --add-host cloud2:172.17.0.3 --add-host cloud3:172.17.0.4 -it Spark
docker --name cloud3 -h cloud3 --add-host cloud1:172.17.0.2 --add-host cloud2:172.17.0.3 --add-host cloud3:172.17.0.4 -it Spark

还记得之前提到的cloud2和cloud3的当前Zkserver还未配置吗?分别在cloud2和cloud3容器中修改Zookeeper配置:

#在cloud2执行
echo 2 > ~/zookeeper/tmp/myid
#在cloud3执行
echo 3 > ~/zookeeper/tmp/myid

在所有节点启动Zkserver

1 zkServer.sh start
  在所有节点查看Zkserver运行状态:
1 #显示连接不到Zkserver的错误,可稍后查看
2 #Master表示主Zkserver,Follower表示从Zkserver
3 Zkserver.sh status
  初始化其中一个NameNode,就选cloud1吧:

启动journalnode(在cloud1上启动所有journalnode) (有个教程少了这一步 ,让我蛋疼了一下)

 hadoop-daemons.sh start journalnode

 (运行jps命令检验,多了JournalNode进程)

如果报错

JAVA_HOME is not set

是因为ssh的问题。
在把export JAVA_HOME=/usr/lib/jvm/java-7-oracle/ 加到/usr/hadoop-2.6.5/etc/hadoop/hadoop.env.sh即可

格式化NameNode

hdfs namenode -format

//格式化zkfc
hdfs zkfc -formatZK
在cloud1启动HDFS,Yarn,Spark:

1 #启动NameNode,DataNode,zkfc,JournalNode
2 start-dfs.sh
3 #启动ResouceManager,NodeManager
4 start-yarn.sh
5 #启动Master,Worker
6 start-all.sh

使用jps命令查看各节点服务运行情况:

1 jps

还可以登录web管理台来查看运行状况:

服务  地址
HDFS    cloud1:50070
Yarn    cloud1:8088
Spark   cloud1:8080

参考

https://my.oschina.net/allen1088/blog/214511
http://blog.csdn.net/qq1010885678/article/details/46353101
http://www.cnblogs.com/jasonfreak/p/5391190.html

猜你喜欢

转载自blog.csdn.net/cq361106306/article/details/54237392
今日推荐