【问题标题】:Is it possible to use spark to process complex entities with complex dependencies?是否可以使用 spark 处理具有复杂依赖关系的复杂实体?
【发布时间】:2023-03-13 18:05:01
【问题描述】:

考虑一个场景(对象和依赖是Scala类):

有一组依赖项本身需要实例化大量数据(来自数据库的数据)。 有一组具有复杂嵌套层次结构的对象存储对这些依赖项的引用。

当前的工作流程包括:

  1. 从数据库加载依赖数据并实例化它们 (以一种非常复杂的方式相互依赖)。
  2. 加载对象 来自数据库的数据并使用先前实例化对象 加载的依赖项。
  3. 在对象列表上运行操作,例如:

    a. Search with a complex predicate
    b. Transform
    c. Filter
    d. Save to the database
    e. Reload from the database
    

我们正在考虑在多台机器上运行这些操作。一种选择是使用Spark,但不清楚如何正确支持数据序列化和分发/更新依赖项。

即使我们能够将对象中的逻辑与数据分离(使对象易于序列化),我们想要在对象上运行的函数仍将依赖于上述复杂的依赖关系。

此外,至少目前,我们没有计划使用任何需要在机器之间混洗数据的操作,我们需要的只是分片。

Spark 看起来适合这种情况吗?

  • 如果是,如何处理复杂的依赖关系?
  • 如果不是,希望能提供任何可以处理工作流的替代系统的指针。

【问题讨论】:

    标签: scala apache-spark distributed-computing


    【解决方案1】:

    我不太理解您所说的“复杂的相互依赖关系”是什么意思,但似乎如果您只需要分片,您不会真正从 spark 中获得太多收益 - 只需运行多个您有的任何东西,使用队列来同步工作并将需要处理的分片分发到每个副本。

    我们做了类似的事情,将 pySpark jot 转换为 Kubernetes 设置,其中队列保存 id 列表,然后我们有多个 pod(我们通过 kubectl 控制规模)从该队列读取并获得更好的性能和更简单的解决方案- 见https://kubernetes.io/docs/tasks/job/coarse-parallel-processing-work-queue/

    【讨论】:

    • 感谢您的回答!通过复杂的相互依赖关系,我的意思是实例化它们是一个非常复杂的逻辑,需要从数据库中加载许多部分,膨胀并正确连接不同的部分。我们已经考虑过 Kubernetes(甚至构建了一个原型),但它需要我们的工作来正确同步 pod、处理故障、管理任务优先级等等。一切都可行,但 spark 内置了这个功能,因此我们希望更好地了解加入 spark 与构建更狭窄的内部解决方案的成本。
    • spark 不是为了控制逻辑的哪一部分将在哪个节点上运行而构建的——您需要构建所有东西,就好像它可以放在一台机器中一样,然后让 spark 担心在分布式方式。如果您需要更精细的控制,请查看 heron 或内存数据网格
    • 是的,但是为了分发工作火花需要我的数据是可序列化的。本质上,RDD 中的每个对象都有一个对依赖项的引用,这将导致非常复杂的序列化。如果我将数据与逻辑解耦并且只将数据放在 RDD 中,那么逻辑(例如传递给 map 或 filter 的函数)仍然依赖于依赖关系。这是否意味着对 RDD.map(f)/filter(f)/whatever(f) 的每次调用都会导致 f 的完全序列化,包括我上面提到的依赖项?本质上它会很昂贵?
    • 大多数情况下,您希望使用数据集(或数据帧)而不是 RDD,因为 spark 可以更好地优化它们。尽管如此,您定义的任何 udf 都需要被序列化,并且您应该努力将您的依赖项也定义为数据集,然后尽可能地实现类似 sql(连接、联合等)的操作
    • 我认为另一种选择是将依赖项设为广播变量并在 udfs 中使用它。
    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 2012-07-28
    • 2014-05-27
    • 2013-11-07
    • 2019-04-18
    相关资源
    最近更新 更多