公司近期上火山云,hive、hadoop、tez等都有较大的版本升级,继而引发了 一系列的报错。现将遇到的报错内容以及相应解决方法列出来,供大家参考。
组件 | 升级前 | 升级后 |
---|---|---|
Hive | 1.2 | 2.3 |
Hadoop | 2.6 | 2.10 |
Tez | 0.7 | 0.10 |
开源的2.3版本 hive不支持直接dfs这种命令
将命令替换为:
hive> !hdfs fs -ls /ods/table_location;
加!可以将命令转为shell执行
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)
版本不兼容,这个是社区低版本的bug,高版本已不允许这样来使用
拆分为:a>0 and a<25
建表时必须要交代null的类型
建表时 null 给个默认类型
row、order是关键字,作为别名不能使用,在低版本中允许该语法,版本兼容性问题
换个别名,同时要考虑下游的使用情况。
translate入参不支持日期类型(timestamp)
改类型
Argument 2 of function CONCAT_WS must be “string or array”, but “array” was found
和6一样,都是版本差异
container内存不足,需要扩大container内存,当前是默认1核4G
单个任务
set hive.tez.container.size =6144;
ods_dd表下的数据确实有1子目录,需要确认数据来源
set mapreduce.input.fileinputformat.input.dir.recursive=true;
先写入临时表,在将临时表插入正式表
据本身的问题,存在这么一种情况,全部字段只有一个有值,另外全部为null,这个建议看看hdfs文件
1.替换执行引擎为TEZ
2. set hive.auto.convert.sortmerge.join =false;
元数据库字段字符集类型不对
--notification_log 表 MESSAGE 字段需要 改为 utf-8 编码
mysql> alter table notification_log modify MESSAGE longtext CHARACTER SET utf8 COLLATE utf8_general_ci;
此现象发生在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 下推