【Flink系列十一】FlinkSQL Gateway以及支持Kerberos多租户的实现思路
1.【Flink系列二十】Flink Example AsyncIOExample long running 应用程序的应用2.【Flink系列二十一】深入理解 JVM的类型加载约束,解决 Flink 类型加载冲突问题的通用方法3.【Flink系列十九】Flink 作业Hadoop 依赖冲突解决NoSuchMethodError4.HDFS_DELEGATION_TOKEN过期的问题解决汇总5.【Flink系列十八】History Server 重新登场,如何实现Yarn日志集成6.【Flink系列十七】Flink 最新yarn-application和yarn-per-job部署模式的Classpath传递分析7.【Flink系列十六】PrometheusPushGatewayReporter 限流压力过大解决8.【Flink系列十五】FLINK-24950 registerTemporaryFunction NullPointerException9.【Flink系列十四】Flink JVM参数不生效的问题分析和解决10.【Flink系列十三】Flink-Kafka-Connector KafkaSource FlinkKafkaConsumer没有上报指标11.【Flink系列十二】使用OpenResty 在InfluxDB协议层拦截Flink指标
12.【Flink系列十一】FlinkSQL Gateway以及支持Kerberos多租户的实现思路
13.【Flink系列十】Flink作业提交过程的调试和诊断14.【Flink系列九】Flink 作业提交遇到的问题记录以及原理15.【Flink系列八】构建实时计算平台——动态加载Catalog中的UDF16.【Flink系列零】构建实时计算平台——FlinkSQL 作业菜鸟笔记17.【Flink系列七】构建实时计算平台——校验FlinkSQL18.【Flink系列六】构建实时计算平台——Flink 1.10+通过Kerberos连接HiveCatalog19.【Flink系列五】构建实时计算平台——flink-connector-hive连接HiveMetastore遇到问题20.【Flink系列四】构建实时计算平台——Flink SQLClient启动失败的问题笔记21.【Flink系列三】构建实时计算平台——特别篇,Influxdb Java客户端访问指标数据22.【Flink系列二】构建实时计算平台——特别篇,用InfluxDb收集Flink Metrics23.【Flink系列一】构建实时计算平台——Flink开启和恢复Checkpoint前言
Flink 自带了一个SQLClient,截至目前Flink-1.13.0,Flink还没有Flink SQL Gateway。
需求
由于需要在提供友好的用户界面,类似于低代码平台,因此需要一个WEB服务来调用执行用户的SQL。
调研
Flink SQLClient 就是一个很好的样例。
思路就是:
实现一个SQL Parser:
- 将用户输入的SQL文本,使用正则表达式,进行分割,转换成一条条DDL,DML
- 一行一行地调用Flink Table API执行。
TableEnvironment:
public interface TableEnvironment {
TableResult executeSql(String statement);
}
执行过程:
EnvironmentSettings settings = EnvironmentSettings.newInstance().useBlinkPlanner().build();
TableEnvironment tableEnv = TableEnvironment.create(settings);
tableEnv.useCatalog("slankka");
tableEnv.useDatabase(database);
tableResult = tableEnv.executeSql(cmd);
HiveCatalog 多租户和Kerberos
在这篇文章中,对Hive进行了修改,以支持Kerberos。
【Flink系列六】构建实时计算平台——Flink 1.10+通过Kerberos连接HiveCatalog
本篇文章将基于这个改动,提供多租户的思路。
HiveCatalog 类的源码如下:
//org.apache.flink.table.catalog.hive.HiveCatalog
public class HiveCatalog extends AbstractCatalog {
@VisibleForTesting HiveMetastoreClientWrapper client;
@Override
public void open() throws CatalogException {
if (client == null) {
client = HiveMetastoreClientFactory.create(hiveConf, hiveVersion);
LOG.info("Connected to Hive metastore");
}
//....
}
@Override
public void close() throws CatalogException {
if (client != null) {
client.close();
client = null;
LOG.info("Close connection to Hive metastore");
}
}
}
可以看到底层是一个HiveMetastoreClientWrapper
//HiveMetastoreClientWrapper.java
private IMetaStoreClient createMetastoreClient() {
return hiveShim.getHiveMetastoreClient(hiveConf);
}
HiveShimV100,对应hive-1.x。
//HiveShimV100.java
public class HiveShimV100 implements HiveShim {
@Override
public IMetaStoreClient getHiveMetastoreClient(HiveConf hiveConf) {
try {
return new HiveMetaStoreClient(hiveConf);
} catch (MetaException ex) {
throw new CatalogException("Failed to create Hive Metastore client", ex);
}
}
}
因此HiveCatalog.open
导致 HiveMetaStoreClient
的创建。
那么对于Kerberos代理,则需要HADOOP_PROXY_USER这个变量。
HADOOP_PROXY_USER的运行时设置
Flink 的 TableEnvironment 有这个API:
void registerCatalog(String catalogName, Catalog catalog);
这个将注册一个Catalog,对于持久化的Catalog,Flink目前只有HiveCatalog,那么可以覆盖HiveCatalog的子类的open/close方法来实现运行时切换用户。
new HiveCatalog(...) {
@Override
public void open() throws CatalogException {
wrapExecution(super::open);
}
@Override
public void close() throws CatalogException {
wrapExecution(super::close);
}
public void wrapExecution(Runnable consumer) {
//大致代码如下:
String current = System.getProperty(HADOOP_PROXY_USER);
try {
System.setProperty(HADOOP_PROXY_USER, slankkaProvidedAccount);
consumer.run();
} finally {
if (current != null) {
System.setProperty(HADOOP_PROXY_USER, current);
} else {
System.clearProperty(HADOOP_PROXY_USER);
}
}
}
}
篇幅有限,大致记录一个思路。
合集:
助力长期平稳运行大数据作业
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!