flink hive 异常以及解决办法

[ERROR] Could not execute SQL statement. Reason:
java.lang.NoClassDefFoundError: Could not initialize class org.apache.flink.table.catalog.hive.factories.HiveCatalogFactoryOptions

原因:缺失依赖
解决办法: 新增hive-exec-3.1.0.jar 依赖

[ERROR] Could not execute SQL statement. Reason:
java.lang.ClassNotFoundException: org.apache.hadoop.fs.FSDataInputStream

原因:缺少hadoop 依赖或者hadoop 的环境变量
解决办法:export HADOOP_CLASSPATH=hadoop classpath

type'='hive'
        at org.apache.flink.table.factories.FactoryUtil.createCatalog(FactoryUtil.java:264) ~[flink-table_2.11-1.13.0.jar:1.13.0]
        at org.apache.flink.table.api.internal.TableEnvironmentImpl.createCatalog(TableEnvironmentImpl.java:1241) ~[flink-table_2.11-1.13.0.jar:1.13.0]
        at org.apache.flink.table.api.internal.TableEnvironmentImpl.executeInternal(TableEnvironmentImpl.java:1104) ~[flink-table_2.11-1.13.0.jar:1.13.0]
        at org.apache.flink.table.client.gateway.local.LocalExecutor.lambda$executeOperation$3(LocalExecutor.java:213) ~[flink-sql-client_2.11-1.13.0.jar:1.13.0]
        at org.apache.flink.table.client.gateway.context.ExecutionContext.wrapClassLoader(ExecutionContext.java:90) ~[flink-sql-client_2.11-1.13.0.jar:1.13.0]
        at org.apache.flink.table.client.gateway.local.LocalExecutor.executeOperation(LocalExecutor.java:213) ~[flink-sql-client_2.11-1.13.0.jar:1.13.0]
        ... 11 more
Caused by: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
        at org.apache.hadoop.conf.Configuration.set(Configuration.java:1358) ~[hadoop-common-3.1.1.3.1.4.0-315.jar:?]
        at org.apache.hadoop.conf.Configuration.set(Configuration.java:1339) ~[hadoop-common-3.1.1.3.1.4.0-315.jar:?]
        at org.apache.hadoop.mapred.JobConf.setJar(JobConf.java:518) ~[hadoop-mapreduce-client-core-3.1.1.3.1.4.0-315.jar:?]
        at org.apache.hadoop.mapred.JobConf.setJarByClass(JobConf.java:536) ~[hadoop-mapreduce-client-core-3.1.1.3.1.4.0-315.jar:?]
        at org.apache.hadoop.mapred.JobConf.<init>(JobConf.java:430) ~[hadoop-mapreduce-client-core-3.1.1.3.1.4.0-315.jar:?]
        at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5135) ~[hive-exec-3.1.0.jar:3.1.0]
        at org.apache.hadoop.hive.conf.HiveConf.<init>(HiveConf.java:5103) ~[hive-exec-3.1.0.jar:3.1.0]
        at org.apache.flink.table.catalog.hive.HiveCatalog.createHiveConf(HiveCatalog.java:255) ~[flink-connector-hive_2.11-1.13.0.jar:1.13.0]
        at org.apache.flink.table.catalog.hive.HiveCatalog.<init>(HiveCatalog.java:180) ~[flink-connector-hive_2.11-1.13.0.jar:1.13.0]
        at org.apache.flink.table.catalog.hive.factories.HiveCatalogFactory.createCatalog(HiveCatalogFactory.java:76) ~[flink-connector-hive_2.11-1.13.0.jar:1.13.0]
        at org.apache.flink.table.factories.FactoryUtil.createCatalog(FactoryUtil.java:261) ~[flink-table_2.11-1.13.0.jar:1.13.0]
        at org.apache.flink.table.api.internal.TableEnvironmentImpl.createCatalog(TableEnvironmentImpl.java:1241) ~[flink-table_2.11-1.13.0.jar:1.13.0]
        at org.apache.flink.table.api.internal.TableEnvironmentImpl.executeInternal(TableEnvironmentImpl.java:1104) ~[flink-table_2.11-1.13.0.jar:1.13.0]
        at org.apache.flink.table.client.gateway.local.LocalExecutor.lambda$executeOperation$3(LocalExecutor.java:213) ~[flink-sql-client_2.11-1.13.0.jar:1.13.0]
        at org.apache.flink.table.client.gateway.context.ExecutionContext.wrapClassLoader(ExecutionContext.java:90) ~[flink-sql-client_2.11-1.13.0.jar:1.13.0]
        at org.apache.flink.table.client.gateway.local.LocalExecutor.executeOperation(LocalExecutor.java:213) ~[flink-sql-client_2.11-1.13.0.jar:1.13.0]

错误原因:
hive和hadoop的lib下面的guava.jar版本不一致造成的。
查看发现:
hive的lib下面的为guava-19.0.jar
hadoop的目录share/hadoop/common/lib下面的为guava-27.0.jar
解决:
保持都为高版本的。
删除hive的lib下面的guava-19.0.jar,然后拷贝hadoop下面的guava-27.0.jar即可。
还可以参考:https://blog.csdn.net/zhyajshhz/article/details/113249073

当使用 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 表的元数据,确保写入的数据能够立即被查询到。根据具体情况选择适合的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值