Hive metastore 无法解析分区字段 is not null问题排查

2024-09-04 17:18

本文主要是介绍Hive metastore 无法解析分区字段 is not null问题排查,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、问题描述
    • 二、解决方案

一、问题描述

周中发现一个问题,metastore根据条件获取分区时发生异常,导致扫描所有分区,最终导致gc异常。

hive编译时会进行逻辑优化,在执行分区裁剪时,会根据相关的分区过滤条件去metastore查询要扫描的分区目录。metastore会根据hiveserver传过来的条件表达式进行解析,然后过滤不需要的分区。

目前的问题是hiveserver传了一个 'date_p is not null’的子句,metastore这边无法解析(不支持),最终导致解析异常

另外经过测试发现如果hive QL中有between子句,并且join on中有分区字段,hiveserver查询分区时就会拼接 **‘date_p is not null’**的条件给metastore,导致metastore解析异常。

sql语句如下,其中date_p 是test表的一个分区

selectCOUNT(1)
from(selectdate_pfromtestwheredate_p BETWEEN 1and 2) ainner join (selectdate_pfromtestwheredate_p BETWEEN 1and 2) b on a.date_p = b.date_p;

metastore这边会收到分区过滤条件的语句:“date_p BETWEEN 1 AND 2 and date_p is not null”。

另外,将between换成大于、小于语句则可以正常运行。hiveserver 就不会自动拼接 "date_p is not null"给metastore。

二、解决方案

在metastore服务这边,PartFilterExprUtil#makeExpressionTree(PartitionExpressionProxy proxy,byte[] expr)会接收hiveserver传过来的分区过滤表达式,然后生成一个 ExpressionTree 后面用于去mysql中扫描分区。

代码如下

public static ExpressionTree makeExpressionTree(PartitionExpressionProxy expressionProxy,byte[] expr) throws MetaException {String filter = null;try {//使用PartitionExpressionProxy解析hiveserver传过来的数据,并生成分区过滤表达式filter = expressionProxy.convertExprToFilter(expr);} catch (MetaException ex) {throw new IMetaStoreClient.IncompatibleMetastoreException(ex.getMessage());}//根据分区过滤表达式构建ExpressionTree。如果filter中有 date_p is not null,因为不支持,此处就会报错return PartFilterExprUtil.makeExpressionTree(filter);
}

现在问题在于hiveserver传过来的 expr 中可能会有IsNotNull类型的过滤条件,metastore不支持,因此最简单的做法就是搜索 expr 中的所有节点,然后将IsNotNull节点移除,之后再去计算分区过滤表达式就不会带上date_p is Not Null了。

计算分区过滤表达式主要是PartitionExpressionProxy的工作,这是一个接口,metastore用的是它的实现类PartitionExpressionForMetastore,因此我们修改这个类的convertExprToFilter方法即可。

PartitionExpressionForMetastore#convertExprToFilter方法的原代码如下

@Override
public String convertExprToFilter(byte[] exprBytes) throws MetaException {return deserializeExpr(exprBytes).getExprString();
}

改成如下代码

@Override
public String convertExprToFilter(byte[] exprBytes) throws MetaException {ExprNodeGenericFuncDesc exprNodeGenericFuncDesc = deserializeExpr(exprBytes);GenericUDF genericUDF = exprNodeGenericFuncDesc.getGenericUDF();//如果是not null类型的过滤,就不处理if(genericUDF.getClass() == GenericUDFOPNotNull.class){return "";}//如果是and或者or类型,就检查子句中是否有not null类型的子句,有的话去掉Iterator<ExprNodeDesc> iterator = exprNodeGenericFuncDesc.getChildren().iterator();while (iterator.hasNext()){ExprNodeDesc child = iterator.next();if(child.getClass() == ExprNodeGenericFuncDesc.class){GenericUDF childUdf = ((ExprNodeGenericFuncDesc) child).getGenericUDF();if(childUdf.getClass() == GenericUDFOPNotNull.class){iterator.remove();}}}return exprNodeGenericFuncDesc.getExprString();
}

改完重新编译hive/ql 模块代码,然后替换到metastore的lib下的包重启即可。

由于PartitionExpressionForMetastore#convertExprToFilter中只有metastore的PartFilterExprUtil类会调用到,因此改造这个方法不会引起其他的问题。

这篇关于Hive metastore 无法解析分区字段 is not null问题排查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136535

相关文章

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F