gpt4 book ai didi

scala - 为什么 Spark Streaming 应用程序使用 sbt run 可以正常工作,但不能在 Tomcat(作为 Web 应用程序)上运行?

转载 作者:行者123 更新时间:2023-11-28 21:59:37 25 4
gpt4 key购买 nike

我在 Scala 中有一个 Spark 应用程序,它每 10 秒从 Kafka 抓取一次记录并将它们保存为文件。这是 SBT 项目,我使用 sbt run 命令运行我的应用程序。一切正常,直到我在 Tomcat 上部署我的应用程序。我设法用 this plugin 生成了 WAR 文件但看起来我的应用在部署到 Tomcat 上时没有执行任何操作。
这是我的代码:

object SparkConsumer {
def main (args: Array[String]) {

val conf = new SparkConf().setMaster("local[*]").setAppName("KafkaReceiver")
val ssc = new StreamingContext(conf, Seconds(10))


val kafkaParams = Map[String, Object](
"bootstrap.servers" -> "localhost:9092",
"key.deserializer" -> classOf[StringDeserializer],
"value.deserializer" -> classOf[StringDeserializer],
"group.id" -> "group_id",
"auto.offset.reset" -> "latest",
"enable.auto.commit" -> (false: java.lang.Boolean)
)
val topics = Array("mytopic")
val stream = KafkaUtils.createDirectStream[String, String](
ssc,
PreferConsistent,
Subscribe[String, String](topics, kafkaParams)
)

stream.map(record => (record.key, record.value)).print

val arr = new ArrayBuffer[String]();

val lines = stream.map(record => (record.key, record.value));

stream.foreachRDD { rdd =>

if (rdd.count() > 0 ) {
val date = System.currentTimeMillis()
rdd.saveAsTextFile ("/tmp/sparkout/mytopic/" + date.toString)
rdd.foreach { record => println("t=" + record.topic + " m=" + record.toString()) }
}

println("Stream had " + rdd.count() + " messages")

val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
rdd.foreachPartition { iter =>
val o: OffsetRange = offsetRanges(TaskContext.get.partitionId)
println(s"${o.topic} ${o.partition} ${o.fromOffset} ${o.untilOffset}")
println(o)
}
}

stream.saveAsTextFiles("/tmp/output")


ssc.start()
ssc.awaitTermination()
}
}

奇怪的是,当通过 sbt run 命令运行时,该应用程序完全正常运行。它从 Kafka 正确读取记录并将它们保存为所需目录中的文件。我不知道发生了什么。我尝试使用 log4j 启用日志记录,但在 Tomcat 上它甚至不记录任何内容。我一直在寻找答案,但还没有找到解决方案。

总结

我的 Scala Spark 应用程序(这是 SBT 项目)应该每 10 秒从 Kafka 读取记录并将它们保存为文件。它在通过 sbt run 命令运行时有效,但在部署在 Tomcat 上时无效。

附加信息:

  • Scala 2.12
  • Tomcat 7
  • SBT 0.13.15
  • 要求更多

问:问题是什么?

最佳答案

tl;dr 独立应用程序 SparkConsumer 在 Tomcat 上表现正常,Tomcat 本身也是如此。

读到这个问题我感到非常惊讶,因为您的代码不是我期望在 Tomcat 上曾经工作的代码。对不起。

Tomcat 是一个 servlet 容器,因此在 Web 应用程序中需要 servlet。

即使您设法创建了一个 WAR 并将其部署到 Tomcat,您也没有从该 Web 应用程序“触发”任何东西来启动 Spark Streaming 应用程序(main 方法中的代码)。

Spark Streaming 应用程序在使用 sbt run 执行时工作正常,因为这是 sbt run 的目标,即在 sbt 管理的项目中执行独立应用程序。

鉴于您的 sbt 项目中只有一个独立的应用程序,sbt run 已设法找到 SparkConsumer 并执行其 main 入口方法。不足为奇。

然而,它不适用于 Tomcat。您必须将应用程序公开为 POST 或 GET 端点,并使用 HTTP 客户端(浏览器或命令行工具,如 curl、wget 或 httpie)来执行它。

Spark 不支持 Scala 2.12,所以...您是如何设法将 Scala 版本与 Spark 一起使用的?! 不可能!

关于scala - 为什么 Spark Streaming 应用程序使用 sbt run 可以正常工作,但不能在 Tomcat(作为 Web 应用程序)上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44040774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com