未找到产品名称的数据库类型:春季批处理中的 [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]”。这个问题是由于 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
)
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]的主要内容,如果未能解决你的问题,请参考以下文章