Spark 入门: 如何搭建一个最简单的Spark集群

2016年08月18日 10647点热度 2人点赞 0条评论

在学习Spark的时候,当然可以搞一个单机的Spark集群。 在写代码的时候,自然没有什么太大的问题了。但是是不是总有一种意犹未尽、隔靴骚扰的感觉?

如果你的答案是否,好吧,你可以关闭此页了。

 

首先,有一个新人经常遇到的问题:

Spark集群是否一定需要Hadoop集群呢?

答案是。 Spark的集群一共分3种:

  1. Standalone
  2. Hadoop-Yarn
  3. Mesos

今天我们主要涉及的就是Standalone这种模式。在这种模式之下,我们完全可以使用NFS来代替Hadoop / HDFS. 并且在很多场景之下,Standalone 完全可以满足我们的需求。

那么,问题来了:

如何搭建一个Standalone集群?

首先需要你下载相应的版本。 当前最新的版本是2.0. 但是笔者的经验还主要集中在1.6 之上。  因此本篇文章涉及的Spark版本是1.6.1. 下载地址:http://spark.apache.org/downloads.html

这里有一个需要注意的地方: 虽然我们不需要搭建HDFS,但是我们下载的Spark版本query不能不带Hadoop。 如下截图:

 

Spark 集群区分Master与Slave / Worker / Executor 的概念。 并且每一个节点,无论是master还是worker 都需要有一份完整的spark binary。 而且有一个非常推荐的做法:在所有(master + all workers)的节点,spark放置的路径都要完全的一致。

貌似官方并没有这样要求,但是这样做的好处就是避免了各种奇奇怪怪的问题,并且也非常方便后期的维护与管理。 详情请看文末附带的下载代码。

如果不是统一的安装路径,这个代码就悲惨了。。。

比如笔者喜欢将Spark / Cassandra / Zeppline 等都放在/Project 目录之下。

当我们的Spark放置好的时候,我们就可以开始启动我们的集群啦!

这时候有两种选择:(两种名字都是我自己瞎编的,意思意思 ^_^)

(1) Master to Slaves

步骤如下:

  1. 配置从Master到各个Slave的无密码登录 (具体步骤可以百度、google)
  2. 在conf目录之中,从spark-env.sh.template 之中复制一个spark-env.sh 并填入如下内容:

     
  3. 在conf目录之中,从slaves.template 复制一份slaves 文件,并在其中写入slave的IP,每行一个。

 

当上面的步骤都配置好之后,执行./sbin/start-all.sh 即可

(2) Slaves to Master

这种方式,是笔者自己各种摸索出来的使用方式,在网上少有记载!

  1. 与(1)的第二步类似, 修改master的conf/spark-env.sh 文件
  2. master 执行 sbin/start-master.sh
  3. 到各个slave机器 执行  sbin/start-slave.sh spark://{MASTER_IP}:7077

 

比较上面两种方式的优缺点,

  1. (1) 的配置比较多,但是之后的操作比较方便。只需要一条执行命令即可
  2. (2) 的配置比较少,需要执行的命令比较多。

 

最终,笔者选择的是方式(2),因为笔者当时在配置各个机器的无密码登录的时候,并不稳定并且找不到根本的解决办法。 表现就是: 机器重启之后可能无密码登录就是失效了,有的时候直接无法无密码登录。。。

所以选择(2)也是很无奈。不管怎么说,使用(2) 也能达到目标,而且Spark 集群工作得还是挺好的 :)

 

上文提到,我们使用NFS来替代HDFS做文件系统。安装NFS也比较容易:

(1) 首先Master NFS Server安装nfs-server 
sudo apt-get install nfs-kernel-server

貌似会自动安装好客户端nfs-common

安装完成之后,需要进行一些配置的修改:
sudo vim  /etc/exports
添加一句:
/data/nfsshare  *(rw,sync,no_subtree_check)
/data/nfsshare 表示共享目录放在那里~
* :表示可以访问的机器的ip, 可以以IP + 子网掩码的形式来写,比如10.206.1.1/16
rw:客户端拥有读写权限(ro:代码只有读权限)
sync:同步写入资料到内存和硬盘中
no_subtree_check:不检测子目录权限
root_squash:如果客户端使用root权限访问共享目录,则会被认为是匿名用户(权限缩小)
no_root_squash:如果客户端使用root权限访问共享目录,权限依旧为root
配置完成之后重启服务:
sudo  service nfs-kernel-server  restart
(2) 在其他机器安装NFS Client
sudo apt-get install nfs-common -y

安装完成之后直接mount server即可:

sudo mkdir -p /data/hadoopData
sudo mount 10.206.132.1:/data/hadoopData /data/hadoopData
注意:为了后面路径统计,本地的共享目录(/mnt)一定要一致
如果不再挂载就用sudo umount /mnt 即可

到目前为止,所有的基础工作都已经完成。 美中不足就是手动的操作太多了。

一种解决方案,就是使用cloudera 之类的集成套件,通过UI界面鼠标点击自动安装好。 另外一种,就是像我们这个小团队一样,因为任务比较简单,只需要编写一些简单的远程操作代码即可。

使用的语言是python, 依赖Paramiko这个库。源码可以从我的百度盘下载:

链接: http://pan.baidu.com/s/1eS4sLoA 密码: t8kd

如果百度盘的地址失效了,请留言告诉我。

 

RangerWolf

保持饥渴的专注,追求最佳的品质

文章评论