Тип базы данных не найден для названия продукта: [Apache Hive] в весенней партии

Наше текущее приложение с пакетными заданиями 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, поскольку они несут ответственность за сохранение пакетных метаданных в базе данных.

    1. JobInstanceDao (HiveJdbcJobInstanceDao)
    2. JobExecutionDao (HiveJdbcJobExecutionDao)
    3. StepExecutionDao (HiveJdbcStepExecutionDao)
    4. ExecutionContextDao (JdbcHiveExecutionContextDao)
  • У 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>
    

person TheSprinter    schedule 04.03.2020    source источник


Ответы (1)


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

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

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

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

    return new SimpleJobRepository(hiveJdbcJobInstanceDao, hiveJdbcJobExecutionDao,
                               hiveJdbcStepExecutionDao, jdbcHiveExecutionContextDao);
}
person Mahmoud Ben Hassine    schedule 04.03.2020
comment
Спасибо, Махмуд Бен Хассин ‹BR›, дайте мне знать, пожалуйста, ниже ‹BR/› - Планируется ли в Spring Batch включить поддержку Hive в будущем? ‹BR/› - Рекомендуется ли пакет Spring для запуска пакетных заданий в Hive или следует использовать такие инструменты, как Apache Spark, для технологии больших данных? В настоящее время у нас есть приложение Java с этими весенними пакетными заданиями? - person TheSprinter; 06.03.2020
comment
Плана поддержки Hive нет, но при желании вы можете отправить запрос на добавление функции. Я не могу дать никаких рекомендаций относительно использования Spring Batch или Spark, потому что это зависит от варианта использования. Взгляните на эту тему SO: stackoverflow.com/a/53730498/5019386, которая может помочь вам в вашем решении. - person Mahmoud Ben Hassine; 06.03.2020