一、背景
Maxcompute平台目前可以支持运行Spark作业,Spark作业依托于Maxcompute的Cupid平台可以按照社区兼容的方式提交到Maxcompute上运行,支持读写Maxcompute表,和Maxcompute上原有的SQL/MR等作业共用Project的资源。相关产品的详细介绍可以参考官方文档:https://help.aliyun.com/document_detail/102357.html
Maxcompute Spark作业也是Maxcompute平台上的一种作业类型,和其他作业一样,每一个Spark作业都具有一个唯一的InstanceId,可以通过InstanceId来管理相应的Spark作业,比如通过InstanceId我们可以获取到作业的Logview和停止作业。但是目前通过InstanceId能够获取到的信息对于Spark作业来说还是太有限,一些Spark作业特有的信息无法看到,这也是目前Spark用户运维管理过程中的一个痛点。本文接下来会介绍一款Maxcompute Spark作业管控利器—Cupid Console。
二、Cupid Console介绍
Cupid Console是MaxCompute客户端 0.33.1 及更新版本新增的一个插件,下载MaxCompute客户端最新版本:
https://github.com/aliyun/aliyun-odps-console/releases
配置好后,运行odpscmd,针对spark作业的管控,Cupid Console增加了一组spark的命令,可以通过运行help spark;查看这些命令的用法;
Usage: spark list [-s <yarnState>(NEW,RUNNING,FINISHED,FAILED,KILLED)];
spark info [-i <instanceId>] [-a <appId>];
spark kill [-i <instanceId>] [-a <appId>];
spark view [-i <instanceId>] [-a <appId>];
spark search <appNameStr>;
可以看到,Cupid Console 提供的 spark 系列命令,可以针对 spark 类型的作业,同时提供 InstanceId 和 ApplicationId 两个维度进行管理的能力,更加贴近 Yarn 用户的使用习惯。
三、Cupid Console命令使用
1、spark list
该命令可以列出当前Project下面所有的Spark作业,列出的结果包括StartTime(作业开始时间),InstanceId,State(作业状态),RunningMode(运行模式),ApplicationName(应用名字)等5列。
odps@ yeshan_test>spark list;
StartTime InstanceId State RunningMode ApplicationName
2020-02-09 20:52:14 20200209125214443gpwta5pr2 FAILED default com.aliyun.odps.spark.benchmark.Benchmark
2020-02-10 20:36:32 20200210123631787gu3325pr2 FINISHED default com.aliyun.odps.spark.examples.sparksql.SparkSQL
2020-02-10 20:38:38 20200210123838453gujojv21 FINISHED default SparkPi
2020-02-10 20:40:19 20200210124018718gt87hssa NEW default SparkPi
另外支持-s参数,可以对作业运行状态进行过滤,例如如下的命令可以只列出失败的作业。
odps@ yeshan_test>spark list -s FAILED;
StartTime InstanceId State RunningMode ApplicationName
2020-02-09 20:52:14 20200209125214443gpwta5pr2 FAILED default com.aliyun.odps.spark.benchmark.Benchmark
2、spark info
该命令可以通过InstanceId或者AppId单独查看某一个作业的详细信息,例如我们知道一个Spark作业的InstanceId为20200210123631787gu3325pr2,通过spark info命令,我们可以获取到如下的信息。
odps@ yeshan_test>spark info -i 20200210123631787gu3325pr2;
project: "yeshan_test"
instanceId: "20200210123631787gu3325pr2"
applicationId: "application_1581338179928_1489502267"
applicationTags: ""
runningMode: "default"
applicationType: "SPARK"
yarnApplicationState: 5
finalApplicationStatus: 1
originalTrackingUrl: "http://master396f51a3-3ac1-44c1-937b-450ff524d0c3cupid-11-196-129-13:8088"
trackingUrl: "http://jobview.odps.aliyun.com/proxyview/jobview/?h=http://service.cn.maxcompute.aliyun-inc.com/api&p=yeshan_test&i=20200210123631787gu3325pr2&t=spark&id=application_1581338179928_1489502267&metaname=20200210123631787gu3325pr2&token=eU8xaWRLWFBYcExyMzB4WE9DcUFWcC95cnNFPSxPRFBTX09CTzpwNF8yNDcwNjM5MjQ1NDg0NDc5NzksMTU4MTU5NzQzMCx7IlN0YXRlbWVudCI6W3siQWN0aW9uIjpbIm9kcHM6UmVhZCJdLCJFZmZlY3QiOiJBbGxvdyIsIlJlc291cmNlIjpbImFjczpvZHBzOio6cHJvamVjdHMveWVzaGFuX3Rlc3QvaW5zdGFuY2VzLzIwMjAwMjEwMTIzNjMxNzg3Z3UzMzI1cHIyIl19XSwiVmVyc2lvbiI6IjEifQ=="
diagnostics: ""
applicationName: "com.aliyun.odps.spark.examples.sparksql.SparkSQL"
startedTime: 1581338192231
finishedTime: 1581338272045
从上面的例子中,我们可以看到spark info命令比较详细的给出了相应作业的基本信息,里面有该作业所在的project名字,appId,运行模式,trackingUrl,应用名字以及作业开始结束时间等;
3、spark kill
该命令是通过InstanceId或者AppId来停止一个正在运行的Spark作业,通过InstanceId来kill的话和直接kill InstanceId这个命令是等价的。
odps@ yeshan_test>spark kill -i 20200210130226166gp1525pr2;
please check instance status. [status 20200210130226166gp1525pr2;]
odps@ yeshan_test>spark list -s KILLED;
StartTime InstanceId State RunningMode ApplicationName
2020-02-10 21:02:26 20200210130226166gp1525pr2 KILLED default SparkPi
4、spark view
该命令是可以通过InstanceId或者AppId获取作业的Logview和Jobview链接,这个场景一般在没有保存Logview/Jobview链接或者链接失效时可以用来重新获取。
odps@ yeshan_test>spark view -i 20200210123631787gu3325pr2;
Some env might need to set following flags.
set odps.moye.trackurl.host=****
set odps.cupid.webproxy.endpoint=****
jobview:
http://jobview.odps.aliyun.com/proxyview/jobview/?h=http://service.cn.maxcompute.aliyun-inc.com/api&p=yeshan_test&i=20200210123631787gu3325pr2&t=spark&id=application_1581338179928_1489502267&metaname=20200210123631787gu3325pr2&token=TkpWV0VxZ0tLS29XN2VXd0xMTGRNMVg1elZNPSxPRFBTX09CTzpwNF8yNDcwNjM5MjQ1NDg0NDc5NzksMTU4MTU5ODgxMCx7IlN0YXRlbWVudCI6W3siQWN0aW9uIjpbIm9kcHM6UmVhZCJdLCJFZmZlY3QiOiJBbGxvdyIsIlJlc291cmNlIjpbImFjczpvZHBzOio6cHJvamVjdHMveWVzaGFuX3Rlc3QvaW5zdGFuY2VzLzIwMjAwMjEwMTIzNjMxNzg3Z3UzMzI1cHIyIl19XSwiVmVyc2lvbiI6IjEifQ==
logview:
http://logview.odps.aliyun.com/logview/?h=http://service.cn.maxcompute.aliyun.com/api&p=yeshan_test&i=20200210123631787gu3325pr2&token=cGREcHlQbkxTQnJDR2hrM1RHaVdCTDNRa3ZRPSxPRFBTX09CTzpwNF8yNDcwNjM5MjQ1NDg0NDc5NzksMTU4MTk0NDQxMCx7IlN0YXRlbWVudCI6W3siQWN0aW9uIjpbIm9kcHM6KiJdLCJFZmZlY3QiOiJBbGxvdyIsIlJlc291cmNlIjpbImFjczpvZHBzOio6KiJdfV0sIlZlcnNpb24iOiIxIn0=
5、spark search
该命令是可以通过Spark作业的应用名字来查找这个Project中的Spark作业,例如下面的命令查到了所有名字为SparkPi的作业的InstanceId。有了作业的InstanceId后,通过spark info命令可以获取更详细的作业信息。
odps@ yeshan_test>spark search SparkPi;
instanceId: 20200210123838453gujojv21, appName: SparkPi
instanceId: 20200210124018718gt87hssa, appName: SparkPi