【发布时间】: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]”。这个问题是由于 JobRepository 和 JsrJobParametersConverter 的配置,它们都在寻找数据源的数据库类型产品名称。正如我们看到的类 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)
- JobInstanceDao (
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