代码之家  ›  专栏  ›  技术社区  ›  Cassie

与bash脚本并行运行多个scala主类

  •  0
  • Cassie  · 技术社区  · 6 年前

    我有一个带有kafka data producer和spark consumer的应用程序,其中kafkaproducer对象扩展了app,sparkconsumer定义了main方法。我想创建一个bash脚本,这样我就可以设置运行哪个类-producer或consumer并并行运行它们。我已经成功地创建了这样一个脚本,但是sbt需要一段时间来加载,而且我需要多次重新启动producer,这比在ide中运行同一个类要长得多。在哪里可以移动sbt命令定义,或者可以选择哪种方法来减少运行应用程序所需的时间?

    P.S.我在不同的终端分别运行消费者和生产者。

    下面是我的bash脚本的样子:

    #!/usr/bin/env bash
    if [ "$1" = "consumer" ]
    then
        sbt "runMain consumer.SparkConsumer $2 $3 $4"
    elif [ "$1" = "producer" ]
    then
        sbt "runMain producer.KafkaProducer $5 $3 $6 $7"
    else
        echo "Wrong parameter. It should be consumer or producer"
    fi
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   FurryMachine    6 年前

    您有几个选择:

    也许你不知道,但是你的SBT将Scala代码编译成Java字节码(A.jar)文件,然后使用它运行它。 java . 所以你可以直接自己做:

    • 运行 sbt package 编译代码
    • 使用运行代码 java -cp "target/scala-<SCALA_VERSION>/<PROJECT_NAME>-<PROJECT_VERSION>.jar" your.main.class.Name

    ( <SCALA_VERSION> , <PROJECT_NAME> , <PROJECT_VERSION> your.main.class.Name 必须用你自己的价值观来代替)

    这将允许您更快地启动命令,因为sbt需要一段时间才能启动。不过,jvm启动时间的开销仍然存在,这就引出了第二个解决方案:

    如果您真的需要快速启动命令,那么我建议您修改scala程序,以便能够从命令行接受任意数量的操作(或通过读取文件),直接在scala代码中并行启动命令。 这很简单: Seq(1, 2, 3, 4).par.foreach{println} 这个 .par 将创建一个parseq,它是一个可以并行运行的序列。您甚至可以配置并行度,但这是另一个问题。

    第三种选择:你可以看看 https://github.com/facebook/nailgun (或任何 similar project )并使用它来减少jvm的启动时间开销。