Flink集成Hive之Hive Catalog与Hive Dialect--以Flink1.12

本文介绍了Flink集成Hive中的Hive Catalog和Hive Dialect概念。Hive Catalog用于管理Flink元数据,通过Hive MetaStore持久化,简化数据操作。Hive Dialect则允许使用HiveQL语法进行DDL和DML操作。内容包括Hive Catalog的使用,如创建Hive兼容表和普通表,并在Flink SQL CLI中配置和操作。此外,还探讨了Hive Dialect的配置与使用限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇分享Flink集成Hive之快速入门–以Flink1.12为例中,介绍了Flink集成Hive的进本步骤。本文分享,将继续介绍Flink集成Hive的另外两个概念:Hive Catalog与Hive Dialect。本文包括以下内容,希望对你有所帮助。

  • 什么是Hive Catalog
  • 如何使用Hive Catalog
  • 什么是Hive Dialect
  • 如何使用Hive Dialect

公众号『大数据技术与数仓』,回复『资料』领取大数据资料包

什么是Hive Catalog

我们知道,Hive使用Hive Metastore(HMS)存储元数据信息,使用关系型数据库来持久化存储这些信息。所以,Flink集成Hive需要打通Hive的metastore,去管理Flink的元数据,这就是Hive Catalog的功能。

Hive Catalog的主要作用是使用Hive MetaStore去管理Flink的元数据。Hive Catalog可以将元数据进行持久化,这样后续的操作就可以反复使用这些表的元数据,而不用每次使用时都要重新注册。如果不去持久化catalog,那么在每个session中取处理数据,都要去重复地创建元数据对象,这样是非常耗时的。

如何使用Hive Catalog

HiveCatalog是开箱即用的,所以,一旦配置好Flink与Hive集成,就可以使用HiveCatalog。比如,我们通过FlinkSQL 的DDL语句创建一张kafka的数据源表,立刻就能查看该表的元数据信息。

HiveCatalog可以处理两种类型的表:一种是Hive兼容的表,另一种是普通表(generic table)。其中Hive兼容表是以兼容Hive的方式来存储的,所以,对于Hive兼容表而言,我们既可以使用Flink去操作该表,又可以使用Hive去操作该表。

普通表是对Flink而言的,当使用HiveCatalog创建一张普通表,仅仅是使用Hive MetaStore将其元数据进行了持久化,所以可以通过Hive查看这些表的元数据信息(通过DESCRIBE FORMATTED命令),但是不能通过Hive去处理这些表,因为语法不兼容。

对于是否是普通表,Flink使用is_generic属性进行标识。默认情况下,创建的表是普通表,即is_generic=true,如果要创建Hive兼容表,需要在建表属性中指定is_generic=false

尖叫提示:

由于依赖Hive Metastore,所以必须开启Hive MetaStore服务

代码中使用Hive Catalog

   EnvironmentSettings settings = EnvironmentSettings.newInstance().useBlinkPlanner().build();
        TableEnvironment tableEnv = TableEnvironment.create(settings);

        String name            = "myhive";
        String defaultDatabase = "default";
        String hiveConfDir = "/opt/modules/apache-hive-2.3.4-bin/conf";

        HiveCatalog hive = new HiveCatalog(name, defaultDatabase, hiveConfDir);
        tableEnv.registerCatalog("myhive", hive);
        // 使用注册的catalog
        tableEnv.useCatalog("myhive");

Flink SQLCli中使用Hive Catalog

在FlinkSQL Cli中使用Hive Catalog很简单,只需要配置一下sql-cli-defaults.yaml文件即可。配置内容如下:

catalogs:
   - name: myhive
     type: hive
     default-database: default
     hive-conf-dir: /opt/modules/apache-hive-2.3.4-bin/conf

在FlinkSQL Cli中创建一张kafka表,该表默认为普通表,即is_generic=true

CREATE TABLE user_behavior ( 
    `user_id` BIGINT, -- 用户id
    `item_id` BIGINT, -- 商品id
    `cat_id` BIGINT, -- 品类id
    `action` STRING, -- 用户行为
    `province` INT, -- 用户所在的省份
    `ts` BIGINT, -- 用户行为发生的时间戳
    `proctime` AS PROCTIME(), -- 通过计算列产生一个处理时间列
    `eventTime` AS TO_TIMESTAMP
### 如何使用 Flink 将流数据写入 Hive #### 配置依赖项 为了使 Flink 能够 Hive 交互,需要引入必要的 Maven 依赖项。以下是所需的依赖项列表: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-hive_${scala.binary.version}</artifactId> <version>${flink.version}</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>3.1.2</version> </dependency> ``` 这些依赖项提供了 FlinkHive集成支持[^2]。 --- #### 初始化 Hive Catalog Flink 提供了 `HiveCatalog` 类用于连接 Hive 元存储。以下是一个典型的初始化过程: ```java String name = "myhive"; String defaultDatabase = "default"; String hiveConfDir = "/path/to/hive/conf"; // 替换为实际路径 String version = "3.1.2"; HiveCatalog hiveCatalog = new HiveCatalog(name, defaultDatabase, hiveConfDir, version); tEnv.registerCatalog("myhive", hiveCatalog); // 设置默认目录和数据库 tEnv.useCatalog("myhive"); tEnv.useDatabase("db1"); // 设置 SQL 方言为 HIVE tEnv.getConfig().setSqlDialect(SqlDialect.HIVE); ``` 这段代码注册了一个名为 `myhive` 的 Hive 目录,并将其设置为当前环境的默认目录[^1]。 --- #### 定义 Kafka 数据源 假设输入数据来自 Kafka,则可以通过定义一个 Kafka 表来接收数据。以下是一个示例: ```sql CREATE TABLE kafka_source_table ( userId STRING, amount DOUBLE, ts TIMESTAMP(3), WATERMARK FOR ts AS ts - INTERVAL &#39;5&#39; SECOND -- 添加水印以处理乱序事件 ) WITH ( &#39;connector&#39; = &#39;kafka&#39;, &#39;topic&#39; = &#39;input_topic&#39;, &#39;properties.bootstrap.servers&#39; = &#39;localhost:9092&#39;, &#39;format&#39; = &#39;json&#39; ); ``` 此表定义指定了 Kafka 连接器以及 JSON 格式的解析方式[^3]。 --- #### 插入数据到 Hive 表 一旦 Kafka 数据源准备就绪,就可以通过 SQL 查询将数据插入到目标 Hive 表中。例如: ```sql INSERT INTO db1.fs_table SELECT userId, amount, DATE_FORMAT(ts, &#39;yyyy-MM-dd&#39;) AS day, DATE_FORMAT(ts, &#39;HH&#39;) AS hour, DATE_FORMAT(ts, &#39;mm&#39;) AS minute FROM kafka_source_table; ``` 这条语句从 `kafka_source_table` 中提取数据,并按指定格式转换后插入到 Hive 表 `fs_table` 中。 --- #### 执行任务 最后一步是执行查询操作: ```java tEnv.executeSql(insertSql).print(); ``` 这将启动作业并将数据持续写入 Hive 表[^4]。 --- #### 自动创建 Hive 表(可选) 如果目标 Hive 表尚未存在,Flink 支持动态创建表。例如,在上述 INSERT 操作之前运行如下 DDL 命令即可: ```sql CREATE TABLE IF NOT EXISTS db1.fs_table ( userId STRING, amount DOUBLE, day STRING, hour STRING, minute STRING ) PARTITIONED BY (day) STORED AS PARQUET; ``` 这样可以确保即使表不存在也不会中断流程[^5]。 --- ### 注意事项 1. **分区策略**:对于大规模数据集,建议合理设计分区字段以优化性能。 2. **文件格式**:推荐使用 Parquet 或 ORC 等列式存储格式提升压缩率和查询效率。 3. **资源管理**:确保集群有足够的计算资源应对实时写入需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值