找不到产品名称的数据库类型:spring 批次中的 [Apache Hive]
DatabaseType not found for product name: [Apache Hive] in spring batch
我们当前的应用程序具有 Spring 个批处理作业,可与 RDBMS (Oracle) 配合使用。作为战略路线图的一部分,所有数据都将在 HIVE 中,并且不会依赖 Oracle (RDBMS)。作为该路线图的一部分,我们正在尝试进行 POC 以验证针对 Hive 执行 Spring Batch 的可行性。但是,当我们配置了 HIVE JDBC 驱动程序并尝试在 JBOSS 中本地部署应用程序时,我们收到异常“ 未找到产品名称的数据库类型:[Apache Hive ]”。这个问题是由于 JobRepository
和 JsrJobParametersConverter
的配置引起的,因为它们都在寻找数据源产品名称的数据库类型。正如我们看到的 class 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
- 使用自定义 class
JobRepositoryFactoryBeanForHive
扩展了 JobRepositoryFactoryBean
实现了SimpleJobRepository
依赖as的各种DAO接口。这样做是为了控制这些 DAO 实现,因为它们负责在数据库中持久保存批处理元数据。
- JobInstanceDao (
HiveJdbcJobInstanceDao
)
- JobExecutionDao (
HiveJdbcJobExecutionDao
)
- StepExecutionDao (
HiveJdbcStepExecutionDao
)
- ExecutionContextDao (
JdbcHiveExecutionContextDao
)
Hive 不支持序列。作为解决方法,创建了一个 table 来添加/递增 Id 并继续检索每次命中的最大值 table
已实现 HiveIncrementerFactory
(用于创建 HiveIncrementer
实现的工厂)和相关的 HiveIncrementer
(从为 table 创建的 table 检索下一个值序列 )
修改了 JobRepositoryFactoryBeanForHive
中方法 determineClobTypeToUse()
的实现,将 Types 设置为 VARCHAR
。在数据库中,字段 SERIALIZED_CONTEXT
已声明数据类型为 VARCHAR
,因为 Hive 不支持 CLOB
。最多可存储 2 GB。 (因为 Oracle 中的 CLOB 可以是 8 GB,是否应该创建 3 个字段来存储上下文,如果每个字段中超过 2 GB字段)
<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>
实现自定义 class JsrJobParametersConverterHive
扩展 JsrJobParametersConverter
<bean id="jobParametersConverter" class="com.batch.springutil.JsrJobParametersConverterHive">
<constructor-arg ref="BatchDataSource" />
</bean>
根据文档中的 4.3.4 Non-standard Database Types in Repository 部分:
If even that doesn’t work, or you are not using an RDBMS, then the only option may be to implement the various Dao interfaces that the SimpleJobRepository depends on and wire one up manually in the normal Spring way.
由于您已经实现了作业存储库所依赖的 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);
}
我们当前的应用程序具有 Spring 个批处理作业,可与 RDBMS (Oracle) 配合使用。作为战略路线图的一部分,所有数据都将在 HIVE 中,并且不会依赖 Oracle (RDBMS)。作为该路线图的一部分,我们正在尝试进行 POC 以验证针对 Hive 执行 Spring Batch 的可行性。但是,当我们配置了 HIVE JDBC 驱动程序并尝试在 JBOSS 中本地部署应用程序时,我们收到异常“ 未找到产品名称的数据库类型:[Apache Hive ]”。这个问题是由于 JobRepository
和 JsrJobParametersConverter
的配置引起的,因为它们都在寻找数据源产品名称的数据库类型。正如我们看到的 class 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
- 使用自定义 class
JobRepositoryFactoryBeanForHive
扩展了 实现了
SimpleJobRepository
依赖as的各种DAO接口。这样做是为了控制这些 DAO 实现,因为它们负责在数据库中持久保存批处理元数据。- JobInstanceDao (
HiveJdbcJobInstanceDao
) - JobExecutionDao (
HiveJdbcJobExecutionDao
) - StepExecutionDao (
HiveJdbcStepExecutionDao
) - ExecutionContextDao (
JdbcHiveExecutionContextDao
)
- JobInstanceDao (
Hive 不支持序列。作为解决方法,创建了一个 table 来添加/递增 Id 并继续检索每次命中的最大值 table
已实现
HiveIncrementerFactory
(用于创建HiveIncrementer
实现的工厂)和相关的HiveIncrementer
(从为 table 创建的 table 检索下一个值序列 )修改了
JobRepositoryFactoryBeanForHive
中方法determineClobTypeToUse()
的实现,将 Types 设置为VARCHAR
。在数据库中,字段SERIALIZED_CONTEXT
已声明数据类型为VARCHAR
,因为 Hive 不支持CLOB
。最多可存储 2 GB。 (因为 Oracle 中的 CLOB 可以是 8 GB,是否应该创建 3 个字段来存储上下文,如果每个字段中超过 2 GB字段)<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>
实现自定义 class
JsrJobParametersConverterHive
扩展JsrJobParametersConverter
<bean id="jobParametersConverter" class="com.batch.springutil.JsrJobParametersConverterHive"> <constructor-arg ref="BatchDataSource" /> </bean>
JobRepositoryFactoryBean
根据文档中的 4.3.4 Non-standard Database Types in Repository 部分:
If even that doesn’t work, or you are not using an RDBMS, then the only option may be to implement the various Dao interfaces that the SimpleJobRepository depends on and wire one up manually in the normal Spring way.
由于您已经实现了作业存储库所依赖的 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);
}