我们当前的应用程序具有spring批处理作业,可以与rdbms(oracle)一起工作。作为战略路线图的一部分,所有的数据都将在hive中,并且不会依赖于oracle(rdbms)。作为这个路线图的一部分,我们正在尝试执行poc来验证针对hive执行spring批处理的可行性。然而,当我们配置了hivejdbc驱动程序并尝试在jboss中本地部署应用程序时,我们得到的异常是“databasetype not found for product name:[apache hive]”。这个问题是由于 JobRepository
还有 JsrJobParametersConverter
因为它们都在寻找数据库类型的数据源产品名。正如我们看到的,org.springframework.batch.support.databasetype类( spring-batch-infrastructure-4.0.0.RELEASE.jar
)不支持配置单元。
由于找不到任何解决方案,我们遵循了spring批处理文档“4.3.4存储库中的非标准数据库类型”一节中提供的指导原则(尽管有限)
https://docs.spring.io/spring-batch/docs/current/reference/html/index-single.html
扩展 JobRepositoryFactoryBean
自定义类 JobRepositoryFactoryBeanForHive
实现了各种dao接口 SimpleJobRepository
视情况而定。这样做是为了控制这些dao实现,因为它们负责在数据库中持久化批处理元数据。
作业示例DAO( HiveJdbcJobInstanceDao
)
作业执行( HiveJdbcJobExecutionDao
)
步进执行刀( HiveJdbcStepExecutionDao
)
行刑ContextDao( JdbcHiveExecutionContextDao
)
hive不支持序列。作为一种解决方法,创建了一个表来添加/增加id,并继续检索表中每次命中的最大值
实施 HiveIncrementerFactory
(创建实现的工厂) HiveIncrementer
)相关的 HiveIncrementer
(从为序列创建的表中检索下一个值)
修改了方法的实现 determineClobTypeToUse()
在 JobRepositoryFactoryBeanForHive
将类型设置为 VARCHAR
. 在数据库中 SERIALIZED_CONTEXT
已用数据类型声明为 VARCHAR
因为Hive不支持 CLOB
. 最多可存储2 gb(由于oracle中的clob可以是8GB,因此是否应该创建3个字段来存储上下文(如果每个字段中的clob都超过2GB)
<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
```
1条答案
按热度按时间nszi6y051#
根据第4.3.4节,文档中存储库中的非标准数据库类型:
如果这甚至不起作用,或者您没有使用rdbms,那么唯一的选择可能是实现simplejobrepository所依赖的各种dao接口,并以正常的spring方式手动连接一个dao接口。
由于已经实现了作业存储库所依赖的4个dao,因此可以创建类型为
SimpleJobRepository
把你的刀装进去。换句话说,不要使用JobRepositoryFactoryBean
然后自己创建bean: