在学习Spark的时候,当然可以搞一个单机的Spark集群。 在写代码的时候,自然没有什么太大的问题了。但是是不是总有一种意犹未尽、隔靴骚扰的感觉?
如果你的答案是否,好吧,你可以关闭此页了。
首先,有一个新人经常遇到的问题:
Spark集群是否一定需要Hadoop集群呢?
答案是否。 Spark的集群一共分3种:
- Standalone
- Hadoop-Yarn
- 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
步骤如下:
- 配置从Master到各个Slave的无密码登录 (具体步骤可以百度、google)
- 在conf目录之中,从spark-env.sh.template 之中复制一个spark-env.sh 并填入如下内容:
12345export SPARK_MASTER_IP=10.206.131.48 # bind the master to a different IP address or hostnameexport SPARK_MASTER_PORT=7077 # SPARK_MASTER_WEBUI_PORT, to use non-default ports for the masterexport SPARK_MASTER_WEBUI_PORT=8080 #export SPARK_EXECUTOR_MEMORY=2500Mexport SPARK_DRIVER_MEMORY=2500M
- 在conf目录之中,从slaves.template 复制一份slaves 文件,并在其中写入slave的IP,每行一个。
当上面的步骤都配置好之后,执行./sbin/start-all.sh 即可
(2) Slaves to Master
这种方式,是笔者自己各种摸索出来的使用方式,在网上少有记载!
- 与(1)的第二步类似, 修改master的conf/spark-env.sh 文件
- master 执行 sbin/start-master.sh
- 到各个slave机器 执行 sbin/start-slave.sh spark://{MASTER_IP}:7077
比较上面两种方式的优缺点,
- (1) 的配置比较多,但是之后的操作比较方便。只需要一条执行命令即可
- (2) 的配置比较少,需要执行的命令比较多。
最终,笔者选择的是方式(2),因为笔者当时在配置各个机器的无密码登录的时候,并不稳定并且找不到根本的解决办法。 表现就是: 机器重启之后可能无密码登录就是失效了,有的时候直接无法无密码登录。。。
所以选择(2)也是很无奈。不管怎么说,使用(2) 也能达到目标,而且Spark 集群工作得还是挺好的 :)
上文提到,我们使用NFS来替代HDFS做文件系统。安装NFS也比较容易:
sudo apt-get install nfs-kernel-server
|
貌似会自动安装好客户端nfs-common
sudo vim /etc/exports
|
添加一句:
/data/nfsshare *(rw,sync,no_subtree_check)
|
sync:同步写入资料到内存和硬盘中
no_subtree_check:不检测子目录权限
root_squash:如果客户端使用root权限访问共享目录,则会被认为是匿名用户(权限缩小)
no_root_squash:如果客户端使用root权限访问共享目录,权限依旧为root
sudo service nfs-kernel-server restart
|
sudo apt-get install nfs-common -y
|
安装完成之后直接mount server即可:
sudo mkdir -p /data/hadoopData
sudo mount 10.206.132.1:/data/hadoopData /data/hadoopData
|
到目前为止,所有的基础工作都已经完成。 美中不足就是手动的操作太多了。
一种解决方案,就是使用cloudera 之类的集成套件,通过UI界面鼠标点击自动安装好。 另外一种,就是像我们这个小团队一样,因为任务比较简单,只需要编写一些简单的远程操作代码即可。
使用的语言是python, 依赖Paramiko这个库。源码可以从我的百度盘下载:
链接: http://pan.baidu.com/s/1eS4sLoA 密码: t8kd
如果百度盘的地址失效了,请留言告诉我。

文章评论