【问题标题】:Apache spark, is it possible to have Google guice as dependency injection techniqueApache spark,是否可以将 Google guice 作为依赖注入技术
【发布时间】:2022-05-07 23:14:18
【问题描述】:

是否可以使用 Google guice 作为 Apache spark Java 应用程序的依赖注入提供程序?

如果执行发生在驱动程序上,但无法控制执行何时发生在执行程序上,我能够实现这一点。

甚至可以在执行程序中使用注入的对象吗?如果没有 spark 应用程序中的依赖注入,很难管理代码。

【问题讨论】:

    标签: java apache-spark dependency-injection guice


    【解决方案1】:

    我认为the neutrino framework 完全符合您的要求。

    免责声明:我是 neutrino 框架的作者。

    该框架提供了使用依赖注入 (DI) 来生成对象并在驱动程序和执行程序中控制它们的范围的能力。

    它是如何做到的

    众所周知,要采用 DI 框架,首先需要构建一个依赖图,它描述了各种类型之间的依赖关系,可以用来生成实例及其依赖关系。 Guice 使用 Module API 来构建图形,而 Spring 框架使用 XML 文件或注释。 neutrino 是基于 Guice 框架构建的,当然也使用 guice 模块 API 构建依赖图。它不仅将图形保留在驱动程序中,而且还在每个执行程序上运行相同的图形。

    在依赖图中,一些节点可能会生成对象,这些对象可能会传递给执行器,neutrino 框架会为这些节点分配唯一的 id。由于每个 JVM 都具有相同的图,因此每个 JVM 上的图具有相同的节点 ID 集。 当驱动程序从图中请求要传输的实例时,它不会创建实际实例,而是返回一个包含对象创建方法(包括节点 ID)的存根对象。当存根对象被传递给执行器时,框架会在执行器 JVM 中的图中找到对应的节点,并在其中重新创建相同的对象及其依赖项。

    这是一个例子:

    例子:

    这是一个简单的例子(只是根据redis数据过滤一个事件流):

    trait EventFilter[T] {
        def filter(t: T): Boolean
    }
    
    // The RedisEventFilter class depends on JedisCommands directly,
    // and doesn't extend `java.io.Serializable` interface.
    class RedisEventFilter @Inject()(jedis: JedisCommands)
    extends EventFilter[ClickEvent] {
       override def filter(e: ClickEvent): Boolean = {
           // filter logic based on redis
       }
    }
    
    /* create injector */
    val injector = ...
    
    val eventFilter = injector.instance[EventFilter[ClickEvent]]
    val eventStream: DStream[ClickEvent] = ...
    eventStream.filter(e => eventFilter.filter(e))
    

    以下是配置绑定的方法:

    class FilterModule(redisConfig: RedisConfig) extends SparkModule {
       override def configure(): Unit = {
           // the magic is here
           // The method `withSerializableProxy` will generate a proxy 
           // extending `EventFilter` and `java.io.Serializable` interfaces with Scala macro.
           // The module must extend `SparkModule` or `SparkPrivateModule` to get it
           bind[EventFilter[ClickEvent]].withSerializableProxy
               .to[RedisEventFilter].in[SingletonScope]
       }
    }
    

    对于中微子,RedisEventFilter 甚至不关心序列化问题。每件事都像在单个 JVM 中一样工作。

    详情请参考the neutrino readme file

    局限性

    由于该框架使用scala macro 来生成代理类,因此guice 模块以及如何连接这些模块的逻辑需要使用scala 编写。其他类如 EventFilter 及其实现可以是 java.util.

    【讨论】:

      猜你喜欢
      • 2018-05-03
      • 2011-06-18
      • 2019-09-04
      • 2011-01-02
      • 2011-03-22
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多