【问题标题】:How to programmatically get information about executors in PySpark如何以编程方式获取有关 PySpark 中执行程序的信息
【发布时间】:2020-06-23 02:20:51
【问题描述】:

当一个新的 pyspark 应用程序启动时,它会创建一个漂亮的 Web UI,其中包含作业、阶段、执行程序等选项卡。如果我转到执行程序选项卡,我可以看到执行程序的完整列表以及每个执行程序的一些信息 - 例如核心数量、使用的存储内存与总内存等。

我的问题是我是否可以以某种方式以编程方式从应用程序本身访问相同的信息(或至少部分信息),例如看起来像spark.sparkContext.<function_name_to_get_info_about_executors>()

我找到了一些以类似于 webUI 的方式进行 url 请求的解决方法,但我认为我可能缺少更简单的解决方案。

我使用的是 Spark 3.0.0

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    到目前为止,我发现的唯一方法对我来说似乎很老套,并且涉及抓取与 Web UI 查询相同的 url,即这样做:

    import urllib.request
    import json
    sc = spark.sparkContext
    u = sc.uiWebUrl + '/api/v1/applications/' + sc.applicationId + '/allexecutors'
    with urllib.request.urlopen(u) as url:
        executors_data = json.loads(url.read().decode())
    

    【讨论】:

    • 从未想过以这种方式访问​​ UI。这开启了很多可能性。
    【解决方案2】:

    另一种选择是实现SparkListener,它会根据您的需要覆盖一些/所有onExecutor...() 方法,然后在使用--conf spark.extraListeners=<your listener class> 的spark-submit 期间添加它。

    您自己的解决方案也完全合法,它只是利用了 Spark 的 REST API。

    两者都会涉及很多,所以选择你的毒药 - 解析长 JSons 或通过开发者 API 对象的层次结构。

    【讨论】:

    • 我不确定我是否了解如何在此处使用这样的自定义侦听器。想象一下,我遇到了麻烦并用 Java 编写了一个类似的新类。也许该类可以跟踪现有的执行程序,我可以使用spark.extraListeners 启用它。那么这将如何帮助我在 python 中获取这些信息呢?有没有一种简单的方法可以通过 py4j 或类似的方式访问这些额外的侦听器?如果是这样,也许我可以访问其他一些现有的 Java 对象并跳过我需要实现新的SparkListener 的部分?我想执行者信息已经在 J​​ava 中的某个地方可用。
    • 你可能见过类似的 SO stackoverflow.com/questions/44082957/…。我不会说这很容易,但是...
    • 有趣。这解释了很多,但我仍然不明白我们如何使主 python 程序可以访问执行器信息:如果在创建 SparkSession 之后添加了侦听器,那么很可能此时已经添加了执行器(当我们注册一个额外的监听器)。另一方面,如果侦听器是“自动”添加的,例如使用--conf spark.extraListeners 然后python 程序没有直接的监听器对象(与我们使用listener = MyListener() ; sc._jsc.sc().addSparkListener(listener) 的情况相反)。
    猜你喜欢
    • 2011-06-09
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多