使用bash脚本并行运行多个Scala主类

时间:2018-05-31 11:37:52

标签: linux bash scala sbt

我有一个应用程序与Kafka数据生成器和Spark使用者,其中KafkaProducer对象扩展App和SparkConsumer定义了main方法。我想创建一个bash脚本,以便我可以设置要运行的类 - producer或consumer并行运行它们。我已经设法创建了这样一个脚本,但sbt需要一段时间来加载,我需要多次重启生产者,这比在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 个答案:

答案 0 :(得分:1)

这里有几个选项:

也许你不知道,但是你的sbt将你的Scala代码编译成java字节码(.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开始时间开销。