DatabaseType не найден для названия продукта: [Apache Hive] в весенней партии - PullRequest
1 голос
/ 04 марта 2020

Наше текущее приложение с пакетными заданиями Spring работает с RDBMS (Oracle). В рамках стратегической c дорожной карты все данные будут в HIVE, и не будет никакой зависимости от Oracle (RDBMS). В рамках этой дорожной карты мы пытаемся выполнить PO C для проверки возможности выполнения Spring Batch против Hive. Однако, когда у нас настроен драйвер HIVE JDB C и мы пытаемся развернуть приложение локально в JBOSS, мы получаем исключение: « DatabaseType не найден для имени продукта: [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

  • Расширен JobRepositoryFactoryBean с настроенным классом JobRepositoryFactoryBeanForHive
  • Реализованы различные интерфейсы DAO, от которых зависит SimpleJobRepository. Это делается для того, чтобы управлять этими реализациями DAO как они несут ответственность за постоянные пакетные метаданные в базе данных.

    1. JobInstanceDao (HiveJdbcJobInstanceDao)
    2. JobExecutionDao (HiveJdbcJobExecutionDao)
    3. StepExecutionDao (HiveJdbcStepExecutionDao)
    4. ExecutionContextDao (JdbcHiveExecutionContextDao )
  • Улей не поддерживает последовательности. В качестве обходного пути, создали таблицу для добавления / увеличения идентификатора и продолжения получения максимального значения для каждого попадания в таблицу

  • Реализовано 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>
    

1 Ответ

0 голосов
/ 04 марта 2020

Согласно разделу 4.3.4. Нестандартные типы баз данных в репозитории из документов:

Если даже это не работает или вы не используете СУБД тогда единственным вариантом может быть реализация различных интерфейсов Dao, от которых зависит SimpleJobRepository, и их подключение вручную обычным способом Spring.

Поскольку вы реализовали 4 DAO, от которых зависит хранилище заданий Вы можете создать компонент типа SimpleJobRepository и подключить к нему свои DAO. Другими словами, не используйте JobRepositoryFactoryBean и создайте компонент самостоятельно:

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

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