【问题标题】:DatabaseType not found for product name: [Apache Hive] in spring batch未找到产品名称的数据库类型:春季批处理中的 [Apache Hive]
【发布时间】:2020-06-16 18:40:40
【问题描述】:

                        我们当前具有 Spring 批处理作业的应用程序可与 RDBMS (Oracle) 一起使用。作为战略路线图的一部分,所有数据都将保存在 HIVE 中,并且不依赖于 Oracle (RDBMS)。作为此路线图的一部分,我们正在尝试进行 POC 以验证针对 Hive 执行 Spring Batch 的可行性。但是,当我们配置了 HIVE JDBC 驱动程序并尝试在 JBOSS 中本地部署应用程序时,我们收到异常“DatabaseType not found for product name: [Apache Hive]”。这个问题是由于 JobRepositoryJsrJobParametersConverter 的配置,它们都在寻找数据源的数据库类型产品名称。正如我们看到的类 org.springframework.batch.support.DatabaseType (spring-batch-infrastructure-4.0.0.RELEASE.jar) 不支持 HIVE

由于我们找不到任何解决方案,我们遵循 Spring 批处理文档“4.3.4 存储库中的非标准数据库类型”部分中提供的指南(尽管有限)
https://docs.spring.io/spring-batch/docs/current/reference/html/index-single.html

  • 使用自定义类 JobRepositoryFactoryBeanForHive 扩展了 JobRepositoryFactoryBean
  • 实现了SimpleJobRepository所依赖的各种DAO接口。这样做是为了控制这些 DAO 实现,因为它们负责将批处理元数据保存在数据库中。

    1. JobInstanceDao (HiveJdbcJobInstanceDao)
    2. JobExecutionDao (HiveJdbcJobExecutionDao)
    3. StepExecutionDao (HiveJdbcStepExecutionDao)
    4. ExecutionContextDao (JdbcHiveExecutionContextDao)
  • Hive 不支持序列。作为一种解决方法,创建了一个表来添加/增加 Id 并继续检索每个命中到表的最大值

  • 实现了HiveIncrementerFactory(用于创建HiveIncrementer的实现的工厂)和相关的HiveIncrementer(从为序列创建的表中检索下一个值)

  • 修改JobRepositoryFactoryBeanForHive中方法determineClobTypeToUse()的实现,将Types设置为VARCHAR。在数据库中,字段 SERIALIZED_CONTEXT 已声明为数据类型为 VARCHAR,因为 Hive 不支持 CLOB。最多可存储 2 GB。 (由于 Oracle 中的 CLOB 可以是 8 GB,如果每个字段中的每个字段超过 2 GB,是否应该创建 3 个字段以通过拆分来存储上下文)

    <bean id="jobRepository" class="com.batch.springutil.JobRepositoryFactoryBeanForHive">
          <property name="dataSource" ref="DataSource" />
          <property name="databaseType" value="oracle" />  
          <property name="incrementerFactory" ref="hiveIncrementerFactory" />
          <property name="transactionManager" ref="transactionManager" />
          <property name="isolationLevelForCreate" value="ISOLATION_DEFAULT" />
    </bean> 
    <bean id="hiveIncrementerFactory" class="com.batch.springutil.HiveIncrementerFactory">
              <constructor-arg ref="DataSource" /> 
    </bean>
    
  • 实现自定义类JsrJobParametersConverterHive扩展JsrJobParametersConverter

    <bean id="jobParametersConverter" class="com.batch.springutil.JsrJobParametersConverterHive">
          <constructor-arg ref="BatchDataSource" />
    </bean>
    

【问题讨论】:

    标签: java hive spring-batch


    【解决方案1】:

    根据文档中的4.3.4 Non-standard Database Types in Repository 部分:

    如果这不起作用,或者您没有使用 RDBMS,那么唯一的选择可能是实现 SimpleJobRepository 所依赖的各种 Dao 接口,并以正常的 Spring 方式手动连接。

    由于您已经实现了作业存储库所依赖的 4 个 DAO,因此您可以创建一个 SimpleJobRepository 类型的 bean 并将您的 DAO 连接到其中。换句话说,不要使用 JobRepositoryFactoryBean 并自己创建 bean:

    @Bean
    public SimpleJobRepository hiveJobRepository(
        HiveJdbcJobInstanceDao hiveJdbcJobInstanceDao,
        HiveJdbcJobExecutionDao hiveJdbcJobExecutionDao,
        HiveJdbcStepExecutionDao hiveJdbcStepExecutionDao,
        JdbcHiveExecutionContextDao jdbcHiveExecutionContextDao) {
    
        return new SimpleJobRepository(hiveJdbcJobInstanceDao, hiveJdbcJobExecutionDao,
                                   hiveJdbcStepExecutionDao, jdbcHiveExecutionContextDao);
    }
    

    【讨论】:

    • 谢谢 Mahmoud Ben Hassine
      能否请您在下面告诉我
      - Spring Batch 是否有计划在未来包括对 Hive 的支持?
      - 是否建议使用 Spring batch 来针对 Hive 运行批处理作业,或者是否应该将 Apache spark 等工具用于大数据技术?我们目前的 Java 应用程序有这些 Spring 批处理作业吗?
    • 没有计划支持 Hive,但如果您愿意,请随时打开功能请求。关于使用 Spring Batch 或 Spark,我无法给出任何建议,因为这取决于用例。看看这个 SO 线程:stackoverflow.com/a/53730498/5019386 这可能会帮助您做出决定。
    猜你喜欢
    • 2020-07-30
    • 2021-11-09
    • 2022-08-02
    • 2014-12-15
    • 2018-05-27
    • 2015-05-13
    • 2017-06-25
    • 2017-10-06
    • 1970-01-01
    相关资源
    最近更新 更多