在 Spring 启动应用程序中获取 h2o MOJO 模型(zip 文件)

Picking up the h2o MOJO model (zip file) in a Spring boot App

我正在编写一个 Spring 启动应用程序 (java class),它调用另一个 java class 中的 H2o 预测方法。

我已经独立测试了这个 java class,如果 MOJO 模型与调用 java 的位置相同,我可以读取它并且我可以做出预测。

使用Spring启动应用程序,这次我的maven项目编译生成的jar无法读取那个zip。 我使用标准方式使用 Wrapper h2o 提供的方式读取 MOJO zip 文件。

EasyPredictModelWrapper model = new EasyPredictModelWrapper(MojoModel.load("DRF_model_python_1504558159175_1.zip"));

我的 Maven 项目结构如下所示:

Spring boot App 生成的 jar 也包含如下所示的 zip:

我不明白为什么它会给我找不到 MOJO zip 文件的错误(这是一个 IO 异常)。

File DRF_model_python_1504558159175_1.zip cannot be found.

我认为解决方案可能是: 1. 在 Maven pom 文件中添加一些内容,以便生成的 jar 知道从哪里获取模型。 要么 2. 如果 MojoModel.load 方法接受文件路径而不仅仅是文件名。但是我觉得这样不行。

有什么想法吗?

您需要更改在项目中加载 MOJO zip 文件的方式,而是需要从资源中以流的形式加载 MOJO 文件。您可以按照此 example 了解如何将 MOJO 放入资源文件夹,然后调用 addMOJOsFromJARResource 以包含 MOJO。

项目:https://github.com/h2oai/h2o-tutorials/tree/f67765bc6c68c2058d4b2786d1bbc627d3b70539/tutorials/hive_udf_template/hive_udf_mojo_template

  1. MOJO zip 存储在 src/main/resources/model
  2. 您需要参考下面的 h2o-genmodel 类 到

```

 import hex.genmodel.MojoReaderBackendFactory;
 import static hex.genmodel.MojoReaderBackendFactory.CachingStrategy;
 import hex.genmodel.MojoReaderBackend;
 import hex.genmodel.ModelMojoReader;
  1. 这是将所有 MOJO.zip(是的,您可以添加多个 MOJO)包含到您的项目中的函数

```

  public void addMOJOsFromJARResource() {
      try {
        String[] mojo_names = this.getMOJONames();
        for (int i = 0; i < mojo_names.length; i++) {
            MojoReaderBackend reader =
                MojoReaderBackendFactory.createReaderBackend(
                  getClass().getResourceAsStream(
                     "/models/"+mojo_names[i]), 
                      MojoReaderBackendFactory.CachingStrategy.MEMORY);
            MojoModel model = ModelMojoReader.readFrom(reader);
            this.addModel(model);
        }
       } catch (Exception e) {
         e.printStackTrace();
        throw new RuntimeException();
        }
    }

``` 这会起作用。