hdp2.4安装 hive metastore无法启动

本文解决了一个特定问题:在CentOS 6.5使用Python 2.6版本时,Hive Metastore无法启动的情况。通过修改hive_metastore.py脚本并设置默认编码为UTF-8来解决此问题。

centos6.5上python的版本为2.6,会带来hive metastore启动不成功的问题,如下:


具体方法:

在hive的那台机器终端:

$vi /var/lib/ambari-agent/cache/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py

在脚本首添加如下:

import sys

reload(sys)

sys.setdefaultencoding('utf8')



<think> 首先,用户的问题是:“我想查找解决 'hive.stats.jdbc.timeout does not exist' 问题的方案 请问解决 hive.stats.jdbc.timeout does not exist 问题的方法”。 用户提供了几个引用: - 引用[1]: 提到错误是 "Caused by: java.lang.NoSuchFieldError: HIVE_STATS_JDBC_TIMEOUT",原因是类冲突,特别是 HiveConf 类冲突。 - 引用[2]: 也是同样的错误,提示是依赖包冲突。 - 引用[3]: 说错误是因为程序中没有依赖 Hive,却在配置中初始化了,删除 Hive 配置即可。 - 引用[4]: 提到这是由于 Hive 版本问题(该字段在 Hive 1.x 存在,但在 Hive 2.x 被删除),并给出了一个解决方案:重新编译 Spark 以移除这些字段。 用户的问题具体是 "hive.stats.jdbc.timeout does not exist",这与引用中的错误 "HIVE_STATS_JDBC_TIMEOUT" 相关。看起来 "HIVE_STATS_JDBC_TIMEOUT" 是 HiveConf 中的一个字段,而错误表明这个字段不存在。 关键点: - 错误通常发生在 Spark 或与 Hive 集成的环境中。 - 可能的原因: - 类冲突:多个版本的 Hive 或相关库冲突。 - 配置问题:使用了 Hive 配置但没有正确依赖。 - 版本不匹配:Hive 版本升级导致某些字段被删除。 从引用[4]中得知:"HIVE_STATS_JDBC_TIMEOUT" 在 Hive 1.x 中存在,但在 Hive 2.x 被删除。Spark 如果依赖 Hive 1.x 的 API,而环境使用的是 Hive 2.x,就会出现这个问题。 用户提到的错误是 "hive.stats.jdbc.timeout does not exist",这可能是配置错误。或许用户在配置文件中设置了 "hive.stats.jdbc.timeout",但这个属性在使用的 Hive 版本中不存在。 回顾用户问题:"hive.stats.jdbc.timeout does not exist",这听起来像是在配置或日志中出现的消息,类似于引用中的错误。 我需要基于这些引用提供解决方案。 可能的解决方案: 1. **检查依赖版本冲突**:确保所有库版本兼容。特别是 Spark 和 Hive 的版本匹配。如果使用 CDH 或 HDP,检查版本兼容性。 2. **移除不必要的 Hive 配置**:如果程序中没有真正使用 Hive,删除配置中所有与 Hive 相关的设置,正如引用[3]建议。 3. **更新或重新编译 Spark**:如果使用的是旧版 Spark 依赖 Hive 1.x,但环境是 Hive 2.x,考虑升级 Spark 或重新编译 Spark 以兼容新 Hive 版本,如引用[4]所示。 4. **调整配置**:避免使用过时的属性。检查 Hive 配置文件,确保所有属性是当前版本支持的。 5. **清理类路径**:确保没有多个版本的 Hive 库在类路径中。 回答结构: - 系统指令要求:中文回答,内联数学表达式用$...$,独立公式用$$...$$,语法正确,生成相关问题。 - 回答清晰:逐步解释问题和解决方案。 - 末尾添加相关问题。 步骤: 1. **解释问题**:简述错误原因。 2. **提供解决方案**:基于引用,给出几种方法。 3. **添加引用标识**:在相关段落末尾添加。 解决方案总结: - 方法1:检查并修复依赖冲突。确保只有一个版本的 Hive 库,版本兼容。 - 方法2:如果未使用 Hive,删除相关配置。 - 方法3:对于版本不匹配,升级 Spark 或 Hive 到兼容版本,或重新编译 Spark 移除过时字段。 - 方法4:检查配置属性是否正确。 生成相关问题: 基于主题,如 Spark 配置、Hive 版本管理、类冲突解决等。 最终回答用中文。 </think> 基于提供的引用和错误信息“hive.stats.jdbc.timeout does not exist”,该问题通常是由于 Hive 版本不兼容或配置冲突导致的,具体表现为类 `HiveConf` 中缺失 `HIVE_STATS_JDBC_TIMEOUT` 字段(该字段在 Hive 1.x 中存在,但在 Hive 2.x 中被移除)。这常见于 Spark 与 Hive 集成的场景中(如 Spark 作业或 Hive 配置)。下面我将一步步解释问题原因,并提供多种解决方案。解决方案按优先级排序,建议从方法1开始尝试。 ### 问题原因分析 - **核心问题**:错误 `NoSuchFieldError: HIVE_STATS_JDBC_TIMEOUT` 表示代码或配置引用了一个不存在的字段,这通常由以下原因引起: - **版本不匹配**:Hive 2.x 移除了 `HIVE_STATS_JDBC_TIMEOUT` 等字段(如引用[4]所述)。如果您的 Spark 版本依赖 Hive 1.x(如 Spark 2.4.6),但环境使用 Hive 2.x(如 CDH6.3.2),就会出现冲突[^4]。 - **依赖冲突**:类路径中存在多个 Hive 版本库(如 `hive-exec.jar` 冲突),导致加载了错误的 `HiveConf` 类[^1]。 - **配置错误**:程序中未真正依赖 Hive,但在配置文件中设置了 Hive 相关属性(如 `hive.stats.jdbc.timeout`),触发无效引用[^3]。 - **影响范围**:错误可能发生在 Spark 作业初始化、Hive 连接或 JDBC 统计操作中。 ### 解决方案 解决思路是优先检查配置和依赖,再考虑版本调整。以下是具体方法: #### 方法1: 检查并移除不必要的 Hive 配置(推荐优先尝试) 如果您的应用程序未实际使用 Hive(例如,仅在 Spark 中运行 SQL 查询且未启用 Hive 支持),删除所有 Hive 相关配置通常能快速解决问题。 - **步骤**: 1. 检查代码或配置文件(如 `spark-defaults.conf`、`hive-site.xml` 或程序初始化代码),移除所有引用 `hive.stats.jdbc.timeout` 或其他 Hive 属性的设置。例如: ```java // 错误示例:初始化时设置了 Hive 配置 SparkSession spark = SparkSession.builder() .appName("example") .config("spark.sql.hive.metastore.version", "2.3.0") // 移除此类配置 .config("hive.stats.jdbc.timeout", "30s") // 删除此行 .getOrCreate(); ``` 2. 清理并重启应用程序。 - **适用场景**:未使用 Hive 的场景(如纯 Spark SQL 作业)[^3]。 - **效果**:简单高效,避免了无效引用。 #### 方法2: 解决依赖冲突(常见于 Maven/Gradle 项目) 如果方法1无效,可能是类路径中存在多个 Hive 版本库。使用依赖分析工具检查并统一版本。 - **步骤**: 1. 分析依赖树: - Maven 项目:运行 `mvn dependency:tree | grep hive`。 - Gradle 项目:运行 `gradle dependencies --configuration runtimeClasspath | grep hive`。 2. 排除冲突库(例如,Spark 内置 Hive 1.x 但项目引入 Hive 2.x): ```xml <!-- Maven pom.xml 示例 --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_2.11</artifactId> <version>2.4.6</version> <exclusions> <exclusion> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>2.3.9</version> <!-- 统一为您的 Hive 环境版本 --> </dependency> ``` 3. 清理构建(`mvn clean install` 或 `gradle clean build`)并重新运行。 - **适用场景**:项目依赖多个 Hive 相关库(如 `hive-exec`、`hive-metastore`)[^1][^2]。 - **效果**:解决类加载冲突,确保只加载一个 Hive 版本。 #### 方法3: 调整版本兼容性或重新编译 Spark(适用于版本不匹配) 如果环境强制使用 Hive 2.x(如 CDH/HDP),但 Spark 依赖旧版本,需升级 Spark 或重新编译移除过时字段。 - **步骤**: 1. **升级 Spark**:将 Spark 升级到支持 Hive 2.x 的版本(如 Spark 3.x)。例如,Spark 3.0+ 默认兼容 Hive 2.3+。 2. **重新编译 Spark**(如果无法升级): - 下载 Spark 源码(如 2.4.6)。 - 移除源码中引用 `HIVE_STATS_JDBC_TIMEOUT` 的代码(通常在 `org/apache/spark/sql/hive/HiveUtils.scala` 文件中)。 - 编译并替换库: ```bash ./build/mvn -Pyarn -Phadoop-2.7 -Dhadoop.version=2.7.5 -Phive -Phive-thriftserver -DskipTests clean package ``` 然后用生成的 `spark-hive` jar 替换原有文件。 3. 验证:确保新版本或编译后库不再引用已移除字段[^4]。 - **适用场景**:Hive 版本升级(如从 1.x 迁移到 2.x)且 Spark 无法直接升级[^4]。 - **效果**:永久修复版本差异,但编译过程较复杂。 #### 方法4: 验证配置属性(补充检查) 确保配置属性名称正确,避免拼写错误或过时属性。 - **步骤**: 1. 检查 Hive 官方文档,确认当前版本支持的属性。例如,在 Hive 2.x 中,替代属性可能是 `hive.stats.fetch.column.stats.timeout`。 2. 在配置文件中使用正确属性: ```xml <!-- hive-site.xml 示例 --> <property> <name>hive.stats.fetch.column.stats.timeout</name> <!-- 替换为有效属性 --> <value>30s</value> </property> ``` 3. 重启服务。 - **适用场景**:配置错误或属性已弃用。 ### 注意事项 - **测试建议**:先在测试环境验证方案,避免影响生产。 - **日志分析**:运行应用时添加 `-verbose:class` JVM 参数,检查加载的 `HiveConf` 类路径。 - **版本对照**:Spark 和 Hive 版本兼容性参考: - Spark 2.4.x: 兼容 Hive 1.2.x - Spark 3.x: 兼容 Hive 2.3+ 确保环境版本对齐。 通过以上方法,大多数类似问题可解决。如果问题持续,请提供更多上下文(如 Spark/Hive 版本、配置文件片段)以便进一步诊断[^1][^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值