Flink连接kerberos认证的hive 并使用table API

有个问题flink的kerveros通过配置设置。但是HiveCatalog还需要再次使用UserGroupInformation再次认证。
直接上代码:

import com.amihaiemil.eoyaml.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.apache.flink.table.catalog.Catalog;
import org.apache.flink.table.catalog.hive.HiveCatalog;
import org.apache.hadoop.security.UserGroupInformation;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Properties;

public class FlinkEnvProvider {

    public Properties getFlinkProperties() {
        String krb5Conf="D:\\configs\\krb5.conf";
        String keytab="D:\\configs\\xxx.keytab";
        String principal= "xxx@XXXXXX.COM";
        System.setProperty("java.security.krb5.conf", krb5Conf);

        Properties flinkProps = new Properties();
        flinkProps.setProperty("security.kerberos.krb5-conf.path",krb5Conf );
        flinkProps.setProperty("security.kerberos.login.keytab",keytab );
        flinkProps.setProperty("security.kerberos.login.principal",principal);
        flinkProps.setProperty("security.kerberos.login.contexts", "Client,KafkaClient");
        flinkProps.setProperty("state.backend", "hashmap");
        try {
            UserGroupInformation.loginUserFromKeytab(principal,keytab);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return flinkProps;
    }

    public FlinkCatalog getCatalog() {
        String flinkSqlClientPath = "D:/configs/sql-client-local.yaml";
        YamlMapping mapping;
        try {
            mapping = Yaml.createYamlInput(new File(flinkSqlClientPath)).readYamlMapping();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        YamlSequence catalogs = mapping.yamlSequence("catalogs");
        YamlMapping defaultCatalog = catalogs.yamlMapping(0);
        String catalogName = defaultCatalog.string("name");
        String catalogType = defaultCatalog.string("type");
        String hiveConfDir = defaultCatalog.string("hive-conf-dir");
        String defaultDatabase = defaultCatalog.string("default-database");
        String hadoopConfDir = defaultCatalog.string("hadoop-conf-dir");
        Catalog catalog = null;
        if ("hive".equalsIgnoreCase(catalogType)) {
            catalog = new HiveCatalog(catalogName, defaultDatabase, hiveConfDir, hadoopConfDir,null);
        } else {
            throw new UnsupportedOperationException("不支持的catalog类型:" + catalogType);
        }
        // System.out.println(catalogName + "\t->\t" + catalog);
        return new FlinkCatalog(catalogName, catalog);
    }

    public StreamExecutionEnvironment getStreamEnv() {
        Properties flinkProps = getFlinkProperties();
        Configuration flinkConfig = new Configuration();
        flinkConfig.addAllToProperties(flinkProps);
        StreamExecutionEnvironment senv = StreamExecutionEnvironment.getExecutionEnvironment(flinkConfig);
        return senv;
    }

    public StreamTableEnvironment getTableEnv() {
        StreamExecutionEnvironment senv = getStreamEnv();
        StreamTableEnvironment tenv = StreamTableEnvironment.create(senv);
        FlinkCatalog catalog = getCatalog();
        tenv.registerCatalog(catalog.getName(), catalog.getCatalog());
        tenv.useCatalog(catalog.getName());
        // System.out.println(tenv);
         return tenv;
    }

    @Test
    public void testTableEnv(){
        StreamTableEnvironment tenv = getTableEnv();
        tenv.useDatabase("hudi_db");
        String[] tbls = tenv.listTables();
        Arrays.stream(tbls).forEach(System.out::println);
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class FlinkCatalog {
        private String name;
        private Catalog catalog;
    }
}

sql-client-local.yaml 的文件内容:

# 仅保留有用内容
# Define catalogs here.
catalogs:
   - name: flink_hive_catalog
     type: hive
     hive-conf-dir: D:/env/conf/hive
     default-database: default
     hadoop-conf-dir: D:/env/conf/hadoop
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Flink SQL中连接并读取Hive表,您可以使用Hive catalog或Flink JDBC连接器的方法。 使用Hive catalog的方法如下: 1. 首先,您需要在Flink SQL Stream Builder中注册Hive catalog。这可以通过在Flink SQL CLI或Flink SQL客户端中执行相应的DDL语句来完成。\[3\] 2. 注册完成后,您可以在Flink SQL中使用Hive表。您可以通过在SQL查询中使用类似于"SELECT * FROM hive_table"的语句来读取Hive表的数据。\[1\] 使用Flink JDBC连接器的方法如下: 1. 首先,您需要确保Hive表的数据可以通过JDBC连接器访问。这可以通过在Flink的配置文件中配置Hive JDBC连接器的相关信息来实现。\[2\] 2. 配置完成后,您可以在Flink SQL中使用JDBC连接器来读取Hive表。您可以通过在SQL查询中使用类似于"SELECT * FROM jdbc_table"的语句来读取Hive表的数据。 无论您选择使用Hive catalog还是JDBC连接器,都可以在Flink SQL中连接并读取Hive表的数据。具体选择取决于您的需求和环境。 #### 引用[.reference_title] - *1* *2* *3* [通过 Flink SQL 使用 Hive 表丰富流](https://blog.csdn.net/wang_x_f911/article/details/127980900)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值