
# Spark REST API接口介绍
#### 功能简介
Spark的REST API以JSON格式展现Web UI的一些指标，提供用户一种更简单的方法去创建新的展示和监控的工具，并且支持查询正在运行的app和已经结束的app的相关信息。开源的Spark REST接口支持对Jobs、Stages、Storage、Environment和Executors的信息进行查询，MRS版本中添加了查询SQL、JDBC/ODBC Server和Streaming的信息的REST接口。开源REST接口完整和详细的描述请参考官网上的文档以了解其使用方法：<https://archive.apache.org/dist/spark/docs/2.2.2/monitoring.html#rest-api>。
#### 准备运行环境
安装客户端。在节点上安装客户端，如安装到"/opt/client"目录。
1. 确认服务端Spark组件已经安装，并正常运行。
2. 客户端运行环境已安装1.7或1.8版本的JDK。
3. 获取并解压缩安装包"MRS_Spark_Client.tar"。执行如下命令解压。 **tar -xvf** **MRS_Spark_Client.tar**
   **tar -xvf** **MRS_Spark_ClientConfig.tar**
   ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
   由于不兼容老版本客户端，建议用户获取与服务端集群相同版本的客户端安装包进行安装部署。
   
4. 进入解压文件夹，即"MRS_Spark_ClientConfig"，执行下列命令安装客户端 **sh** **install.sh /opt/client**
   其中"/opt/client"为用户自定义路径，此处仅为举例。
   
5. 进入客户端安装目录"/opt/client"，执行下列命令初始化环境变量。 **source** **bigdata_env**
   
 
#### REST接口
通过以下命令可跳过REST接口过滤器获取相应的应用信息。
- 获取JobHistory中所有应用信息：
  - 命令：
    ```
    curl https://192.168.227.16:18080/api/v1/applications?mode=monitoring --insecure
    ```
    其中192.168.227.16为JobHistory节点的业务IP，18080为JobHistory的端口号。
    
  
  - 结果：
    ```
    [ {
    "id" : "application_1478570725074_0042",
    "name" : "Spark-JDBCServer",
    "attempts" : [ {
    "startTime" : "2016-11-09T16:57:15.237CST",
    "endTime" : "2016-11-09T17:01:22.573CST",
    "lastUpdated" : "2016-11-09T17:01:22.614CST",
    "duration" : 247336,
    "sparkUser" : "spark",
    "completed" : true
    } ]
    }, {
    "id" : "application_1478570725074_0047-part1",
    "name" : "SparkSQL::192.168.169.84",
    "attempts" : [ {
    "startTime" : "2016-11-10T11:57:36.626CST",
    "endTime" : "1969-12-31T07:59:59.999CST",
    "lastUpdated" : "2016-11-10T11:57:48.613CST",
    "duration" : 0,
    "sparkUser" : "admin",
    "completed" : false
    } ]
    }]
    ```
    
  
  - 结果分析： 通过这个命令，可以查询当前集群中所有的Spark应用（包括正在运行的应用和已经完成的应用），每个应用的信息如下[表 1] 。
     表1应用常用信息 
    | 参数       | 描述                              |
    |:---|:---|
    | id       | 应用的ID                           |
    | name     | 应用的Name                         |
    | attempts | 应用的尝试，包含了开始时间、结束时间、执行用户、是否完成等信息 |
       
    
   
- 获取JobHistory中某个应用的信息：
  - 命令：
    ```
    curl https://192.168.227.16:18080/api/v1/applications/application_1478570725074_0042?mode=monitoring --insecure
    ```
    其中192.168.227.16为JobHistory节点的业务IP，18080为JobHistory的端口号，application_1478570725074_0042为应用的id。
    
  
  - 结果：
    ```
    {
    "id" : "application_1478570725074_0042",
    "name" : "Spark-JDBCServer",
    "attempts" : [ {
    "startTime" : "2016-11-09T16:57:15.237CST",
    "endTime" : "2016-11-09T17:01:22.573CST",
    "lastUpdated" : "2016-11-09T17:01:22.614CST",
    "duration" : 247336,
    "sparkUser" : "spark",
    "completed" : true
    } ]
    }
    ```
    
  
  - 结果分析： 通过这个命令，可以查询某个Spark应用的信息，显示的信息如[表1]所示。
    
   
- 获取正在执行的某个应用的Executor信息：
  - 针对alive executor命令：
    ```
    curl https://192.168.169.84:26001/proxy/application_1478570725074_0046/api/v1/applications/application_1478570725074_0046/executors?mode=monitoring --insecure
    ```
    
  
  - 针对全部executor（alive\&dead）命令：
    ```
    curl https://192.168.169.84:26001/proxy/application_1478570725074_0046/api/v1/applications/application_1478570725074_0046/allexecutors?mode=monitoring --insecure
    ```
    其中192.168.195.232为ResourceManager主节点的业务IP，26001为ResourceManager的端口号，application_1478570725074_0046为在YARN中的应用ID。
    
  
  - 结果：
    ```
    [{
    "id" : "driver",
    "hostPort" : "192.168.169.84:23886",
    "isActive" : true,
    "rddBlocks" : 0,
    "memoryUsed" : 0,
    "diskUsed" : 0,
    "activeTasks" : 0,
    "failedTasks" : 0,
    "completedTasks" : 0,
    "totalTasks" : 0,
    "totalDuration" : 0,
    "totalInputBytes" : 0,
    "totalShuffleRead" : 0,
    "totalShuffleWrite" : 0,
    "maxMemory" : 278019440,
    "executorLogs" : { }
    }, {
    "id" : "1",
    "hostPort" : "192.168.169.84:23902",
    "isActive" : true,
    "rddBlocks" : 0,
    "memoryUsed" : 0,
    "diskUsed" : 0,
    "activeTasks" : 0,
    "failedTasks" : 0,
    "completedTasks" : 0,
    "totalTasks" : 0,
    "totalDuration" : 0,
    "totalInputBytes" : 0,
    "totalShuffleRead" : 0,
    "totalShuffleWrite" : 0,
    "maxMemory" : 555755765,
    "executorLogs" : {
    "stdout" : "https://XTJ-224:26010/node/containerlogs/container_1478570725074_0049_01_000002/admin/stdout?start=-4096",
    "stderr" : "https://XTJ-224:26010/node/containerlogs/container_1478570725074_0049_01_000002/admin/stderr?start=-4096"
    }
    } ]
    ```
    
  
  - 结果分析： 通过这个命令，可以查询当前应用的所有Executor信息（包括Driver），每个Executor的信息包含如下[表 2]所示的常用信息。
     表2Executor常用信息 
    | 参数           | 描述                 |
    |:---|:---|
    | id           | Executor的ID        |
    | hostPort     | Executor所在节点的ip：端口 |
    | executorLogs | Executor的日志查看路径    |
       
    
   
 
#### REST API增强
- SQL相关的命令：获取所有SQL语句和执行时间最长的SQL语句
  - SparkUI命令：
    ```
    curl https://192.168.195.232:26001/proxy/application_1476947670799_0053/api/v1/applications/Spark-JDBCServerapplication_1476947670799_0053/SQL?mode=monitoring --insecure
    ```
    其中192.168.195.232为ResourceManager主节点的业务IP，26001为ResourceManager的端口号，application_1476947670799_0053为在YARN中的应用ID，Spark-JDBCServer是Spark应用的name。
    
  
  - JobHistory命令：
    ```
    curl https://192.168.227.16:22500/api/v1/applications/application_1478570725074_0004-part1/SQL?mode=monitoring --insecure
    ```
    其中192.168.227.16为JobHistory节点的业务IP，22500为JobHistory的端口号，application_1478570725074_0004-part1为应用ID。
    
  
  - 结果： SparkUI命令和JobHistory命令的查询结果均为：
    ```
    {
    "longestDurationOfCompletedSQL" : [ {
    "id" : 0,
    "status" : "COMPLETED",
    "description" : "getCallSite at SQLExecution.scala:48",
    "submissionTime" : "2016/11/08 15:39:00",
    "duration" : "2 s",
    "runningJobs" : [ ],
    "successedJobs" : [ 0 ],
    "failedJobs" : [ ]
    } ],
    "sqls" : [ {
    "id" : 0,
    "status" : "COMPLETED",
    "description" : "getCallSite at SQLExecution.scala:48",
    "submissionTime" : "2016/11/08 15:39:00",
    "duration" : "2 s",
    "runningJobs" : [ ],
    "successedJobs" : [ 0 ],
    "failedJobs" : [ ]
    }]
    }
    ```
    
  
  - 结果分析： 通过这个命令，可以查询当前应用的所有SQL语句的信息（即结果中"sqls"的部分），执行时间最长的SQL语句的信息（即结果中"longestDurationOfCompletedSQL"的部分）。每个SQL语句的信息如下表3。
    表3SQL的常用信息 
    | 参数            | 描述                                     |
    |:---|:---|
    | id            | SQL语句的ID                               |
    | status        | SQL语句的执行状态，有RUNNING、COMPLETED、FAILED三种 |
    | runningJobs   | SQL语句产生的job中，正在执行的job列表                |
    | successedJobs | SQL语句产生的job中，执行成功的job列表                |
    | failedJobs    | SQL语句产生的job中，执行失败的job列表                |
       
    
   
 
- JDBC/ODBC Server相关的命令：获取连接数，正在执行的SQL数，所有session信息，所有SQL的信息
  - 命令：
    ```
    curl https://192.168.195.232:26001/proxy/application_1476947670799_0053/api/v1/applications/application_1476947670799_0053/sqlserver?mode=monitoring --insecure
    ```
    其中192.168.195.232为ResourceManager主节点的业务IP，26001为ResourceManager的端口号，application_1476947670799_0053为在YARN中的应用ID。
    
  
  - 结果：
    ```
    {
    "sessionNum" : 1,
    "runningSqlNum" : 0,
    "sessions" : [ {
    "user" : "spark",
    "ip" : "192.168.169.84",
    "sessionId" : "9dfec575-48b4-4187-876a-71711d3d7a97",
    "startTime" : "2016/10/29 15:21:10",
    "finishTime" : "",
    "duration" : "1 minute 50 seconds",
    "totalExecute" : 1
    } ],
    "sqls" : [ {
    "user" : "spark",
    "jobId" : [ ],
    "groupId" : "e49ff81a-230f-4892-a209-a48abea2d969",
    "startTime" : "2016/10/29 15:21:13",
    "finishTime" : "2016/10/29 15:21:14",
    "duration" : "555 ms",
    "statement" : "show tables",
    "state" : "FINISHED",
    "detail" : "== Parsed Logical Plan ==\nShowTablesCommand None\n\n== Analyzed Logical Plan ==\ntableName: string, isTemporary: boolean\nShowTablesCommand None\n\n== Cached Logical Plan ==\nShowTablesCommand None\n\n== Optimized Logical Plan ==\nShowTablesCommand None\n\n== Physical Plan ==\nExecutedCommand ShowTablesCommand None\n\nCode Generation: true"
    } ]
    }
    ```
    
  
  - 结果分析： 通过这个命令，可以查询当前JDBC/ODBC应用的session连接数，正在执行的SQL数，所有的session和SQL信息。每个session的信息如下[表 4]，每个SQL的信息如下[表5]。
     表4session常用信息 
    | 参数           | 描述                |
    |:---|:---|
    | user         | 该session连接的用户     |
    | ip           | session所在的节点IP    |
    | sessionId    | session的ID        |
    | startTime    | session开始连接的时间    |
    | finishTime   | session结束连接的时间    |
    | duration     | session连接时长       |
    | totalExecute | 在该session上执行的SQL数 |
       
     表5sql常用信息 
    | 参数         | 描述               |
    |:---|:---|
    | user       | SQL执行的用户         |
    | jobId      | SQL语句包含的job id列表 |
    | groupId    | SQL所在的group id   |
    | startTime  | SQL开始时间          |
    | finishTime | SQL结束时间          |
    | duration   | SQL执行时长          |
    | statement  | 对应的语句            |
    | detail     | 对应的逻辑计划，物理计划     |
       
    
   
- Streaming相关的命令：获取平均输入频率，平均调度时延，平均执行时长，总时延平均值
  - 命令：
    ```
    curl https://192.168.195.232:26001/proxy/application_1477722033672_0008/api/v1/applications/NetworkWordCountapplication_1477722033672_0008/streaming?mode=monitoring --insecure
    ```
    其中192.168.195.232为ResourceManager主节点的业务IP，26001为ResourceManager的端口号，application_1477722033672_0008为在YARN中的应用ID，NetworkWordCount是Spark应用的name。
    
  
  - 结果：
    ```
    {
    "avgInputRate" : "0.00 events/sec",
    "avgSchedulingDelay" : "1 ms",
    "avgProcessingTime" : "72 ms",
    "avgTotalDelay" : "73 ms"
    }
    ```
    
  
  - 结果分析： 通过这个命令，可以查询当前Streaming应用的平均输入频率，平均调度时延，平均执行时长，总时延平均值。
    
   
 
