flink通过连接hive的元数据管理自己的元数据表

首先感谢https://blog.csdn.net/zhangdongan1991/article/details/105582712的分享。
在开始之前可以先去官网阅读一下熟悉一下catalog的概念有助于后面的部署:https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/hive/hive_catalog.
阅读完了之后开始搞事情!
步骤1,你需要一个可以访问的hive(这个就不需要教程了,既然都到了这一步了你hive就肯定是有的)
步骤2,你需要一套有jdk8的服务器(最好三台可以部署flink的集群,为啥一定是jdk1.8呢,你也可以是jdk11不要怂,试一下你就会发现困难总比办法多)
步骤3,需要把你的hive-site.xml拷贝到你flink的服务器(flink是需要连接你hive的,而连接hive-site.xml是必不可少的,如果还有其他的连接方式你也可以试试)
步骤4,修改hive-site.xml


#修改hive-site.xml文件如下,此文件不是修改hive安装目录下面的文件而是你项目启动的环境
直接拷贝hive下面的过来修改了一样的

<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.120.130:9083</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>
hive.metastore.uris为hive的连接地址
hive.metastore.warehouse.dir为hive连接仓库

步骤5,需要把依赖的jar包添加到flink的lib下面点,具体的大于50M上传不了直接去下载:https://download.csdn.net/download/weixin_43943806/15727658 (没有C币的话联系我给你下载,当然你也可以一步步去搞这样印象深刻一点)
步骤6,修改sql-client-defaults.yaml (这个文件在flink安装包的conf下)中指定自己所需的 Catalog
注意:这里的hive-version要和你的hive版本以及hive-exec-1.2.1包的都要保持一致

execution:
    planner: blink
    ...
    current-catalog: myhive  # set the HiveCatalog as the current catalog of the session
    current-database: mydatabase
    
catalogs:
   - name: myhive
     type: hive
     hive-conf-dir: /opt/hive-conf
     hive-version: 1.2.1
		 

步骤7,启动 sql-client


./sql-client.sh embedded

//出现以下情况表示启动成功

Command history file path: /root/.flink-sql-history
                                   ▒▓██▓██▒
                               ▓████▒▒█▓▒▓███▓▒
                            ▓███▓░░        ▒▒▒▓██▒  ▒
                          ░██▒   ▒▒▓▓█▓▓▒░      ▒████
                          ██▒         ░▒▓███▒    ▒█▒█▒
                            ░▓█            ███   ▓░▒██
                              ▓█       ▒▒▒▒▒▓██▓░▒░▓▓█
                            █░ █   ▒▒░       ███▓▓█ ▒█▒▒▒
                            ████░   ▒▓█▓      ██▒▒▒ ▓███▒
                         ░▒█▓▓██       ▓█▒    ▓█▒▓██▓ ░█░
                   ▓░▒▓████▒ ██         ▒█    █▓░▒█▒░▒█▒
                  ███▓░██▓  ▓█           █   █▓ ▒▓█▓▓█▒
                ░██▓  ░█░            █  █▒ ▒█████▓▒ ██▓░▒
               ███░ ░ █░          ▓ ░█ █████▒░░    ░█░▓  ▓░
              ██▓█ ▒▒▓▒          ▓███████▓░       ▒█▒ ▒▓ ▓██▓
           ▒██▓ ▓█ █▓█       ░▒█████▓▓▒░         ██▒▒  █ ▒  ▓█▒
           ▓█▓  ▓█ ██▓ ░▓▓▓▓▓▓▓▒              ▒██▓           ░█▒
           ▓█    █ ▓███▓▒░              ░▓▓▓███▓          ░▒░ ▓█
           ██▓    ██▒    ░▒▓▓███▓▓▓▓▓██████▓▒            ▓███  █
          ▓███▒ ███   ░▓▓▒░░   ░▓████▓░                  ░▒▓▒  █▓
          █▓▒▒▓▓██  ░▒▒░░░▒▒▒▒▓██▓░                            █▓
          ██ ▓░▒█   ▓▓▓▓▒░░  ▒█▓       ▒▓▓██▓    ▓▒          ▒▒▓
          ▓█▓ ▓▒█  █▓░  ░▒▓▓██▒            ░▓█▒   ▒▒▒░▒▒▓█████▒
           ██░ ▓█▒█▒  ▒▓▓▒  ▓█                █░      ░░░░   ░█▒
           ▓█   ▒█▓   ░     █░                ▒█              █▓
            █▓   ██         █░                 ▓▓        ▒█▓▓▓▒█░
             █▓ ░▓██░       ▓▒                  ▓█▓▒░░░▒▓█░    ▒█
              ██   ▓█▓░      ▒                    ░▒█▒██▒      ▓▓
               ▓█▒   ▒█▓▒░                         ▒▒ █▒█▓▒▒░░▒██
                ░██▒    ▒▓▓▒                     ▓██▓▒█▒ ░▓▓▓▓▒█▓
                  ░▓██▒                          ▓░  ▒█▓█  ░░▒▒▒
                      ▒▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▓▓  ▓░▒█░
          
    ______ _ _       _       _____  ____  _         _____ _ _            _  BETA   
   |  ____| (_)     | |     / ____|/ __ \| |       / ____| (_)          | |  
   | |__  | |_ _ __ | | __ | (___ | |  | | |      | |    | |_  ___ _ __ | |_ 
   |  __| | | | _ \| |/ /  \___ \| |  | | |      | |    | | |/ _ \ _ \| __|
   | |    | | | | | |      ____) | |__| | |____  | |____| | |  __/ | | | |_ 
   |_|    |_|_|_| |_|_|\_\ |_____/ \___\_\______|  \_____|_|_|\___|_| |_|\__|
          
        Welcome! Enter &apos;HELP;&apos; to list all available commands. &apos;QUIT;&apos; to exit.


>Flink SQ

步骤8,启动成功后我们录入一个kafka的元数据(这个kafak前提是可以连接通)

Flink SQL> show catalogs;
default_catalog
myhive

Flink SQL> use catalog myhive;

Flink SQL> show databases;
default
dim
dm
dw
dwd
hive_bak
myhive
ods
qa_dev
qa_pro
st




Flink SQL>  CREATE TABLE UserScores (requestId STRING,recordCount STRING)
   WITH (
     'connector' = 'kafka',
     'topic' = 'nima',
     'properties.bootstrap.servers' = '192.168.120.130:9092',
     'properties.group.id' = 'testGroup1',
     'format' = 'json',
     'scan.startup.mode' = 'group-offsets');
		 
		 
>Flink SQ		 select * from userscores;

//会出现具体的kafka的查询结果
		 

步骤8,怎么用java来访问这个数据库呢

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);
        String name = "myhive";
        String defaultDatabase = "default";
        String hiveConfDir = "/opt/app";

        HiveCatalog hive = new HiveCatalog(name, defaultDatabase, hiveConfDir);
        tEnv.registerCatalog("myhive", hive);

        tEnv.useCatalog("myhive");
      
        tEnv.useDatabase("default");
        tEnv.sqlQuery("select * from userscores").execute().print();

注意:1.请使用1.8的jdk不要问为什么都是泪

2.启动过程中遇到各种错一般都是jar包的问题耐心查看

3.启动sql-client的前提是先启动了flink

当使用 FlinkHive 时,如果元数据没有及时更新,导致数据无法查到,可以尝试以下几个解决方案: 1. 手动刷新 Hive 元数据:在 Flink 写入数据到 Hive 后,可以手动执行 Hive 的 `MSCK REPAIR TABLE` 命令来刷新元数据。这个命令会检查的分区信息,并将新添加的分区添加到 Hive元数据中。例如,在 Hive 命令行中执行以下命令来刷新元数据: ```sql MSCK REPAIR TABLE your_table; ``` 2. 配置的自动刷新:可以在 Hive 的属性中配置自动刷新元数据的设置。在创建或者修改结构时,可以添加 `tblproperties('auto.purge'='true')` 属性,这样 Hive 会自动刷新元数据。例如: ```sql CREATE TABLE your_table ( -- 的列定义 ) STORED AS PARQUET LOCATION '/path/to/table' TBLPROPERTIES ( 'auto.purge' = 'true' ); ``` 3. 使用外部:如果你希望 Flink 写入的数据能够立即被查询到,可以考虑使用 Hive 的外部。外部将数据存储在外部文件系统中,并通过 Hive 进行管理。当 Flink 写入数据到外部时,数据会直接写入到外部文件系统,而不会影响 Hive元数据信息。这样可以确保写入的数据可以立即被查询到。创建外部的方式如下: ```sql CREATE EXTERNAL TABLE your_table ( -- 的列定义 ) STORED AS PARQUET LOCATION '/path/to/table'; ``` 需要注意的是,外部需要手动管理数据的一致性和清理,因为 Hive 不会自动删除外部的数据。 4. 使用 HiveCatalog:如果你正在使用 FlinkHiveCatalog 连接连接 Hive,可以尝试在写入数据后,调用 `catalog.refreshTable()` 方法来手动刷新 Hive 元数据。例如: ```java HiveCatalog hiveCatalog = ... // 初始化 HiveCatalog TableEnvironment tableEnv = ... // 初始化 TableEnvironment // Flink 写入数据到 Hive ... // 刷新 Hive 元数据 tableEnv.getCatalog(hiveCatalog.getName()).ifPresent(catalog -> { try { catalog.refreshTable(new ObjectPath("your_database", "your_table")); } catch (Exception e) { // 异常处理 } }); ``` 通过以上方法,你可以手动刷新 Hive 元数据,确保写入的数据能够立即被查询到。根据具体情况选择适合的解决方案。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘎子吱吱吱吱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值