hive 在kettle 作业return code 2 的问题 Unexpected exception: Unexpected exception: Unexpected exception:

在使用Hive进行数据处理时遇到return code 2的错误,这可能由于向量化执行启用且数据量过大导致。为解决此问题,可以关闭向量化执行模式,通过设置`set hive.vectorized.execution.enabled=false`。日志显示了详细的错误堆栈,主要涉及MapReduce任务的MapOperator和MapJoinOperator。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 今天突然进去跑不了数据老是报错return code 2 .之前可以跑通的。

日志如下

矢量查询(Vectorized query) 每次处理数据时会将1024行数据组成一个batch进行处理,而不是一行一行进行处理,这样能够显著提高执行速度。
可以通过设置
set hive.vectorized.execution.enabled = true; 但是如果数据量很大,她的batch就会很多,有可能导致return code -2

解决方法:
set hive.vectorized.execution.enabled=false; 控制是否启用查询执行的向量模式。

  Log Upload Time: Thu Dec 20 15:38:52 +0800 2018
          
            Log Length: 2999805
          
            Showing 1000000 bytes of 2999805 total. Click 
            here
             for the full log.
   
    at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:179)
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:453)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1796)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row 、
    at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:507)
    at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:170)
    ... 8 more
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unexpected exception: Unexpected exception: Unexpected exception: Unexpected exception: Unexpected exception: Unexpected exception: parquet.column.values.dictionary.DictionaryValuesWriter$PlainBinaryDictionaryValuesWriter
    at org.apache.hadoop.hive.ql.exec.MapJoinOperator.processOp(MapJoinOperator.java:318)
    at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:815)
    at org.apache.hadoop.hive.ql.exec.TableScanOperator.processOp(TableScanOperator.java:97)
    at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.forward(MapOperator.java:157)
    at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:497)
    ... 9 more
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unexpected exception: Unexpected exception: Unexpected exception: Unexpected exception: Unexpected exception: parquet.column.values.dictionary.DictionaryValuesWriter$PlainBinaryDictionaryValuesWriter
    at org.apache.hadoop.hive.ql.exec.MapJoinOperator.processOp(MapJoinOperator.java:318)
    at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:815)
    at org.apache.hadoop.hive.ql.exec.CommonJoinOperator.internalForward(CommonJoinOperator.java:638)
    at org.apache.hadoop.hive.ql.exec.CommonJoinOperator.genAllOneUniqueJoinObject(CommonJoinOperator.java:670)
    at org.apache.hadoop.hive.ql.exec.CommonJoinOperator.checkAndGenObject(CommonJoinOperator.java:748)
    at org.apache.hadoop.hive.ql.exec.MapJoinOperator.processOp(MapJoinOperator.java:306)
    ... 13 more
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unexpected exception: Unexpected exception: Unexpected exception: Unexpected exception: parquet.column.values.dictionary.DictionaryValuesWriter$PlainBinaryDictionaryValuesWriter
    at org.apache.hadoop.hive.ql.exec.MapJoinOperator.processOp(MapJoinOperator.java:318)
    at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:815)
    at org.apache.hadoop.hive.ql.exec.CommonJoinOperator.internalForward(CommonJoinOperator.java:638)
    at org.apache.hadoop.hive.ql.exec.CommonJoinOperator.createForwardJoinObject(CommonJoinOperator.java:433)
    at org.apache.hadoop.hive.ql.exec.CommonJoinOperator.genObject(CommonJoinOperator.java:525)
    at org.apache.hadoop.hive.ql.exec.CommonJoinOperator.genObject(CommonJoinOperator.java:522)
    at org.apache.hadoop.hive.ql.exec.CommonJoinOperator.genJoinObject(CommonJoinOperator.java:451)
    at org.apache.hadoop.hive.ql.exec.CommonJoinOperator.checkAndGenObject(CommonJoi

<think>我们正在处理用户关于Hive v2运行时抛出空异常(null exception)的问题。根据引用内容,我们知道Hive中对NULL的处理与MySQL类似,但在某些情况下(如直接在WHERE子句中使用NULL)可能会抛出类型转换异常。此外,用户可能遇到了与Hive配置、UDF或元数据存储相关的问题。 根据引用[1],Hive中不能直接使用“WHERE NULL”,因为这会引发类型转换异常(无法将NULL转换为布尔类型)。因此,用户可能在查询中使用了不正确的NULL处理方式。 引用[5]提到了一个元数据存储的问题(使用MySQL存储元数据时创建表失败),但这可能与空异常问题无关。 考虑到用户提到的是“空异常”,我们应关注Hive中NULL值的正确处理方式,以及可能引发空指针异常(NullPointerException)的场景。 以下是可能的原因和解决方案: 1. **查询中直接使用NULL**:在Hive的WHERE子句中,不能直接使用`WHERE column = NULL`或`WHERE NULL`。正确的做法是使用`IS NULL`或`IS NOT NULL`,或者使用Hive的内置函数`nvl()`来处理NULL值。 2. **UDF中未处理NULL值**:如果用户使用了自定义UDF(如引用[2]),在UDF中可能没有对NULL值进行处理,导致当输入为NULL时抛出空指针异常。解决方案是修改UDF代码,在方法中显式检查NULL值并做适当处理。 3. **配置问题**:引用[3]中提到了Hive Server2的认证配置,如果配置不当可能导致连接问题,但通常不会直接抛出空异常。不过,如果配置文件中存在未初始化的变量,也可能导致空指针异常。检查配置文件(如hive-site.xml)中属性值是否正确设置,避免出现未定义的变量。 4. **小文件合并或输入格式设置**:引用[4]中提到了Hive优化中的小文件合并,这通常不会导致空异常,但如果在处理过程中遇到损坏的文件或格式错误,可能引发异常。确保输入文件格式正确,并且配置参数(如`hive.input.format`)设置合理。 5. **元数据问题**:引用[5]中的元数据存储问题(MySQL表创建失败)可能导致Hive操作失败,但错误信息通常不是空异常。如果元数据损坏,可能会引起各种异常。可以尝试修复元数据。 具体排查步骤: 步骤1:检查查询语句 - 确保在WHERE子句中不使用`= NULL`,而使用`IS NULL`。 - 使用COALESCE或NVL函数处理可能为NULL的字段。例如:`SELECT COALESCE(column, 0) FROM table;` 步骤2:检查UDF(如果使用了自定义UDF) - 确保UDF能够处理NULL输入。例如,在evaluate方法中: ```java public Text evaluate(Text input) { if (input == null) { return null; } // 其他处理 } ``` 步骤3:检查Hive配置 - 检查hive-site.xml配置文件,确保所有属性值都正确设置,特别是自定义认证类(如引用[3])的类路径是否正确。 步骤4:检查数据文件 - 确保输入数据中没有损坏的记录,特别是当使用复杂数据类型(如struct, array)时,确保数据格式与表定义一致。 步骤5:检查元数据 - 如果元数据存储在MySQL中,检查MySQL中的hive元数据库,确保表结构完整,没有损坏。 步骤6:查看详细错误日志 - 空异常通常会有堆栈信息,根据堆栈信息定位具体是哪个类哪一行代码抛出的异常。 如果问题仍然存在,可以尝试升级Hive版本,因为某些版本的Hive可能存在已知的NULL处理缺陷。 相关问题: 1. Hive中如何正确处理NULL值? 2. 如何编写能够处理NULL值的Hive UDF? 3. Hive配置错误会导致哪些常见异常? 4. Hive元数据存储故障如何修复? 5. Hive查询中如何避免类型转换异常?</think>### Hive v2 运行抛出空异常(Null Exception)的排查与解决 当 Hive v2 查询中涉及 NULL 值时,可能触发以下两类异常: 1. **类型转换异常**:直接操作 NULL 值(如 `WHERE NULL`) 2. **空指针异常**:UDF 或配置未正确处理 NULL 值 --- #### 一、NULL 值处理异常(类型转换错误) **问题复现**: ```sql -- 错误示例:直接使用 WHERE NULL SELECT * FROM table WHERE NULL; -- 抛出异常 ``` **解决方案**: 1. **使用 `IS NULL`/`IS NOT NULL` 替代** ```sql -- 正确写法 SELECT * FROM table WHERE column IS NULL; ``` 2. **使用 `COALESCE()` 或 `NVL()` 处理 NULL** ```sql -- 将 NULL 转换为默认值 SELECT COALESCE(null_column, 0) FROM table; ``` 3. **修改 Hive 配置**(hive-site.xml): ```xml <property> <name>hive.exec.default.partition.name</name> <value>__HIVE_DEFAULT_PARTITION__</value> <!-- 避免分区NULL冲突 --> </property> ``` --- #### 二、UDF 空指针异常(代码未处理 NULL) **问题原因**:自定义 UDF 未处理 NULL 输入[^2] **解决方案**: 1. **在 UDF 中显式检查 NULL**: ```java // Java UDF 示例 public Text evaluate(Text input) { if (input == null) return null; // 必须处理 NULL return new Text(input.toString().toUpperCase()); } ``` 2. **重新部署修复后的 UDF**: ```sql -- 删除旧函数 DROP FUNCTION myCount; -- 注册修复后的 UDF CREATE FUNCTION myCount AS 'com.example.FixedUDF' USING JAR 'hdfs:/path/fixed-udf.jar'; [^2] ``` --- #### 三、元数据存储异常(MySQL 元数据问题) **错误现象**: ``` Error in metadata: javax.jdo.JDODataStoreException: Can't create table 'hive.#sql-d7f_8' (errno: 121) [^5] ``` **解决方案**: 1. **修复 MySQL 表冲突**: ```sql -- 在 MySQL 元数据库执行 REPAIR TABLE hive.PARTITIONS; REPAIR TABLE hive.TBLS; ``` 2. **检查外键约束**: ```sql SHOW CREATE TABLE hive.PARTITIONS; -- 确认无冲突索引 ``` --- #### 四、认证配置导致的空指针 **问题定位**:自定义认证类未处理空凭据[^3] **修复步骤**: 1. 修改认证类 `CustomHiveServer2Auth.java`: ```java public void authenticate(String user, String password) { if (user == null || password == null) { throw new AuthenticationException("凭证不能为NULL"); // 显式拦截NULL } // ...其他逻辑 } ``` 2. 更新 hive-site.xml 配置: ```xml <property> <name>hive.server2.custom.authentication.file</name> <value>/path/to/valid/users.conf</value> <!-- 确保文件存在 --> </property> [^3] ``` --- #### 五、数据文件导致的 NULL 异常 **优化方案**(针对小文件合并): ```sql -- 启用小文件合并 SET hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; SET mapred.max.split.size=100000000; -- 100MB SET mapred.min.split.size=100000000; [^4] ``` > **作用**:合并小文件减少 NULL 值解析错误,避免空指针 --- ### 相关问题 1. Hive 中 `COALESCE()` 和 `NVL()` 函数有何区别? 2. 如何调试 Hive UDF 中的空指针异常? 3. Hive 元数据存储的最佳实践是什么? 4. 小文件合并如何影响 Hive 的 NULL 值处理? 5. Hive Server2 自定义认证有哪些常见陷阱? 通过以上步骤可解决大多数 NULL 异常问题,重点检查:**查询语法 > UDF 代码 > 元数据状态 > 配置文件**。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值