Spark部署三种方式介绍:YARN模式、Standalone模式、HA模式
1.YARN模式由谁来作为客户端提交作业给YARN?2.SPARK_HADOOP_VERSION=2.2.0 SPARK_YARN=true ./sbt/sbt assembly的作用是什么?
3.Standalone模式dist目录的作用是什么?
4.recoveryDirectory最好是能够使用一个nfs的原因是什么?
Spark的部署让人有点儿困惑,有些需要注意的事项,本来我已经装成功了YARN模式的,但是发现了一些问题,出现错误看日志信息,完全看不懂那个错误信息,所以才打算翻译Standalone的部署的文章。第一部分,我先说一下YARN模式的部署方法。第二部分才是Standalone的方式。
我们首先看一下Spark的结构图,和hadoop的差不多。
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参数HADOOP_CONF_DIR=/etc/hadoop/conf3)运行一下demo看看,能出结果 Pi is roughly 3.13794SPARK_JAR=./assembly/target/scala-2.9.3/spark-assembly_2.9.3-0.8.1-incubating-hadoop2.2.0.jar \
./spark-class org.apache.spark.deploy.yarn.Client \
--jar examples/target/scala-2.9.3/spark-examples-assembly-0.8.1-incubating.jar \
--class org.apache.spark.examples.SparkPi \
--args yarn-standalone \
--num-workers 3 \
--master-memory 1g \
--worker-memory 1g \
--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,执行./bin/start-master.sh2)部署dist的目录到各个节点,然后通过这个命令来连接master节点./spark-class org.apache.spark.deploy.worker.Worker spark://IP:PORT3)然后在主节点查看一下http://localhost:8080 ,查看一下子节点是否在这里,如果在,就说明连接成功了。
4) 部署成功之后,想要在上面部署程序的话,在执行./spark-shell的时候,要加上MASTER这个参数。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的使用,指定一个目录,把当前的各个节点的状态写入到文件系统。spark.deploy.recoveryMode=FILESYSTEM
spark.deploy.recoveryDirectory=/usr/lib/spark/dataDir当 stop-master.sh来杀掉master之后,状态没有及时更新,再次启动的时候,会增加一分钟的启动时间来等待原来的连接超时。
recoveryDirectory最好是能够使用一个nfs,这样一个master失败之后,就可以启动另外一个master了。
飞哥,我想问一下,在standalone 模式下是FIFO调度作业。在yarn模式和mesos模式下,当多个作业提交是不是 并发执行 的啊?求解答,非常感谢! 飞哥,我想问一下,standalone模式下提交作业是FIFO模式,那么在yarn和mesos模式下,多个作业提交时是否是并发执行的? 天宇 发表于 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)
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:42 编辑
Spark是支持多个作业同时运行的,否则一个作业被堵塞,整个集群都会被卡住,所以Spark是支持并发执行的,具体可以参考下面
Spark运行在的集群管理器提供了应用间调度的工具。在每个Spark应用中,由不同线程提交的多个“jobs”(Spark actions)可以同时运行。
在给定的Spark应用(已实例化SparkContext)中,如果在不同线程中,多个并行的工作可以同时运行。我们所说的“工作”,其实是一个Spark动作(如保存,收集等)或是任何想需要评估动作的任务。Spark的任务调度员是多线程安全的,它也支持这个用例来使应用服务多个请求(多用户查询).
启动Spark0.8,它可以在两个作业之间配置共享调度。Spark负责在作业之间轮换分配调度,所以,所有的作业都能得到一个大致公平的共享的集群资源。这就意味着即使有一个很长的作业在运行,花费时间较少的作业在提交之后,仍然能够立即获得资源,并且能够有很好的响应,而不是需要等待那个很长的作业运行完之后才能运行。这种模式最适合多用户设置。
下文引用自:Spark 作业调度--job执行方式介绍
本文是针对spark作业执行方式是否并发解惑的一篇文章。spark有三种作业调度方式,那么他们的调度方式什么?这里在下文的基础上分析一下:
首先我们知道不同的用户,对于一个集群可能会同时不断的提交作业,那么这些job是怎么执行的,这里困惑了不少刚接触spark的同学。其实无论是那种部署方式,他们都是有可能并发执行的,也就是可能是同时执行的。
下面引用下文的内容:
由不同线程提交的多个“jobs”(Spark actions)可以同时运行
这里我产生了疑问,什么是线程,main()函数是进程还是线程。引用下面内容
main是一个线程也是一个进程,一个java程序启动后它就是一个进程,进程相当于一个空盒,它只提供资源装载的空间,具体的调度并不是由进程来完成的,而是由线程来完成的。一个java程序从main开始之后,进程启动,为整个程序提供各种资源,而此时将启动一个线程,这个线程就是主线程,它将调度资源,进行具体的操作。
对于不同用户提交的.jar是可以理解为一个线程的,因此从下文得知
由不同线程提交的多个“jobs”(Spark actions)可以同时运行
无论是那种部署方式,我们的spark程序都是可以并发执行的。详细可以看下文。
都是高手哇,努力学习争取超过你们。哈哈 pig2 发表于 2014-3-13 02:28
Spark的部署让人有点儿困惑,有些需要注意的事项,本来我已经装成功了YARN模式的,但是发现了一些问题,出 ...
请教下一般生产哪种方式部署最多啊?
页:
[1]
2