分享

Spark部署三种方式介绍:YARN模式、Standalone模式、HA模式

pig2 2014-3-13 02:24:35 发表于 常识型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 15 172579
1.YARN模式由谁来作为客户端提交作业给YARN?
2.SPARK_HADOOP_VERSION=2.2.0 SPARK_YARN=true ./sbt/sbt assembly的作用是什么?
3.Standalone模式dist目录的作用是什么?
4.recoveryDirectory最好是能够使用一个nfs的原因是什么?


已有(16)人评论

跳转到指定楼层
pig2 发表于 2014-3-13 02:28:21

Spark的部署让人有点儿困惑,有些需要注意的事项,本来我已经装成功了YARN模式的,但是发现了一些问题,出现错误看日志信息,完全看不懂那个错误信息,所以才打算翻译Standalone的部署的文章。第一部分,我先说一下YARN模式的部署方法。第二部分才是Standalone的方式。

我们首先看一下Spark的结构图,和hadoop的差不多。
cluster-overview.png



1、YARN模式

采用yarn模式的话,其实就是把spark作为一个客户端提交作业给YARN,实际运行程序的是YARN,就不需要部署多个节点,部署一个节点就可以了。

把从官网下载的压缩包在linux下解压之后,进入它的根目录,没有安装git的,先执行yum install git安装git

1)运行这个命令: SPARK_HADOOP_VERSION=2.2.0 SPARK_YARN=true ./sbt/sbt assembly

就等着吧,它会下载很多jar包啥的,这个过程可能会卡死,卡死的就退出之后,重新执行上面的命令。

2)编辑conf目录下的spark-env.sh(原来的是.template结尾的,删掉.template),添加上HADOOP_CONF_DIR参数
  1. HADOOP_CONF_DIR=/etc/hadoop/conf
复制代码
3)运行一下demo看看,能出结果 Pi is roughly 3.13794
  1. SPARK_JAR=./assembly/target/scala-2.9.3/spark-assembly_2.9.3-0.8.1-incubating-hadoop2.2.0.jar \
  2.     ./spark-class org.apache.spark.deploy.yarn.Client \
  3.       --jar examples/target/scala-2.9.3/spark-examples-assembly-0.8.1-incubating.jar \
  4.       --class org.apache.spark.examples.SparkPi \
  5.       --args yarn-standalone \
  6.       --num-workers 3 \
  7.       --master-memory 1g \
  8.       --worker-memory 1g \
  9.       --worker-cores 1
复制代码

2、Standalone模式


下面我们就讲一下怎么部署Standalone,参考页面是http://spark.incubator.apache.or ... ark-standalone.html

这里我们要一个干净的环境,刚解压出来的,运行之前的命令的时候不能再用了,会报错的。

1)打开make-distribution.sh,修改SPARK_HADOOP_VERSION=2.2.0,然后执行./make-distribution.sh, 然后会生成一个dist目录,这个目录就是我们要部署的内容。官方推荐是先把master跑起来,再部署别的节点,大家看看bin目录下面的脚本,和hadoop的差不多的。行,那就先启动master,执行
  1. ./bin/start-master.sh
复制代码
2)部署dist的目录到各个节点,然后通过这个命令来连接master节点
  1. ./spark-class org.apache.spark.deploy.worker.Worker spark://IP:PORT
复制代码
3)然后在主节点查看一下http://localhost:8080 ,查看一下子节点是否在这里,如果在,就说明连接成功了。

4) 部署成功之后,想要在上面部署程序的话,在执行./spark-shell的时候,要加上MASTER这个参数。
  1. MASTER=spark://IP:PORT ./spark-shell
复制代码


3、High Availability


Spark采用Standalone模式的话,Spark本身是一个master/slaves的模式,这样就会存在单点问题,Spark采用的是zookeeper作为它的active-standby切换的工具,设置也很简单。一个完整的切换需要1-2分钟的时间,这个时候新提交的作业会受到影响,之前提交到作业不会受到影响。

  在spark-env.sh添加以下设置:
//设置下面三项JVM参数,具体的设置方式在下面
//spark.deploy.recoveryMode=ZOOKEEPER
//spark.deploy.zookeeper.url=192.168.1.100:2181,192.168.1.101:2181
// /spark是默认的,可以不写
//spark.deploy.zookeeper.dir=/spark   

export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=hadoop.Master:2181,hadoop.SlaveT1:2181,hadoop.SlaveT2:2181"

这里就有一个问题了,集群里面有多个master,我们连接的时候,连接谁?用过hbase的都知道是先连接的zookeeper,但是Spark采用的是另外的一种方式,如果我们有多个master的话,实例化SparkContext的话,使用spark://host1:port1,host2:port2这样的地址,这样它会同时注册两个,一个失效了,还有另外一个。

如果不愿意配置高可用的话,只是想失败的时候,再恢复一下,重新启动的话,那就使用FILESYSTEM的使用,指定一个目录,把当前的各个节点的状态写入到文件系统。
  1. spark.deploy.recoveryMode=FILESYSTEM
  2. spark.deploy.recoveryDirectory=/usr/lib/spark/dataDir
复制代码
当 stop-master.sh来杀掉master之后,状态没有及时更新,再次启动的时候,会增加一分钟的启动时间来等待原来的连接超时。

recoveryDirectory最好是能够使用一个nfs,这样一个master失败之后,就可以启动另外一个master了。




回复

使用道具 举报

天宇 发表于 2014-4-29 15:40:18
飞哥,我想问一下,在standalone 模式下是FIFO调度作业。在yarn模式和mesos模式下,当多个作业提交是不是 并发执行 的啊?求解答,非常感谢!
回复

使用道具 举报

天宇 发表于 2014-4-29 16:13:34
飞哥,我想问一下,standalone模式下提交作业是FIFO模式,那么在yarn和mesos模式下,多个作业提交时是否是并发执行的?
回复

使用道具 举报

pig2 发表于 2014-4-29 18:05:14
天宇 发表于 2014-4-29 16:13
飞哥,我想问一下,standalone模式下提交作业是FIFO模式,那么在yarn和mesos模式下,多个作业提交时是否是 ...

Spark On Mesos模式:有两种调度模式

1)   粗粒度模式(Coarse-grained Mode)
2)   细粒度模式(Fine-grained Mode)
Spark On YARN模式:
目前仅支持粗粒度模式(Coarse-grained Mode)
回复

使用道具 举报

天宇 发表于 2014-5-4 17:14:15
pig2 发表于 2014-4-29 18:05
Spark On Mesos模式:有两种调度模式

1)   粗粒度模式(Coarse-grained Mode)

飞哥,看了你的文章受益匪浅。对如上面的问题我想问的是,spark在standalone模式下只支持FIFO模式,请问是否在集群中,多个Job提交的时候不支持并发执行?在Spark on mesos 和spark on yarn的情况下,spark中提交作业时是否也不支持多个Job作业的提交执行,谢谢!
回复

使用道具 举报

pig2 发表于 2014-5-4 17:40:32
本帖最后由 pig2 于 2014-5-4 17:42 编辑

Spark是支持多个作业同时运行的,否则一个作业被堵塞,整个集群都会被卡住,所以Spark是支持并发执行的,具体可以参考下面

Spark运行在的集群管理器提供了应用间调度的工具。在每个Spark应用中,由不同线程提交的多个“jobs”(Spark actions)可以同时运行。

在给定的Spark应用(已实例化SparkContext)中,如果在不同线程中,多个并行的工作可以同时运行。我们所说的“工作”,其实是一个Spark动作(如保存,收集等)或是任何想需要评估动作的任务。Spark的任务调度员是多线程安全的,它也支持这个用例来使应用服务多个请求(多用户查询).

启动Spark0.8,它可以在两个作业之间配置共享调度。Spark负责在作业之间轮换分配调度,所以,所有的作业都能得到一个大致公平的共享的集群资源。这就意味着即使有一个很长的作业在运行,花费时间较少的作业在提交之后,仍然能够立即获得资源,并且能够有很好的响应,而不是需要等待那个很长的作业运行完之后才能运行。这种模式最适合多用户设置。



回复

使用道具 举报

hyj 发表于 2014-5-4 19:02:30
下文引用自:Spark 作业调度--job执行方式介绍
本文是针对spark作业执行方式是否并发解惑的一篇文章。spark有三种作业调度方式,那么他们的调度方式什么?这里在下文的基础上分析一下:
首先我们知道不同的用户,对于一个集群可能会同时不断的提交作业,那么这些job是怎么执行的,这里困惑了不少刚接触spark的同学。其实无论是那种部署方式,他们都是有可能并发执行的,也就是可能是同时执行的。
下面引用下文的内容:
由不同线程提交的多个“jobs”(Spark actions)可以同时运行

这里我产生了疑问,什么是线程,main()函数是进程还是线程。引用下面内容
main是一个线程也是一个进程,一个java程序启动后它就是一个进程,进程相当于一个空盒,它只提供资源装载的空间,具体的调度并不是由进程来完成的,而是由线程来完成的。一个java程序从main开始之后,进程启动,为整个程序提供各种资源,而此时将启动一个线程,这个线程就是主线程,它将调度资源,进行具体的操作。

对于不同用户提交的.jar是可以理解为一个线程的,因此从下文得知
由不同线程提交的多个“jobs”(Spark actions)可以同时运行

无论是那种部署方式,我们的spark程序都是可以并发执行的。详细可以看下文。
回复

使用道具 举报

InSight 发表于 2014-10-7 16:17:25
都是高手哇,努力学习争取超过你们。哈哈
回复

使用道具 举报

wcg57 发表于 2016-5-20 14:09:07
pig2 发表于 2014-3-13 02:28
Spark的部署让人有点儿困惑,有些需要注意的事项,本来我已经装成功了YARN模式的,但是发现了一些问题,出 ...

请教下一般生产哪种方式部署最多啊?

点评

生产用on yarn或则内存比较大的话,Standalone模式也可以  发表于 2017-4-7 06:50
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条