【问题标题】:Spark: Determine the driver address from within a taskSpark:从任务中确定驱动程序地址
【发布时间】:2016-08-27 05:41:43
【问题描述】:

出于调试目的,我想将来自 spark 任务(在执行程序中运行)的消息发送到驱动程序机器。 docs 声称 spark.driver.host 包含此信息,但我不知道如何从工作人员(或从驱动程序,就此而言......)访问它

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:
    sc.getConf.get("spark.driver.host")
    

    但驱动程序不是您需要的。你需要一个工人。所以在你的 rdd.mapPartitions 块中尝试这样的代码:

    val localhost = java.net.InetAddress.getLocalHost
    val ip = java.net.NetworkInterface.getByInetAddress(localhost)
    

    查看this 以获得更精确的方法。

    【讨论】:

    • 感谢您的回答。我的问题措辞不当(对此感到抱歉;现在问题已解决)——我希望工作人员知道 driver IP。但我现在看到有一个非常简单的解决方案:只需使用广播变量(或 Python 中的全局常量)将驱动程序 IP 广播给工作人员。我想我有一个解决方案。
    【解决方案2】:

    只需通过捕获的全局变量将驱动程序的 IP 传递给工作人员:

    import socket
    driver_ip_addr = socket.gethostbyname(socket.gethostname())
    
    def process_data(data):
        # Do some work ...
        send_log_msg(driver_ip_addr, "hello!")
        # Do some more work...
    
    processed_data = my_rdd.map(process_data).collect()
    

    【讨论】:

    • 最好将ip广播给所有worker val broadcastIP= spark.sparkContext.broadcast(ip) 然后我们可以通过val ip = broadcastIP.value.get(ip).get 轻松获取ip
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2010-12-07
    • 2019-03-06
    • 1970-01-01
    • 2018-12-07
    相关资源
    最近更新 更多