【无标题】

背景

  • Flink Table/SQL 任务开发中,常见多种数据源混合使用,如 Kafka、Hive 等。
  • 生产要求 :Kafka 等 Source 表不要注册到 Hive Metastore,Hive Sink 表必须在 HiveCatalog/Hive Metastore 中注册,以保证数据治理、权限、血缘等规范。

常见问题

  • 误操作:在 HiveCatalog 下创建了 Kafka Source 表,导致该表结构同步进 Hive Metastore,Hive CLI 能查到"假表",影响治理。
  • 跨 Catalog 查询:切换 Catalog 后直接用表名引用其它 Catalog 下的表,会报 "Object not found" 错误。

方法:全限定名写法(生产环境标准)

步骤

  1. 注册 HiveCatalog,但不切换

    java 复制代码
    tenv.registerCatalog("myhive", hive);
  2. 在默认 Catalog 下创建 Kafka 源表

    java 复制代码
    tenv.useCatalog("default_catalog"); 
    tenv.executeSql("CREATE TABLE kafka_source (...) WITH ('connector'='kafka', ...)");
    ---------------------
    比如:
          tenv.useCatalog("default_catalog"); 
          tenv.executeSql(
                "CREATE TABLE IF NOT EXISTS kafka_source ( " +
                        " id STRING, " +
                        " name STRING, " +
                        " age INT " +
                        ") WITH ( " +
                        " 'connector' = 'kafka', " +
                        " 'topic' = 'flinktest1', " +
                        " 'properties.bootstrap.servers' = '192.168.77.88:9092', " +
                        " 'properties.group.id' = 'flink-group', " +
                        " 'scan.startup.mode' = 'earliest-offset', " +
                        " 'format' = 'json', " +
                        " 'json.fail-on-missing-field' = 'false', " +
                        " 'json.ignore-parse-errors' = 'true' " +
                        ")"
        );

```

  1. 切换到 HiveCatalog,创建 Sink 表

    java 复制代码
    tenv.useCatalog("myhive");
    tenv.executeSql("CREATE TABLE hive_sink (...) WITH ('connector'='hive', ...)");
    -----------------------
    比如:
        tenv.useCatalog(name);
        tenv.executeSql(
                "CREATE TABLE IF NOT EXISTS hive_sink ( " +
                        " id STRING, " +
                        " name STRING, " +
                        " age INT " +
                        ") WITH ( " +
                        " 'connector' = 'hive', " +
                        " 'table-name' = 'hive_sink' " +
                        ")"
        );
  2. insert 时,使用全限定名引用 Source 表

    java 复制代码
    tenv.executeSql("INSERT INTO hive_sink SELECT * FROM default_catalog.default_database.kafka_source");

关键点

  • Kafka Source 表只在 Flink 的 default_catalog 下注册,不写入 Hive Metastore。
  • Hive Sink 表只在 HiveCatalog 下注册,Hive CLI 能查到。
  • 跨 Catalog SQL 必须用全限定名 catalog.database.table。

优点

  • 保证 Hive Metastore 只含有真实的 Hive 表,血缘、权限清晰。
  • 避免非 Hive connector 表污染 HiveCatalog。
  • 生产安全,结构清晰。

最佳实践建议

  • Kafka/HBase/Print 等 Source 表,严禁在 HiveCatalog 下创建!
  • 跨 Catalog 访问 Source,SQL 必须用全限定名 catalog.database.table
  • 团队协作时将此写法纳入开发规范。

示意图

text 复制代码
[default_catalog]      [HiveCatalog(myhive)]
    |   kafka_source          |   hive_sink
    |   (仅 Flink 可见)         |   (Hive 可见)
    |                        |
           insert ... select default_catalog.default_database.kafka_source
相关推荐
二十六画生的博客5 小时前
每个subtask都提交一份快照到hdfs,会把10个小的快照合并成一个大的吗?谁来合并?
大数据·hadoop·hdfs·flink
juniperhan6 小时前
Flink 系列第24篇:Flink SQL 集成维度表指南:存储选型、参数调优与实战避坑
大数据·数据仓库·sql·flink
Justice Young7 小时前
Flink第五章:DataStream API
大数据·flink
渣渣盟1 天前
Flink 流处理那些事儿:状态、时间与容错
大数据·flink
Justice Young1 天前
Flink测试题目及知识点整理(一)
大数据·flink
渣渣盟1 天前
构建企业级实时数据管道:Kafka + Flink 最佳实践
分布式·flink·kafka
juniperhan2 天前
Flink 系列第22篇:Flink SQL 参数配置与性能调优指南:从 Checkpoint 到聚合优化
大数据·数据仓库·分布式·sql·flink
不剪发的Tony老师2 天前
Flink CDC:一个基于流的实时数据集成工具
flink·etl
juniperhan3 天前
Flink 系列第21篇:Flink SQL 函数与 UDF 全解读:类型推导、开发要点与 Module 扩展
java·大数据·数据仓库·分布式·sql·flink
二十六画生的博客3 天前
Flink快照保留多久、多少个,设置参数
大数据·flink