如何访问 Spark Streaming 应用程序的统计端点?

How to access statistics endpoint for a Spark Streaming application?

从 Spark 2.2.0 开始,API 中有新的端点用于获取有关流作业的信息。

I 运行 EMR 集群上的 Spark,在集群模式下使用 Spark 2.2.0。

当我到达我的流媒体作业的终点时,它给我的只是错误消息:

no streaming listener attached to <stream name>

我已经深入研究了 Spark 代码库,但没有很好地记录此功能。所以我很好奇这是否是一个错误?我需要做一些配置才能让这个端点正常工作吗?


这似乎是一个问题,特别是在群集上 运行ning 时。在我本地计算机上的 Spark 2.2.0 上,相同的代码 运行ning 显示了预期的统计信息,但在集群上 运行 时给出了该错误消息。

我正在使用最新的 Spark 2.3.0-SNAPSHOT 今天从大师 YMMV 构建。效果很好。

Is there some configuration I need to do to get this endpoint working?

没有。它应该在不更改默认配置的情况下正常工作。

确保您使用驱动程序的主机和端口(因为 谣言 是您还可以访问 18080 显示所有相同的端点和相同的作业 运行ning,但未附加流式侦听器)。


正如您在 source code where the error message lives 中看到的那样,只有当 ui.getStreamingJobProgressListener 尚未注册(最终在 case None 中)时才会发生。

所以现在的问题是为什么 SparkListener 不被注册?

这将我们带到 streamingJobProgressListener var that is set using setStreamingJobProgressListener method exclusively while StreamingTab is being instantiated(这就是我问您是否可以看到“流式传输”选项卡的原因)。

换句话说,如果您在 Web UI 中看到“流式处理”选项卡,则表示流式处理指标端点可用。将 URL 检查到应采用以下格式的端点:

http://[driverHost]:[port]/api/v1/applications/[appId]/streaming/statistics

我尝试重现您的案例并执行了以下操作,使我找到了一个可行的案例。

  1. 启动了Spark Streaming应用程序的官方示例之一。

    $ ./bin/run-example streaming.StatefulNetworkWordCount localhost 9999
    

    我先做了运行nc -lk 9999

  2. 打开网络 UI @ http://localhost:4040/streaming 以确保 Streaming 选项卡存在。

  3. 确保 http://localhost:4040/api/v1/applications/ 使用应用程序 ID 进行响应。

    $ http http://localhost:4040/api/v1/applications/
    HTTP/1.1 200 OK
    Content-Encoding: gzip
    Content-Length: 266
    Content-Type: application/json
    Date: Wed, 13 Dec 2017 07:58:04 GMT
    Server: Jetty(9.3.z-SNAPSHOT)
    Vary: Accept-Encoding, User-Agent
    
    [
        {
            "attempts": [
                {
                    "appSparkVersion": "2.3.0-SNAPSHOT",
                    "completed": false,
                    "duration": 0,
                    "endTime": "1969-12-31T23:59:59.999GMT",
                    "endTimeEpoch": -1,
                    "lastUpdated": "2017-12-13T07:53:53.751GMT",
                    "lastUpdatedEpoch": 1513151633751,
                    "sparkUser": "jacek",
                    "startTime": "2017-12-13T07:53:53.751GMT",
                    "startTimeEpoch": 1513151633751
                }
            ],
            "id": "local-1513151634282",
            "name": "StatefulNetworkWordCount"
        }
    ]
    
  4. 访问了 Spark Streaming 应用程序的端点@http://localhost:4040/api/v1/applications/local-1513151634282/streaming/statistics

    $ http http://localhost:4040/api/v1/applications/local-1513151634282/streaming/statistics
    HTTP/1.1 200 OK
    Content-Encoding: gzip
    Content-Length: 219
    Content-Type: application/json
    Date: Wed, 13 Dec 2017 08:00:10 GMT
    Server: Jetty(9.3.z-SNAPSHOT)
    Vary: Accept-Encoding, User-Agent
    
    {
        "avgInputRate": 0.0,
        "avgProcessingTime": 30,
        "avgSchedulingDelay": 0,
        "avgTotalDelay": 30,
        "batchDuration": 1000,
        "numActiveBatches": 0,
        "numActiveReceivers": 1,
        "numInactiveReceivers": 0,
        "numProcessedRecords": 0,
        "numReceivedRecords": 0,
        "numReceivers": 1,
        "numRetainedCompletedBatches": 376,
        "numTotalCompletedBatches": 376,
        "startTime": "2017-12-13T07:53:54.921GMT"
    }
    

长话短说;博士 只需前往: http://localhost:4040/streaming

有同样的问题。我 运行 从 Pycharm Python 虚拟环境启动应用程序。 Spark 报告端口 4040 已被占用:

Spark context Web UI available at http://192.168.100.221:4042

但我在那里没有看到任何工作,并且缺少“流媒体”选项卡。 然后我去了 http://localhost:4040/streaming 瞧,一切都在那里。