【问题标题】:Running existing production Java applications in Spark在 Spark 中运行现有的生产 Java 应用程序
【发布时间】:2020-05-23 00:36:11
【问题描述】:

我一直在阅读 Spark,并且对跨可扩展计算集群分配计算的能力非常感兴趣。我们有处理 AMQP 消息处理的生产流处理代码(用 Java 9 编写的 5K 行),我们希望在 Spark 集群中运行。
但是,我觉得我一定误解了 Spark 的基本前提。一方面,它运行 Java,我们应该能够用它运行我们的应用程序,但另一方面(从文档中)似乎(从文档中)所有代码都必须重写为 Spark API(使用 Dataframes/Datasets)。这是真的? Java 应用程序能否按原样与 Spark 一起使用,还是必须重写?这对我们来说似乎是一个主要限制,或者更确切地说是一个阻碍。

我认为,理想情况下,我们希望使用 Spark 来处理高级消息路由(使用结构化流 API),这会将消息传递给我们的 Java 应用程序来处理计算、数据库写入等。我们的代码是单类接口,Spark 可以将消息映射到该类实例。因此,可能会有很多很多实例在每个机器实例内并行处理消息并分布在整个集群中。

我错过了什么吗?

【问题讨论】:

    标签: java apache-spark spark-streaming


    【解决方案1】:

    对于您的问题Java 应用程序能否按原样与 Spark 一起使用,还是必须重写?

    是的,你得重写数据交互层。

    spark 以 rdd/dataframe 的形式读取源数据,在您的情况下是流式 Dataframes/Datasets。

    Spark 并行处理/作业调度基于这些数据集/数据帧

    Dataframes/dataset 相当于一个 Array,在多个节点上存储数据。

    所以如果你在 java 中有一个迭代列表并写入文件的逻辑

    conn=openFile(..)
    Array[value].foreach{
      value-> {
      updatedValue=/**your business logic on the value**/
      conn.write(updatedValue)
      }
    }
    

    在 spark 中你必须处理数据帧

    dataframe[value].map{ value->
            updatedValue =/**your business logic on the value**/  <-- reuse your logic here
          }.saveToFile(/**file path**/)
    

    希望你能看到区别,你可以重用你的业务逻辑, 但火花必须处理数据流读/写(推荐)。

    【讨论】:

    • 感谢您的回答。我可以修改输入/输出部分以使用 RDD。我只关心业务逻辑,Spark 应该(在我看来)与它无关。
    • 我想我的问题更多是关于数千行业务逻辑和 100 多个类,这些都是核心代码内部的。只要这些可以保持原样,我很好。
    • 这有点棘手,当您将逻辑传递给 spark 函数时,任务/数据序列化就会发挥作用。逻辑及其对外部对象的引用必须是闭包序列化的,它必须独立于任何 Spark 集群节点上执行。您必须在代码库中找到一个边界,直到您可以在 spark 函数中运行以及必须在驱动程序节点(您提交 spark 的本地机器)上运行的东西 关于序列化的良好讨论link
    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2018-01-21
    • 2016-03-24
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多