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的配置与使用限制。

在上一篇分享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
<think>好的,用户现在想了解Flink通过Catalog访问Hive表的具体配置方法和示例。之前用户询问了离线数仓架构,我在回答中提到了Hive Catalog的元数据管理和跨引擎访问,包括Flink。所以用户可能是在实际工作中需要将Flink集成到现有的Hive数仓环境中,进行数据处理。 首先,我需要确认FlinkHive集成的支持情况。Flink 1.11之后支持Hive Catalog,所以版本兼容性很重要。用户可能已经安装了FlinkHive,但需要检查他们的版本是否匹配,比如Flink 1.14对应Hive 3.x。 接下来,用户需要具体的配置步骤。这包括添加Hive依赖,配置Hive Conf和Hadoop类路径。这里要注意不同版本的Hive可能需要不同的依赖包,比如hive-exec的版本。同时,HADOOP_CLASSPATH的设置是关键,否则会找不到Hadoop的相关类。 然后是创建Hive Catalog的代码示例。用户可能需要用Scala或Java,这里选择Java,因为更通用。需要展示如何通过HiveCatalog创建Catalog,并在TableEnvironment中注册,这样后续就可以直接访问Hive中的表了。 另外,用户可能需要示例代码来读写Hive表,比如用Flink SQL查询已有的表,或者将Flink处理后的数据写入Hive新表。这里要注意Hive表的格式,比如是否使用ORC,以及分区设置。 还有可能的问题包括权限配置,比如Kerberos认证,或者处理Hive和HDFS的访问权限。此外,元数据同步的问题,比如在Flink中创建表后,Hive是否能立即看到,或者需要刷新元数据。 用户可能还关心性能优化,比如批处理模式和流处理的区别,Flink如何利用Hive的分区来加速查询,或者如何Hive的ACID特性兼容。不过根据问题,主要焦点还是在配置和基本使用方法上。 最后,要确保提供的配置步骤和代码示例能够实际运行,可能需要提醒用户根据实际环境调整路径和版本号。同时,给出常见问题的排查方法,比如ClassNotFound错误,通常是因为依赖缺失或类路径配置不正确。 总结来说,用户的需求是明确的步骤和可运行的示例,需要详细但清晰的指导,确保他们能够顺利集成FlinkHive Catalog,访问现有的数仓表进行数据处理。</think>### Flink通过Hive Catalog访问Hive表的完整指南 #### 一、前置条件准备 1. **版本兼容性** - Flink 1.11+ 支持Hive Catalog(推荐Flink 1.14 + Hive 3.x) - Hadoop集群需部署Hive Metastore服务[^4] 2. **依赖配置** ```xml <!-- flink-connector-hive --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-hive_2.12</artifactId> <version>${flink.version}</version> </dependency> <!-- Hive执行引擎依赖 --> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>${hive.version}</version> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> </exclusion> </exclusions> </dependency> ``` 3. **环境变量配置** ```bash # 配置Hive Conf路径 export HIVE_CONF_DIR=/opt/hive/conf # 配置Hadoop类路径 export HADOOP_CLASSPATH=`hadoop classpath` ``` #### 二、Hive Catalog创建注册 ```java // Java示例 import org.apache.flink.table.catalog.hive.HiveCatalog; HiveCatalog hiveCatalog = new HiveCatalog( "hive_catalog", // Catalog名称 "default", // 默认数据库 "/opt/hive/conf", // Hive配置文件路径 "2.3.6" // Hive版本号 ); TableEnvironment tableEnv = TableEnvironment.create(EnvironmentSettings.inBatchMode()); tableEnv.registerCatalog("hive_catalog", hiveCatalog); tableEnv.useCatalog("hive_catalog"); ``` #### 三、Hive表操作实战 1. **读取Hive表** ```sql -- 直接查询Hive表 SELECT user_id, COUNT(order_amount) FROM hive_catalog.default.user_orders WHERE dt=&#39;2023-08-01&#39; GROUP BY user_id; ``` 2. **写入Hive表** ```java // 创建Hive表(ORC格式) tableEnv.executeSql( "CREATE TABLE hive_catalog.default.output_table (\n" + " user_id STRING,\n" + " total_amount DECIMAL(10,2)\n" + ") PARTITIONED BY (dt STRING) \n" + "STORED AS ORC \n" + "TBLPROPERTIES (\n" + " &#39;partition.time-extractor.timestamp-pattern&#39;=&#39;$dt&#39;,\n" + " &#39;sink.partition-commit.delay&#39;=&#39;1 h&#39;,\n" + " &#39;sink.partition-commit.policy.kind&#39;=&#39;metastore,success-file&#39;\n" + ")" ); // 写入数据到Hive分区表 TableResult result = tableEnv.executeSql( "INSERT INTO output_table \n" + "SELECT user_id, SUM(order_amount), &#39;2023-08-01&#39; \n" + "FROM user_orders \n" + "GROUP BY user_id" ); ``` #### 四、关键配置参数 | 配置项 | 说明 | 示例值 | |-------------------------------|--------------------------------------------------------------------|-----------------------------| | `table.sql-dialect` | 设置SQL方言模式 | `hive` | | `table.exec.hive.fallback-mapred-reader` | 兼容旧版MapReduce读取器 | `true` | | `execution.checkpointing.interval` | 流处理模式下的检查点间隔 | `30000` (30秒) | #### 五、常见问题排查 1. **ClassNotFound异常** ```log java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf ``` **解决方案**:检查`hive-exec`依赖版本是否匹配,确认`HADOOP_CLASSPATH`已正确配置 2. **元数据同步失败** ```log metastore.HiveMetaStoreClient: Failed to get schema version. ``` **解决方案**:检查Hive Metastore服务状态,确认`hive-site.xml`中`metastore.uris`配置正确 3. **分区提交延迟** ```log Partition 2023-08-01 not found ``` **解决方案**:调整`sink.partition-commit.delay`参数,确保写入时延大于分区提交延迟时间 #### 六、进阶优化方案 1. **流批一体处理** ```java // 开启流模式处理Hive表 StreamTableEnvironment streamTableEnv = StreamTableEnvironment.create(env); streamTableEnv.executeSql("SET table.sql-dialect = hive"); ``` 2. **动态分区写入** ```sql -- 启用动态分区 SET hive.exec.dynamic.partition=true; SET hive.exec.dynamic.partition.mode=nonstrict; INSERT INTO user_behavior_log PARTITION (dt, hour) SELECT *, DATE_FORMAT(ts, &#39;yyyy-MM-dd&#39;), DATE_FORMAT(ts, &#39;HH&#39;) FROM kafka_source; ``` 3. **ACID表支持** ```sql -- 创建事务表(需Hive 3.x+) CREATE TABLE transactional_table ( id INT, name STRING ) STORED AS ORC TBLPROPERTIES ( &#39;transactional&#39;=&#39;true&#39;, &#39;compactor.mapreduce.map.memory.mb&#39;=&#39;2048&#39; ); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值