【问题标题】:Spark/Gradle -- Getting IP Address in build.gradle to use for starting master and workersSpark/Gradle -- 在 build.gradle 中获取 IP 地址以用于启动 master 和 worker
【发布时间】:2016-01-13 23:14:35
【问题描述】:

我基本了解 build.gradle 构建脚本的各个移动部分,但无法将它们结合在一起。

在 Apache Spark 独立模式下,只是尝试从 build.gradle 在同一个盒子上启动 master 和 worker。 (稍后将通过 $SPARK_HOME/sbin/start-slaves 调用扩展,并使用 masterIP 的正确参数。)

问题:如何将我的 IP 地址分配给 Groovy/build.gradle 中的变量,以便将其传递给 Exec 任务中的命令?我们希望它在几个不同的开发机器上运行。

我们有一个(我认为相当标准的)/etc/hosts 配置,其中 FQDN 和主机名分配给 127.0.1.1。驱动程序可以解决这个问题,但不能使用主机名启动主从服务器,我需要 IP 地址。

我正在尝试:

task getMasterIP (type: Exec){
    // declare script scope variable using no def or
    executable "hostname"
    args += "-I"

    // need results of hostname call assigned to script scope variable
    sparkMasterIP = <resultsOfHostnameCall>
}

// added this because startSlave stops if Master is already running
task startSlaveOnly(dependsOn:'getMasterIP', type: Exec){
    executable "/usr/local/spark/sbin/start-slave.sh"
    args += "spark://$sparkMasterIP:7077"
    doLast {
        println "enslaved"
    }
}

// now make startSlave call startSlaveOnly after the initial startMaster
task startSlave(dependsOn:'startMaster', type: Exec) {
    finalizedBy 'startSlaveOnly'
}

当我尝试something like suggested in the docs for Exec for Groovy calls

task getMasterIP (type: Exec){
    // declare script scope variable using no def or
    sparkMasterIP = executable "hostname"
    args += "-I"
}

我收到无法识别可执行文件的警告。


“关于我的想法的更多背景信息”部分,不是主要问题。

谷歌搜索“build.gradle 脚本范围变量”并查看前两个结果,in the basic docs I only see one type of variable and ext properties to be used

16.4。声明变量 -- 在构建脚本中可以声明两种变量:局部变量和额外属性。

但是在这个other Gradle doc Appendix B. Potential Traps 中,除了 ext 属性之外,我还看到了两种变量作用域:

对于 Gradle 用户来说,了解 Groovy 如何处理非常重要 脚本变量。 Groovy 有两种类型的脚本变量。一个带一个 本地范围和脚本范围的范围。

通过这个示例用法:

String localScope1 = 'localScope1'
def localScope2 = 'localScope2'
scriptScope = 'scriptScope'

我假设我应该使用没有“def”或类型声明的脚本范围变量。对完全不同的方法完全开放,谢谢。

【问题讨论】:

  • 你试过ext.scriptScope吗?
  • 当我阅读整个问题时,我不确定您是在问如何获取 localIP,还是关于变量范围..
  • @tim_yates 这是用户定义的 ext 上的属性,称为 scriptScope 吗?如果我能将我的 IP 分配给它,我会很高兴
  • @RaGe 核心问题是“问题:如何将我的 IP 地址分配给 Groovy/build.gradle 中的变量,以便我可以将其传递给 Exec 任务中的命令?我们希望它运行在几个不同的开发机器上。”我只是在解释我对使用哪种类型的变量的想法,并说我愿意接受所有级别的建议和更正,谢谢!
  • 我只是标记了我自己的问题以改进它,欢迎提出建议。

标签: groovy gradle apache-spark build.gradle master


【解决方案1】:

获取本地 IP:

//return all v4 addresses 
def getLocalIPv4() {
    def ip4s = []
    NetworkInterface.getNetworkInterfaces()
            .findAll { it.isUp() && !it.isLoopback() && !it.isVirtual() }
            .each {
        it.getInetAddresses()
                .findAll { !it.isLoopbackAddress() && it instanceof Inet4Address }
                .each { ip4s << it }
    }
    return ip4s
}

//optionally, return all ipv6 addresses
def getLocalIPv6() {
    def ip6s = []
    NetworkInterface.getNetworkInterfaces()
            .findAll { it.isUp() && !it.isLoopback() && !it.isVirtual() }
            .each {
        it.getInetAddresses()
                .findAll { !it.isLoopbackAddress() && it instanceof Inet6Address }
                .each { ip6s << it }
    }
    return ip6s
}



task printIP()<<{
    println getLocalIPv4()
    println getLocalIPv6()
}

上面的两个函数分别返回一个 ipv4 或 ipv6 地址列表。您可能会注意到我跳过了所有本地主机、未启动的接口、所有环回和虚拟接口。如果要使用第一个 ipv4 地址,可以在别处使用:

getLocalIPv4()[0]

或者在你的情况下:

args += "spark:/"+ getLocalIPv4()[0] + ":7077"

【讨论】:

  • 哇,太棒了,谢谢!我假设我可以把它放在一个 build.gradle 任务中并将它分配给一个变量?让我测试一下……
  • 我已将您的函数放入 build.gradle。然后我在你的函数之后添加了 def sparkMasterIP = getLocalIP() 行(并在任务中尝试过)我在任务中指的是它,但任务不可用。如果您可以在任务 startSlaveOnly 中以我想要的方式展示如何在任务中使用此结果,我会接受这个答案,谢谢!
  • 这个函数我只打印IP,不返回,等我能到电脑上再更新。
  • 已更新,现在更时髦了!
  • 将行从{ ip4s &lt;&lt; it}更改为.each { ip4s &lt;&lt; it.getHostAddress() }以摆脱领先的/
【解决方案2】:

I found this post that appears to be a more straightforward way 这样做,但仅限于 Linux 平台,主机名 - 我不能在 Windows 中工作,也许不是所有的 Linux 发行版?

  • 获取主机名
  • 将其分配给变量
  • 在 build.gradle 中使用 任务

这是我构建的任务,公认的答案更好,更普遍,这只是另一种看待它的方式

task getMasterIP{
        doLast {
            new ByteArrayOutputStream().withStream { os ->
                def result = exec {
                    executable = 'hostname'
                    args += '-I'
                }
                ext.ipAddress = os.toString()
            }
        }
}

RaGe 的答案在查看所有平台上的所有接口方面做得更好

【讨论】:

  • 好挑剔...您的答案也有很好的更新,已接受。与平台无关是一件好事,感谢您指出这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 2015-04-16
  • 2014-09-27
相关资源
最近更新 更多