未找到产品名称的数据库类型:春季批处理中的 [Apache Hive]

Posted

技术标签:

【中文标题】未找到产品名称的数据库类型:春季批处理中的 [Apache Hive]【英文标题】:DatabaseType not found for product name: [Apache Hive] in spring batch 【发布时间】: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 实现,因为它们负责将批处理元数据保存在数据库中。

    JobInstanceDao (HiveJdbcJobInstanceDao) JobExecutionDao (HiveJdbcJobExecutionDao) StepExecutionDao (HiveJdbcStepExecutionDao) 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>

【问题讨论】:

【参考方案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 线程:***.com/a/53730498/5019386 这可能会帮助您做出决定。

以上是关于未找到产品名称的数据库类型:春季批处理中的 [Apache Hive]的主要内容,如果未能解决你的问题,请参考以下文章

事务未在春季批处理项目编写器中回滚

未找到产品名称的 DatabaseType:[Impala]

在itemwriter中,春季批处理未在运行时异常上滚动

春季批处理作业未读取第一行

Joomla - 500 未找到视图 [名称、类型、前缀]

R 中的 ODBC 库 - 获取“未找到数据源名称且未指定默认驱动程序”错误