From d110b97eddf8d93bc60704b328e97179824ee5a7 Mon Sep 17 00:00:00 2001 From: Mohammad Arshad Date: Thu, 26 Sep 2024 10:57:01 +0530 Subject: [PATCH] [Improvement][Seatunnel-web][Hive-JDBC] Add Hive-JDBC into seatunnel-web (#218) --- .../classloader/DatasourceLoadConfig.java | 5 + .../datasource-hive/pom.xml | 3 +- .../datasource-jdbc-hive/pom.xml | 12 +++ .../plugin/hive/jdbc/HiveJdbcConstants.java | 5 +- .../hive/jdbc/HiveJdbcDataSourceChannel.java | 98 ++++++++++++------- .../hive/jdbc/HiveJdbcDataSourceFactory.java | 6 +- .../plugin/hive/jdbc/HiveJdbcOptionRule.java | 55 ++++++++++- .../seatunnel-datasource-plugins/pom.xml | 4 + .../app/bean/engine/EngineDataType.java | 3 +- .../HiveJdbcDataSourceConfigSwitcher.java | 88 +++++++++++++++++ .../connector-datasource-mapper.yaml | 11 +++ 11 files changed, 242 insertions(+), 48 deletions(-) create mode 100644 seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/thirdparty/datasource/impl/HiveJdbcDataSourceConfigSwitcher.java diff --git a/seatunnel-datasource/seatunnel-datasource-client/src/main/java/org/apache/seatunnel/datasource/classloader/DatasourceLoadConfig.java b/seatunnel-datasource/seatunnel-datasource-client/src/main/java/org/apache/seatunnel/datasource/classloader/DatasourceLoadConfig.java index 431261bf0..af8399e91 100644 --- a/seatunnel-datasource/seatunnel-datasource-client/src/main/java/org/apache/seatunnel/datasource/classloader/DatasourceLoadConfig.java +++ b/seatunnel-datasource/seatunnel-datasource-client/src/main/java/org/apache/seatunnel/datasource/classloader/DatasourceLoadConfig.java @@ -73,6 +73,9 @@ public class DatasourceLoadConfig { classLoaderFactoryName.put( "JDBC-TIDB", "org.apache.seatunnel.datasource.plugin.tidb.jdbc.TidbJdbcDataSourceFactory"); + classLoaderFactoryName.put( + "JDBC-HIVE", + "org.apache.seatunnel.datasource.plugin.hive.jdbc.HiveJdbcDataSourceFactory"); classLoaderFactoryName.put( "KAFKA", "org.apache.seatunnel.datasource.plugin.kafka.KafkaDataSourceFactory"); classLoaderFactoryName.put( @@ -124,6 +127,7 @@ public class DatasourceLoadConfig { classLoaderJarName.put("JDBC-STARROCKS", "datasource-jdbc-starrocks-"); classLoaderJarName.put("MONGODB", "datasource-mongodb-"); classLoaderJarName.put("JDBC-DB2", "datasource-jdbc-db2-"); + classLoaderJarName.put("JDBC-HIVE", "datasource-jdbc-hive-"); classLoaderJarName.put("FAKESOURCE", "datasource-fakesource-"); classLoaderJarName.put("CONSOLE", "datasource-console-"); } @@ -138,6 +142,7 @@ public class DatasourceLoadConfig { "JDBC-Postgres", "JDBC-SQLServer", "JDBC-TiDB", + "JDBC-Hive", "Kafka", "MySQL-CDC", "S3", diff --git a/seatunnel-datasource/seatunnel-datasource-plugins/datasource-hive/pom.xml b/seatunnel-datasource/seatunnel-datasource-plugins/datasource-hive/pom.xml index 2344fa711..e209dee36 100644 --- a/seatunnel-datasource/seatunnel-datasource-plugins/datasource-hive/pom.xml +++ b/seatunnel-datasource/seatunnel-datasource-plugins/datasource-hive/pom.xml @@ -25,7 +25,6 @@ datasource-hive - 3.1.3 24.1-jre @@ -51,7 +50,7 @@ org.apache.hive hive-exec - ${hive.exec.version} + ${hive.version} log4j diff --git a/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/pom.xml b/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/pom.xml index f24fdb7c3..2ad03297d 100644 --- a/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/pom.xml +++ b/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/pom.xml @@ -31,6 +31,18 @@ ${project.version} provided + + org.apache.hive + hive-jdbc + ${hive.version} + provided + + + org.apache.hadoop + hadoop-common + ${hadoop.version} + provided + diff --git a/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/src/main/java/org/apache/seatunnel/datasource/plugin/hive/jdbc/HiveJdbcConstants.java b/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/src/main/java/org/apache/seatunnel/datasource/plugin/hive/jdbc/HiveJdbcConstants.java index 8b133ac7d..8b857c524 100644 --- a/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/src/main/java/org/apache/seatunnel/datasource/plugin/hive/jdbc/HiveJdbcConstants.java +++ b/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/src/main/java/org/apache/seatunnel/datasource/plugin/hive/jdbc/HiveJdbcConstants.java @@ -22,8 +22,7 @@ import java.util.Set; public class HiveJdbcConstants { - + public static final String PLUGIN_NAME = "JDBC-Hive"; public static final Set HIVE_SYSTEM_DATABASES = - Sets.newHashSet( - "information_schema", "mysql", "performance_schema", "sys", "test", "hivedb"); + Sets.newHashSet("information_schema", "performance_schema", "sys"); } diff --git a/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/src/main/java/org/apache/seatunnel/datasource/plugin/hive/jdbc/HiveJdbcDataSourceChannel.java b/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/src/main/java/org/apache/seatunnel/datasource/plugin/hive/jdbc/HiveJdbcDataSourceChannel.java index 2fa5b1961..1e62fa592 100644 --- a/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/src/main/java/org/apache/seatunnel/datasource/plugin/hive/jdbc/HiveJdbcDataSourceChannel.java +++ b/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/src/main/java/org/apache/seatunnel/datasource/plugin/hive/jdbc/HiveJdbcDataSourceChannel.java @@ -24,13 +24,13 @@ import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.security.UserGroupInformation; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Socket; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; @@ -41,6 +41,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; @Slf4j public class HiveJdbcDataSourceChannel implements DataSourceChannel { @@ -61,15 +62,15 @@ public List getTables( Map requestParams, String database, Map option) { - return getTables(pluginName, requestParams, database, option); + return getTableNames(requestParams, database); } @Override public List getDatabases( @NonNull String pluginName, @NonNull Map requestParams) { try { - return getDataBaseNames(pluginName, requestParams); - } catch (SQLException e) { + return getDataBaseNames(requestParams); + } catch (SQLException | IOException e) { log.error("Query Hive databases error, request params is {}", requestParams, e); throw new DataSourcePluginException("Query Hive databases error,", e); } @@ -104,7 +105,7 @@ public Map> getTableFields( } protected boolean checkJdbcConnectivity(Map requestParams) { - try (Connection ignored = init(requestParams)) { + try (Connection ignored = getHiveConnection(requestParams)) { return true; } catch (Exception e) { throw new DataSourcePluginException( @@ -112,25 +113,61 @@ protected boolean checkJdbcConnectivity(Map requestParams) { } } - protected Connection init(Map requestParams) throws SQLException { + protected Connection getHiveConnection(Map requestParams) + throws IOException, SQLException { if (MapUtils.isEmpty(requestParams)) { throw new DataSourcePluginException( "Hive jdbc request params is null, please check your config"); } - String url = requestParams.get(HiveJdbcOptionRule.URL.key()); - return DriverManager.getConnection(url); + String driverClass = + requestParams.getOrDefault( + HiveJdbcOptionRule.DRIVER.key(), "org.apache.hive.jdbc.HiveDriver"); + try { + Class.forName(driverClass); + } catch (ClassNotFoundException e) { + throw new DataSourcePluginException( + "Hive jdbc driver " + driverClass + " not found", e); + } + Properties connProps = new Properties(); + boolean isKerberosEnabled = + Boolean.parseBoolean(requestParams.get(HiveJdbcOptionRule.USE_KERBEROS.key())); + if (isKerberosEnabled) { + String krb5ConfPath = requestParams.get(HiveJdbcOptionRule.KRB5_PATH.key()); + if (StringUtils.isNotEmpty(krb5ConfPath)) { + System.setProperty("java.security.krb5.conf", krb5ConfPath); + } + Configuration conf = new Configuration(); + conf.set("hadoop.security.authentication", "Kerberos"); + UserGroupInformation.setConfiguration(conf); + String principal = requestParams.get(HiveJdbcOptionRule.KERBEROS_PRINCIPAL.key()); + connProps.setProperty("principal", principal); + String keytabPath = requestParams.get(HiveJdbcOptionRule.KERBEROS_KEYTAB_PATH.key()); + UserGroupInformation.loginUserFromKeytab(principal, keytabPath); + } + + String user = requestParams.get(HiveJdbcOptionRule.USER.key()); + String password = requestParams.get(HiveJdbcOptionRule.PASSWORD.key()); + if (StringUtils.isNotEmpty(user)) { + connProps.setProperty("user", user); + } + if (StringUtils.isNotEmpty(password)) { + connProps.setProperty("password", password); + } + + String jdbcUrl = requestParams.get(HiveJdbcOptionRule.URL.key()); + return DriverManager.getConnection(jdbcUrl, connProps); } - protected List getDataBaseNames(String pluginName, Map requestParams) - throws SQLException { + protected List getDataBaseNames(Map requestParams) + throws SQLException, IOException { List dbNames = new ArrayList<>(); - try (Connection connection = init(requestParams); - Statement statement = connection.createStatement(); ) { - ResultSet re = statement.executeQuery("SHOW DATABASES;"); + try (Connection connection = getHiveConnection(requestParams); + Statement statement = connection.createStatement()) { + ResultSet re = statement.executeQuery("SHOW DATABASES"); // filter system databases while (re.next()) { - String dbName = re.getString("database"); - if (StringUtils.isNotBlank(dbName) && isNotSystemDatabase(pluginName, dbName)) { + String dbName = re.getString("database_name"); + if (StringUtils.isNotBlank(dbName) && isNotSystemDatabase(dbName)) { dbNames.add(dbName); } } @@ -140,9 +177,11 @@ protected List getDataBaseNames(String pluginName, Map r protected List getTableNames(Map requestParams, String dbName) { List tableNames = new ArrayList<>(); - try (Connection connection = init(requestParams); ) { + try (Connection connection = getHiveConnection(requestParams)) { ResultSet resultSet = - connection.getMetaData().getTables(dbName, null, null, new String[] {"TABLE"}); + connection + .getMetaData() + .getTables(dbName, dbName, null, new String[] {"TABLE"}); while (resultSet.next()) { String tableName = resultSet.getString("TABLE_NAME"); if (StringUtils.isNotBlank(tableName)) { @@ -150,7 +189,7 @@ protected List getTableNames(Map requestParams, String d } } return tableNames; - } catch (SQLException e) { + } catch (SQLException | IOException e) { throw new DataSourcePluginException("get table names failed", e); } } @@ -158,7 +197,7 @@ protected List getTableNames(Map requestParams, String d protected List getTableFields( Map requestParams, String dbName, String tableName) { List tableFields = new ArrayList<>(); - try (Connection connection = init(requestParams); ) { + try (Connection connection = getHiveConnection(requestParams)) { DatabaseMetaData metaData = connection.getMetaData(); String primaryKey = getPrimaryKey(metaData, dbName, tableName); ResultSet resultSet = metaData.getColumns(dbName, null, tableName, null); @@ -177,7 +216,7 @@ protected List getTableFields( tableField.setNullable(isNullable); tableFields.add(tableField); } - } catch (SQLException e) { + } catch (SQLException | IOException e) { throw new DataSourcePluginException("get table fields failed", e); } return tableFields; @@ -186,25 +225,14 @@ protected List getTableFields( private String getPrimaryKey(DatabaseMetaData metaData, String dbName, String tableName) throws SQLException { ResultSet primaryKeysInfo = metaData.getPrimaryKeys(dbName, "%", tableName); - while (primaryKeysInfo.next()) { + if (primaryKeysInfo.next()) { return primaryKeysInfo.getString("COLUMN_NAME"); } return null; } - @SuppressWarnings("checkstyle:MagicNumber") - private static boolean checkHostConnectable(String host, int port) { - try (Socket socket = new Socket()) { - socket.connect(new InetSocketAddress(host, port), 1000); - return true; - } catch (IOException e) { - return false; - } - } - - private boolean isNotSystemDatabase(String pluginName, String dbName) { - // FIXME,filters system databases - return true; + private boolean isNotSystemDatabase(String dbName) { + return !HiveJdbcConstants.HIVE_SYSTEM_DATABASES.contains(dbName.toLowerCase()); } private boolean convertToBoolean(Object value) { diff --git a/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/src/main/java/org/apache/seatunnel/datasource/plugin/hive/jdbc/HiveJdbcDataSourceFactory.java b/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/src/main/java/org/apache/seatunnel/datasource/plugin/hive/jdbc/HiveJdbcDataSourceFactory.java index b149cc3b7..83eca41fc 100644 --- a/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/src/main/java/org/apache/seatunnel/datasource/plugin/hive/jdbc/HiveJdbcDataSourceFactory.java +++ b/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/src/main/java/org/apache/seatunnel/datasource/plugin/hive/jdbc/HiveJdbcDataSourceFactory.java @@ -28,17 +28,17 @@ public class HiveJdbcDataSourceFactory implements DataSourceFactory { @Override public String factoryIdentifier() { - return "Hive-JDBC"; + return HiveJdbcConstants.PLUGIN_NAME; } @Override public Set supportedDataSources() { DataSourcePluginInfo dataSourcePluginInfo = DataSourcePluginInfo.builder() - .name("Hive-JDBC") + .name(HiveJdbcConstants.PLUGIN_NAME) .type(DatasourcePluginTypeEnum.DATABASE.getCode()) .version("1.0.0") - .icon("Hive-JDBC") + .icon(HiveJdbcConstants.PLUGIN_NAME) .supportVirtualTables(false) .build(); Set dataSourceInfos = new HashSet<>(); diff --git a/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/src/main/java/org/apache/seatunnel/datasource/plugin/hive/jdbc/HiveJdbcOptionRule.java b/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/src/main/java/org/apache/seatunnel/datasource/plugin/hive/jdbc/HiveJdbcOptionRule.java index fb004b69f..9d31cb586 100644 --- a/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/src/main/java/org/apache/seatunnel/datasource/plugin/hive/jdbc/HiveJdbcOptionRule.java +++ b/seatunnel-datasource/seatunnel-datasource-plugins/datasource-jdbc-hive/src/main/java/org/apache/seatunnel/datasource/plugin/hive/jdbc/HiveJdbcOptionRule.java @@ -25,18 +25,65 @@ public class HiveJdbcOptionRule { public static final Option URL = Options.key("url") + .stringType() + .defaultValue("jdbc:hive2://localhost:10000/default") + .withDescription( + "The URL of the JDBC connection. Refer to a case: jdbc:hive2://localhost:10000/default"); + + public static final Option DRIVER = + Options.key("driver") + .stringType() + .defaultValue("org.apache.hive.jdbc.HiveDriver") + .withDescription( + "The jdbc class name used to connect to the remote data source"); + + public static final Option USER = + Options.key("user").stringType().noDefaultValue().withDescription("user"); + + public static final Option PASSWORD = + Options.key("password").stringType().noDefaultValue().withDescription("password"); + + public static final Option USE_KERBEROS = + Options.key("use_kerberos") + .booleanType() + .defaultValue(false) + .withDescription("Whether to enable Kerberos, default is false."); + + public static final Option KERBEROS_PRINCIPAL = + Options.key("kerberos_principal") + .stringType() + .noDefaultValue() + .withDescription( + "When use kerberos, we should set kerberos principal such as 'test_user@xxx'. "); + + public static final Option KERBEROS_KEYTAB_PATH = + Options.key("kerberos_keytab_path") .stringType() .noDefaultValue() .withDescription( - "jdbc url, eg:" - + "jdbc:hive2://localhost:10000/default?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8"); + "When use kerberos, we should set kerberos principal file path such as '/home/test/test_user.keytab'. "); + + public static final Option KRB5_PATH = + Options.key("krb5_path") + .stringType() + .defaultValue("/etc/krb5.conf") + .withDescription( + "When use kerberos, we should set krb5 path file path such as '/seatunnel/krb5.conf' or use the default path '/etc/krb5.conf"); public static OptionRule optionRule() { - return OptionRule.builder().required(URL).build(); + return OptionRule.builder() + .required(URL) + .required(DRIVER) + .optional(USER) + .optional(PASSWORD) + .optional(USE_KERBEROS) + .optional(KERBEROS_PRINCIPAL) + .optional(KERBEROS_KEYTAB_PATH) + .optional(KRB5_PATH) + .build(); } public static OptionRule metadataRule() { - // todo return OptionRule.builder().build(); } } diff --git a/seatunnel-datasource/seatunnel-datasource-plugins/pom.xml b/seatunnel-datasource/seatunnel-datasource-plugins/pom.xml index 7a4568582..64dda5d2d 100644 --- a/seatunnel-datasource/seatunnel-datasource-plugins/pom.xml +++ b/seatunnel-datasource/seatunnel-datasource-plugins/pom.xml @@ -49,5 +49,9 @@ datasource-fakesource datasource-console + + 3.1.3 + 3.1.0 + diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/bean/engine/EngineDataType.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/bean/engine/EngineDataType.java index 86fa0c6bb..f7fae7313 100644 --- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/bean/engine/EngineDataType.java +++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/bean/engine/EngineDataType.java @@ -28,6 +28,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @@ -85,7 +86,7 @@ public static class SeaTunnelDataTypeConvertor @Override public SeaTunnelDataType toSeaTunnelType(String field, String connectorDataType) { - return DATA_TYPE_MAP.get(connectorDataType).getRawType(); + return DATA_TYPE_MAP.get(connectorDataType.toLowerCase(Locale.ROOT)).getRawType(); } @Override diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/thirdparty/datasource/impl/HiveJdbcDataSourceConfigSwitcher.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/thirdparty/datasource/impl/HiveJdbcDataSourceConfigSwitcher.java new file mode 100644 index 000000000..114ffc63c --- /dev/null +++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/thirdparty/datasource/impl/HiveJdbcDataSourceConfigSwitcher.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.seatunnel.app.thirdparty.datasource.impl; + +import org.apache.seatunnel.shade.com.typesafe.config.Config; + +import org.apache.seatunnel.api.configuration.Option; +import org.apache.seatunnel.api.configuration.util.OptionRule; +import org.apache.seatunnel.api.configuration.util.RequiredOption; +import org.apache.seatunnel.app.domain.request.connector.BusinessMode; +import org.apache.seatunnel.app.domain.request.job.DataSourceOption; +import org.apache.seatunnel.app.domain.request.job.SelectTableFields; +import org.apache.seatunnel.app.domain.response.datasource.VirtualTableDetailRes; +import org.apache.seatunnel.app.dynamicforms.FormStructure; +import org.apache.seatunnel.app.thirdparty.datasource.DataSourceConfigSwitcher; +import org.apache.seatunnel.common.constants.PluginType; + +import com.google.auto.service.AutoService; + +import java.util.Collections; +import java.util.List; + +@AutoService(DataSourceConfigSwitcher.class) +public class HiveJdbcDataSourceConfigSwitcher extends BaseJdbcDataSourceConfigSwitcher { + + @Override + public String getDataSourceName() { + return "JDBC-HIVE"; + } + + @Override + public FormStructure filterOptionRule( + String connectorName, + OptionRule dataSourceOptionRule, + OptionRule virtualTableOptionRule, + BusinessMode businessMode, + PluginType pluginType, + OptionRule connectorOptionRule, + List addRequiredOptions, + List> addOptionalOptions, + List excludedKeys) { + return super.filterOptionRule( + connectorName, + dataSourceOptionRule, + virtualTableOptionRule, + businessMode, + pluginType, + connectorOptionRule, + addRequiredOptions, + addOptionalOptions, + Collections.emptyList()); + } + + @Override + public Config mergeDatasourceConfig( + Config dataSourceInstanceConfig, + VirtualTableDetailRes virtualTableDetail, + DataSourceOption dataSourceOption, + SelectTableFields selectTableFields, + BusinessMode businessMode, + PluginType pluginType, + Config connectorConfig) { + + return super.mergeDatasourceConfig( + dataSourceInstanceConfig, + virtualTableDetail, + dataSourceOption, + selectTableFields, + businessMode, + pluginType, + connectorConfig); + } +} diff --git a/seatunnel-server/seatunnel-app/src/main/resources/connector-datasource-mapper.yaml b/seatunnel-server/seatunnel-app/src/main/resources/connector-datasource-mapper.yaml index 9dabf7b69..96e277a63 100644 --- a/seatunnel-server/seatunnel-app/src/main/resources/connector-datasource-mapper.yaml +++ b/seatunnel-server/seatunnel-app/src/main/resources/connector-datasource-mapper.yaml @@ -26,6 +26,7 @@ connector-datasource-mapper: - JDBC-KingBase - JDBC-Oracle - JDBC-Db2 + - JDBC-Hive MySQL-CDC: dataSources: @@ -152,6 +153,11 @@ connector-datasource-mapper: - DATA_INTEGRATION sceneMode: - SINGLE_TABLE + JDBC-Hive: + businessMode: + - DATA_INTEGRATION + sceneMode: + - SINGLE_TABLE FakeSource: businessMode: - DATA_INTEGRATION @@ -250,6 +256,11 @@ connector-datasource-mapper: - DATA_INTEGRATION sceneMode: - SINGLE_TABLE + JDBC-Hive: + businessMode: + - DATA_INTEGRATION + sceneMode: + - SINGLE_TABLE Console: businessMode: