databasetype

ippsafx7  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(155)

                            我们当前的应用程序具有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 ```


nszi6y05

nszi6y051#

根据第4.3.4节,文档中存储库中的非标准数据库类型:
如果这甚至不起作用,或者您没有使用rdbms,那么唯一的选择可能是实现simplejobrepository所依赖的各种dao接口,并以正常的spring方式手动连接一个dao接口。
由于已经实现了作业存储库所依赖的4个dao,因此可以创建类型为 SimpleJobRepository 把你的刀装进去。换句话说,不要使用 JobRepositoryFactoryBean 然后自己创建bean:

@Bean
public SimpleJobRepository hiveJobRepository(
    HiveJdbcJobInstanceDao hiveJdbcJobInstanceDao,
    HiveJdbcJobExecutionDao hiveJdbcJobExecutionDao,
    HiveJdbcStepExecutionDao hiveJdbcStepExecutionDao,
    JdbcHiveExecutionContextDao jdbcHiveExecutionContextDao) {

    return new SimpleJobRepository(hiveJdbcJobInstanceDao, hiveJdbcJobExecutionDao,
                               hiveJdbcStepExecutionDao, jdbcHiveExecutionContextDao);
}

相关问题