Hive常见报错与解决方案

背景

公司近期上火山云,hive、hadoop、tez等都有较大的版本升级,继而引发了 一系列的报错。现将遇到的报错内容以及相应解决方法列出来,供大家参考。

关于版本:
组件升级前升级后
Hive1.22.3
Hadoop2.62.10
Tez0.70.10

常见报错

1.hive中无法执行HDFS命令,查看目录属性等

报错内容

原因:

开源的2.3版本 hive不支持直接dfs这种命令

解决方案:

将命令替换为:

hive> !hdfs fs -ls /ods/table_location;

加!可以将命令转为shell执行

2.同一字段在两张表中类型分别为int 和string,不支持union all

FAILED: SemanticException Schema of both sides of union should match: Column c1 is of type int on first table and type string on second table.

原因:

新版版校验更加严格,要cast为同一种类型后才能union在一起

解决方案:

统一字段类型,cast( as string) 或者 cast( as int)

3.不支持连续的 0< a<25

原因:

版本不兼容,这个是社区低版本的bug,高版本已不允许这样来使用

解决方案:

拆分为:a>0 and a<25

4.FAILED: SemanticException [Error 10305]: CREATE-TABLE-AS-SELECT creates a VOID type, please use CAST to specify the type, near field: ins_choose_date

在这里插入图片描述

原因:

建表时必须要交代null的类型
在这里插入图片描述

解决方案:

建表时 null 给个默认类型

5.row 、order不支持作为字段别名

关键字作为别名报错

原因:

row、order是关键字,作为别名不能使用,在低版本中允许该语法,版本兼容性问题

解决方案:

换个别名,同时要考虑下游的使用情况。

6.translate 不支持date类型参数

原因:

translate入参不支持日期类型(timestamp)
官方说明

解决方案:

改类型

7.concat_ws不兼容date类型参数

Argument 2 of function CONCAT_WS must be “string or array”, but “array” was found

原因:

和6一样,都是版本差异

7.usage: 5.0 GB of 4 GB physical memory used; 6.5 GB of 8.4 GB virtual memory used. Killing container.

原因:

container内存不足,需要扩大container内存,当前是默认1核4G

解决方案:

单个任务

set hive.tez.container.size =6144;

8. Caused by: java.io.IOException: Not a file: hdfs://emr-cluster/ods/ods_dd/2

原因:

ods_dd表下的数据确实有1子目录,需要确认数据来源

解决方案:
set mapreduce.input.fileinputformat.input.dir.recursive=true;

9. tez执行多一层目录 /1 /2…

原因:
  1. 所有的union all 都会产生1和2这种子目录
  2. 只要满足merge File的条件(这里逻辑很复杂,主要一个是merge的阈值)都会都会merge,merge了之后就不会有子目录
  3. 如果union all里只有一个表有数据,那么只会产生一个子目录(即只有1或者2),这样的情况下不会merge
解决方案:

先写入临时表,再将临时表插入正式表

10.Caused by: java.lang.ArrayIndexOutOfBoundsException: 1

运行日志

原因:

数据本身的问题,存在这么一种情况,全部字段只有一个有值,另外全部为null,这个建议看看hdfs文件

解决方案:

1.替换执行引擎为TEZ
2. set hive.auto.convert.sortmerge.join =false;

11.动态分区load 多partition数据失败

原因:

元数据库字段字符集类型不对

解决方案:
--notification_log 表 MESSAGE 字段需要 改为 utf-8 编码
mysql> alter table  notification_log modify MESSAGE  longtext CHARACTER SET utf8 COLLATE utf8_general_ci;

12.Hive on tez和mr执行同一张表多次join结果不一致

此现象发生在a join a 的时候,且a是orc表。

原因:

总结了以下特征,是会必现上述结果:
1.同一脚本内(即多次查询在同一个Application内),对于一个orc格式的表,多次查询,条件不同
2.开启了run time filter
3.开启了orc push down
4.有inner join情况
5.run time filter作用的是orc表

解决方案:

建议切换hive on Tez引擎来处理。
如果不可切换tez引擎,建议修改参数 hive.optimize.index.filter=false,对执行性能有一定的影响,慎重修改。参数 hive.optimize.index.filter=false 可以避免将 TableScan 的 Filter 下推

13.Hive on tez 时,Caused by: java.io.FileNotFoundException: File hdfs://xxx-cluster/ods/ods_xx_month/dt_month=201707 does not exist.

在这里插入图片描述

原因:

元数据里有这个分区,但是 hdfs 没有分区目录。
在这里插入图片描述

解决方案:

在脚本里设置 set hive.tez.inputpath.exist.check=true ,忽略不存在的分区。

14.Caused by: java.lang.ArrayIndexOutOfBoundsException: 1

在这里插入图片描述

原因:

数据除了一个字段外其他数值为null? 这是其中一种情况

解决方案:
  1. 替换为引擎TEZ
  2. set hive.auto.convert.sortmerge.join =false

15.FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask. java.io.IOException: rename for src path: hdfs://xxx/warehouse/ol/ol_rpt_tablename/dt=20240702/.hive-staging_hive_2024-07-03_13-56-03_271_2405698886425645081-1/-ext-10000/000000_0 to dest path:hdfs://xxx/warehouse/ol/ol_rpt_tablename/dt=20240702/000000_0 returned false

 rename for src path报错图
背景:
建表时建立的是外部表,为了调整字段数据类型,删除表后又重新建立,导致数据并未被删除依然存在于HDFS上,只是将元数据删除掉而已。

原因:

Hive把临时文件移动到正式目录的时候,会先对hdfs上的文件做一个判断。如果指定位置上不存在该文件夹,就在指定位置上创建此文件夹;如果该文件夹存在则直接将文件移过去,既把临时文件夹里的000000_0文件移动到正式目录下,可此时正式目录下已经有了一个叫000000_0的文件,所以就会报如上的错误。

解决方案:

在HDFS上直接删除报错文件

hdfs dfs -rm -r hdfs://xxx_cluster/warehouse/ol/ol_rpt_tablename/dt=20240702

16.待补充更新

原因:
解决方案:
  • 33
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值