
一、命令
1向spark standalone以client方式提交job。
1
/spark-submit --master spark://hadoop3:7077 --deploy-mode client --class orgapachesparkexamplesSparkPi /lib/spark-examples-130-hadoop230jar
--deploy-mode client,在提交的节点会有个main进程,来运行Driver program。如果使用--deploy-mode cluster,则Driver program直接运行在worker中。
2向spark on yarn以client方式提交job
1
/spark-submit --master yarn --deploy-mode client --class orgapachesparkexamplesSparkPi /lib/spark-examples-130-hadoop230jar
二、Spark100 应用程序部署工具spark-submit
随着Spark的应用越来越广泛,对支持多资源管理器应用程序部署工具的需求也越来越迫切。Spark100的出现,这个问题得到了逐步改善。从Spark100开始,Spark提供了一个容易上手的应用程序部署工具bin/spark-submit,可以完成Spark应用程序在local、Standalone、YARN、Mesos上的快捷部署。
Spark 的运行模式有 Local(也称单节点模式),Standalone(集群模式),Spark on Yarn(运行在Yarn上),Mesos以及K8s等常用模式,本文介绍前三种模式。
Spark-shell 参数
Spark-shell 是以一种交互式命令行方式将Spark应用程序跑在指定模式上,也可以通过Spark-submit提交指定运用程序,Spark-shell 底层调用的是Spark-submit,二者的使用参数一致的,通过- -help 查看参数:
sparkconf的传入有三种方式:
1通过在spark应用程序开发的时候用set()方法进行指定
2通过在spark应用程序提交的时候用过以上参数指定,一般使用此种方式,因为使用较为灵活
3通过配置spark-defaultconf,spark-envsh文件进行指定,此种方式较shell方式级别低
Local模式
Local 模式是最简单的一种Spark运行方式,它采用单节点多线程(cpu)方式运行,local模式是一种OOTB(开箱即用)的方式,只需要在spark-envsh导出JAVA_HOME,无需其他任何配置即可使用,因而常用于开发和学习
方式:/spark-shell - -master local[n] ,n代表线程数
Standalone模式
Spark on Yarn
on Yarn的俩种模式
客户端的Driver将应用提交给Yarn后,Yarn会先后启动ApplicationMaster和excutor,另外ApplicationMaster和executor都装在在container里运行,container默认的内存是1g,ApplicationMaster分配的内存是driver-memory,executor分配的内存是executor-memory同时,因为Driver在客户端,所以程序的运行结果可以在客户端显示,Driver以进程名为SparkSubmit的形式存在。
Cluster 模式
1由client向ResourceManager提交请求,并上传Jar到HDFS上
这期间包括四个步骤:
a)连接到RM
b)从RM ASM(applicationsManager)中获得metric,queue和resource等信息。
c)upload app jar and spark-assembly jar
d)设置运行环境和container上下文
2ResourceManager向NodeManager申请资源,创建Spark ApplicationMaster(每个SparkContext都有一个ApplicationManager)
3NodeManager启动Spark App Master,并向ResourceManager ASM注册
4Spark ApplicationMaster从HDFS中找到jar文件,启动DAGScheduler和YARN Cluster Scheduler
5ResourceManager向ResourceManager ASM注册申请container资源(INFO YarnClientImpl: Submitted application)
6ResourceManager通知NodeManager分配Container,这是可以收到来自ASM关于container的报告。(每个container的对应一个executor)
7Spark ApplicationMaster直接和container(executor)进行交互,完成这个分布式任务。
进入spark安装目录下的conf文件夹
[atguigu@hadoop102 module] mv slavestemplate slaves
[atguigu@hadoop102 conf] vim slaves
hadoop102
hadoop103
hadoop104
4)修改spark-envsh文件,添加如下配置:
[atguigu@hadoop102 conf]$ vim spark-envsh
SPARK_MASTER_HOST=hadoop102
SPARK_MASTER_PORT=7077
5)分发spark包
[atguigu@hadoop102 module] sbin/start-allsh
注意:如果遇到 “JAVA_HOME not set” 异常,可以在sbin目录下的spark-configsh 文件中加入如下配置:
export JAVA_HOME=XXXX
官方求PI案例
spark-submit
--class orgapachesparkexamplesSparkPi
--master spark://server-2:7077
--executor-memory 1G
--total-executor-cores 2
/home/xxx/software/spark-244-bin-hadoop27/examples/jars/spark-examples_211-244jar
100
spark-shell
--master spark://server-2:7077
--executor-memory 1g
--total-executor-cores 2
spark-shell --master spark://server-2:7077 --executor-memory 1g --total-executor-cores 2
参数:--master spark://server-2:7077 指定要连接的集群的master
Spark客户端直接连接Yarn,不需要额外构建Spark集群。有yarn-client和yarn-cluster两种模式,主要区别在于:Driver程序的运行节点。
yarn-client:Driver程序运行在客户端,适用于交互、调试,希望立即看到app的输出
yarn-cluster:Driver程序运行在由RM(ResourceManager)启动的AP(APPMaster)适用于生产环境。
安装使用
1)修改hadoop配置文件yarn-sitexml,添加如下内容:
2)修改spark-envsh,添加如下配置:
[atguigu@hadoop102 conf]$ vi spark-envsh
YARN_CONF_DIR=/opt/module/hadoop-272/etc/hadoop
3)分发配置文件
[atguigu@hadoop102 conf] xsync spark-envsh
4)执行一个程序
spark-submit
--class orgapachesparkexamplesSparkPi
--master yarn
--deploy-mode client
/home/xxx/software/spark-244-bin-hadoop27/examples/jars/spark-examples_211-244jar
100
注意:在提交任务之前需启动HDFS以及YARN集群。
日志查看
修改配置文件spark-defaultsconf
添加如下内容:
sparkyarnhistoryServeraddress=server-2:18080
sparkhistoryuiport=18080
2)重启spark历史服务
[atguigu@hadoop102 spark] sbin/start-history-serversh
starting orgapachesparkdeployhistoryHistoryServer, logging to /opt/module/spark/logs/spark-atguigu-orgapachesparkdeployhistoryHistoryServer-1-hadoop102out
3)提交任务到Yarn执行
spark-submit
--class orgapachesparkexamplesSparkPi
--master yarn
--deploy-mode client
/home/xxx/software/spark-244-bin-hadoop27/examples/jars/spark-examples_211-244jar
100
在很多情况下,我们需要查看driver和executors在运行 Spark 应用程序时候产生的日志,这些日志对于我们调试和查找问题是很重要的。
Spark 日志确切的存放路径和部署模式相关:
(1)、 如果是Spark Standalone模式 ,我们可以直接在Master UI界面查看应用程序的日志,在默认情况下这些日志是存储在worker节点的work目录下,这个目录可以通过 SPARK_WORKER_DIR 参数进行配置。
(2)、 如果是Mesos模式 ,我们同样可以通过Mesos的Master UI界面上看到相关应用程序的日志,这些日志是存储在Mesos slave的work目录下。
(3)、 如果是YARN模式 ,最简单地收集日志的方式是使用YARN的日志收集工具( yarn logs -applicationId ),这个工具可以收集你应用程序相关的运行日志,但是这个工具是有限制的:应用程序必须运行完,因为YARN必须首先聚合这些日志;而且你必须开启日志聚合功能( yarnlog-aggregation-enable ,在默认情况下,这个参数是false)。
如果你运行在YARN模式,你可以在ResourceManager节点的WEB UI页面选择相关的应用程序,在页面点击表格中 Tracking UI 列的 ApplicationMaster ,这时候你可以进入到Spark作业监控的WEB UI界面,这个页面就是你Spark应用程序的proxy界面,比如 >
简介
由于spark有多种运行模式,远程调试的时候,虽然大体步骤相同,但是还是有小部分需要注意的地方,这里记录一下调试运行在spark on yarn模式下的程序。
环境准备
需要完好的Hadoop,spark集群,以便于提交spark on yarn程序。我这里是基于CDH的环境
步骤
1随便写个spark程序,比如序列化一个集合,然后求和。然后使用maven打包,上传至集群。可以先提交运行一次,确保可以运行成功。
[root@kjtlxsvr5 bin]# /spark-submit --class cnsparkstudycoreParallelizeCollection --master yarn-cluster --num-executors 3 --executor-cores 2 --executor-memory 1G --driver-java-options "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8787" /home/spark-study-scala-001-SNAPSHOT-jar-with-dependenciesjar
现在有两个办法可以解决这个问题。
第一个办法是节点少的话,通过修改上面IDEA远程主机地址来一个一个试。
第二办法可以精确知道ApplicationMaster在哪里:
①通过CDH进入yarn的应用程序界面
②然后点击进入该程序的详细信息界面,如下图就可以知道Applicationmaster在哪台NodeManager上:
③可以去该节点查看进程,的确有一个ApplicationMaster,然后在IDEA中修改为该远程主机地址,开始debug程序看源码吧!
1、你要切换到yarn-cluster或者yarn-client模式,很简单,将我们之前用于提交spark应用程序的spark-submit脚本,加上--master参数,设置为yarn-cluster,或yarn-client,即可。如果你没设置,那么,就是standalone模式。
2、yarn集群分为主节点和从节点,一个主节点是ResourceManager(RM),多个从节点是NodeManager(NM)。
3、
31、如果是yarn-cluster模式,spark-submit在提交的时候请求到ResourceManager,请求来启动ApplicationMaster,ResourceManager接收到请求后会分配一个container,在某个NodeManager上启动ApplicationMaster,ApplicationMaster(AM)启动后会反过来向ResourceManager进行通讯,其实这个ApplicationMaster就相当于是driver,AM找RM请求container,启动excutor,然后RM会分配一批container,用于启动executor,AM链接其他的NM,来启动executor,这里的NM相当于worker,executor向AM反向注册。ResourceManager相当于之前的master。
32、yarn-client模式,spark-submit在提交的时候发送给RM,请求启动AM,分配一个container,在某个NM上,启动AM,但是这里的AM只是一个ExecutorLauncher,功能是很有限的。AM启动后会找RM申请container,启动executor,AM链接其他的NM,用container的资源来启动executor。executor会反向注册到本地的driver上。
4、区别:yarn-cluster的driver相当于就是在NodeManager上的某一个ApplicationMaster;yarn-client的driver还是在本地启动的一个进程,在NodeManager启动的ApplicationMaster只是一个ExecutorLauncher,ExecutorLauncher只会向ResourceManager申请资源,然后用container资源去链接其他的NodeManager,然后去启动executor,executor启动后会反向注册到提交应用程序的本地客户端的driver进程上,通过本地客户端的driver进程里面的DAGScheduler、TaskScheduler会大量进行task的调度,发送到NodeManager上的executor上去执行。
下面对集中部署模式进行详细介绍
该模式运行任务不会提交在集群中,只在本节点执行,有两种情况
运行该模式非常简单,只需要把Spark的安装包解压后,改一些常用的配置即可使用,而不用启动Spark的Master、Worker守护进程( 只有集群的Standalone方式时,才需要这两个角色),也不用启动Hadoop的各服务(除非你要用到HDFS)。
Spark不一定非要跑在hadoop集群,可以在本地,起多个线程的方式来指定。将Spark应用以多线程的方式直接运行在本地,一般都是为了方便调试,本地单机模式分三类:
搭建步骤:
(中间有报错:raise IllegalArgumentException(ssplit(': ', 1)[1], stackTrace)
pysparksqlutilsIllegalArgumentException: u'Unable to locate hive jars to connect to metastore Please set sparksqlhivemetastorejars',网上提示查看jdk版本,发现ubuntu 1804默认是openjdk-11-jdk包(java -version提示1001)。重新安装openjdk-8-jdk版本不报错)
运行:
使用spark-shell、spark-submit、pyspark
例如使用spark-shell:
local:单机、单核运行
local[k]:启动k个executor
local[ ]:启动跟cpu数目相同的 executor
上述情况中,local[N]与local[]相当于用单机的多个线程来模拟spark分布式计算,通常用来检验开发出来的程序逻辑上有没有问题。
其中N代表可以使用N个线程,每个线程拥有一个core。
这些任务的线程,共享在一个进程中,可以开到,在程序的执行过程中只会产生一个进程,这个进程揽下了所有的任务,既是客户提交任务的client进程,又是spark的driver程序,还是spark执行task的executor
这种运行模式,和Local[N]很像,不同的是,它会在单机启动多个进程来模拟集群下的分布式场景,而不像Local[N]这种多个线程只能在一个进程下委屈求全的共享资源。通常也是用来验证开发出来的应用程序逻辑上有没有问题,或者想使用Spark的计算框架而没有太多资源。
用法:提交应用程序时使用local-cluster[x,y,z]参数:x代表要生成的executor数,y和z分别代表每个executor所拥有的core和memory数。
上面这条命令代表会使用2个executor进程,每个进程分配3个core和1G的内存,来运行应用程序。可以看到,在程序执行过程中,会生成如下几个进程:
前段时间使用了一下google的博客空间,感觉也很一般,所以现在把那里的几篇文章转过来。 执行python脚本只需要对python文件做如下 *** 作即可: 在python文件里第一行加上#! /usr/bin/python,即你的python解释器所在的目录。另外还有一种写法是#!
以上就是关于如何在spark-submit中指定全部的内容,包括:如何在spark-submit中指定、spark安装与运行模式、spark日志收集等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)