我有一个应用程序与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
答案 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开始时间开销。