Exception in thread "main" java.lang.NoSuchFieldError: INSTANCE

解决HTTPClient版本过低问题
本文介绍了解决因HTTPClient及HTTPCore版本过低导致的NoSuchFieldError异常的方法。建议将对应版本更新至4.3以上,并检查替换Hadoop及相关组件如Sqoop、Hive等下的相关jar文件。

Exception in thread "main" java.lang.NoSuchFieldError: INSTANCE

 

此原因是由於httpclient & httpcore 版本過低(<4.3)

 

Solution :

   替換hadoop_home folder 下面所有httpclient & httpcore.jar 為大於4.3. (保守起見,把sqoop , hive ,hbase ,spark 下對應的包也檢查替換一下。)

### 问题分析 `java.lang.NoSuchFieldError: METASTOREURIS` 错误通常出现在 Flink 使用 HiveCatalog 连接 Hive Metastore 的过程中。该异常表明运行时类路径中缺少某个字段(`METASTOREURIS`),这通常是由于 Flink 与 Hive 依赖版本不兼容导致的。Hive 的配置类(如 `HiveConf`)在不同版本中字段名称或类结构可能发生变化,而 Flink 的 HiveCatalog 模块可能依赖于特定版本的 Hive API,导致运行时字段缺失异常。 ### 解决方案 #### 1. 确保 Flink 与 Hive 版本兼容 Flink 的 HiveCatalog 模块依赖于 Hive 的客户端库(如 `hive-metastore` 和 `hive-common`)。不同版本的 Flink 支持的 Hive 版本不同。例如: - Flink 1.16 支持 Hive 3.x - Flink 1.14 支持 Hive 3.1.2 - Flink 1.12 支持 Hive 3.1.3 使用不兼容的 Hive 版本可能导致 `NoSuchFieldError` 异常。建议查阅 Flink 官方文档,确保所使用的 Hive 版本在支持范围内[^3]。 #### 2. 使用正确的 Hive 依赖包 确保 Flink 使用的 Hive 依赖包是正确的版本,并且没有多个版本共存。多个版本的 Hive 依赖可能导致类加载冲突,进而引发字段缺失异常。可将 Hive 的依赖包放置在 Flink 的 `lib` 目录下,或在提交作业时通过 `--classpath` 指定: ```bash flink run -c org.example.JobClass \ --jarfile /path/to/flink-hive-catalog-1.16.0.jar \ --classpath $(echo /path/to/hive-libs/*.jar | tr ' ' ':') \ /path/to/job.jar ``` #### 3. 显式配置 Hive Metastore URI 在创建 HiveCatalog 时,应显式配置 Hive Metastore URI,避免因默认配置导致字段缺失问题。例如,在 Flink SQL 中创建 HiveCatalog 时,应指定 `hive.metastore.uris`: ```sql CREATE CATALOG hive_catalog WITH ( 'type' = 'hive', 'hive-conf-dir' = '/path/to/hive/conf', 'default-database' = 'default', 'hive.metastore.uris' = 'thrift://metastore-host:9083' ); ``` 确保 `hive.metastore.uris` 配置项正确无误,并与 Hive Metastore 服务地址一致。 #### 4. 使用 Flink 提供的 Hive Catalog 模块 使用 Flink 发行版中提供的 Hive Catalog 模块(如 `flink-connector-hive` 或 `flink-table-store-hive`),这些模块经过版本适配测试,可减少兼容性问题。例如: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-hive_2.12</artifactId> <version>1.16.0</version> </dependency> ``` #### 5. 升级或降级 Flink 和 Hive 版本 如果问题仍然存在,考虑升级或降级 Flink 和 Hive 的版本,以匹配兼容的组合。例如,Flink 1.14 与 Hive 3.1.2 之间存在兼容性问题,升级到 Flink 1.16 或 Hive 3.1.3 可能解决此类问题[^4]。 --- ### 示例代码 以下是一个使用 HiveCatalog 的完整示例: ```java import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; public class HiveCatalogExample { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tEnv = StreamTableEnvironment.create(env); String createCatalog = "CREATE CATALOG hive_catalog WITH (" + "'type' = 'hive'," + "'hive-conf-dir' = '/path/to/hive/conf'," + "'hive.metastore.uris' = 'thrift://metastore-host:9083'" + ")"; tEnv.executeSql(createCatalog); tEnv.useCatalog("hive_catalog"); tEnv.executeSql("SHOW DATABASES").print(); } } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值