Наше текущее приложение с пакетными заданиями Spring работает с СУБД (Oracle). В рамках стратегической дорожной карты все данные будут в HIVE, и не будет никакой зависимости от Oracle (RDBMS). В рамках этой дорожной карты мы пытаемся выполнить POC, чтобы проверить возможность выполнения Spring Batch для Hive. Однако, когда у нас настроен драйвер JDBC HIVE и мы пытаемся развернуть приложение локально в JBOSS, мы получаем исключение: «Тип базы данных не найден для имени продукта: [Apache Hive]». Эта проблема была происходит из-за конфигураций JobRepository
, а также JsrJobParametersConverter
, поскольку оба они ищут тип базы данных источника данных Название продукта. Как мы видим, класс org.springframework.batch.support. DatabaseType (spring-batch-infrastructure-4.0.0.RELEASE.jar
) не поддерживает HIVE.
Поскольку мы не смогли найти никакого решения, мы следовали рекомендациям (хотя и ограниченным), которые приведены в разделе документации Spring batch «4.3.4 Нестандартные типы баз данных в репозитории»
https://docs.spring.io/spring-batch/docs/current/reference/html/index-single.html
- Расширен
JobRepositoryFactoryBean
индивидуальным классомJobRepositoryFactoryBeanForHive
Реализовал различные интерфейсы DAO, от которых
SimpleJobRepository
зависит как. Это сделано для контроля над этими реализациями DAO, поскольку они несут ответственность за сохранение пакетных метаданных в базе данных.- JobInstanceDao (
HiveJdbcJobInstanceDao
) - JobExecutionDao (
HiveJdbcJobExecutionDao
) - StepExecutionDao (
HiveJdbcStepExecutionDao
) - ExecutionContextDao (
JdbcHiveExecutionContextDao
)
- JobInstanceDao (
У Hive нет поддержки последовательностей. В качестве обходного пути создал таблицу для добавления / увеличения идентификатора и продолжения получения максимального значения для каждого попадания в таблицу.
Реализован
HiveIncrementerFactory
(фабрика для создания реализацииHiveIncrementer
) и связанныйHiveIncrementer
(для получения следующего значения из таблицы, созданной для последовательности)Изменена реализация метода
determineClobTypeToUse()
вJobRepositoryFactoryBeanForHive
, чтобы установить для Типов значениеVARCHAR
. В базе данных полеSERIALIZED_CONTEXT
было объявлено с типом данных какVARCHAR
, поскольку Hive не поддерживаетCLOB
. Максимум 2 ГБ может быть сохранено. (Поскольку размер CLOB в Oracle может быть 8 ГБ, если для хранения контекста создано 3 поля путем разделения, если в каждом из этих полей больше 2 ГБ)<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>