在线支持
在线支持
微信支持
微信支持
如何根据错误信息定位出现问题的发生阶段以及错误类别 精华
2022-11-22 11:07:51
112次阅读
0个评论
大家在使用Inceptor的时候,可能会因为各种原因导致SQL语句发生错误,一般错误信息会由如下几部分组成:

1. 错误发生阶段
  • COMPILE FAILED:编译阶段(并未生成task)
  • EXECUTION FAILED:执行阶段(已生成task,在task执行过程中出错)
2. 错误类别
  • Parse error:词法/语法错误(由AntLR报出)
  • Semantic error:语义错误(语法合规但是意义不正确)
  • Internal error + 异常类型:编译器内部错误
a.异常类型为真正抛出的异常的类名
  • Task + 任务名 + error + 异常类型:Task执行错误
a. 任务名为编译生成的task名字,如Spark,DDL,PLSQL等等
b. 异常类型为真正抛出的异常的类名
3. 错误内容
  • [Error code] + 异常信息
a. Error code为真正的错误码,将来会形成完整的文档,根据该异常码准确的找到错误原因及解决办法。
b. 异常信息为具体的异常原因,在现阶段为判断错误的主要根据
4. 客户端内容
  • JDBC中直接catch到的SQLException中,Message即为上述内容,同时可以拿到SQLException中的SQLState和ErrorCode
  • BeeLine客户端因为使用的是JDBC,所以会得到上述内容,并且会在整条信息的头部添加ERROR或者WARNING前缀,以及(state=,code=)后缀

举例:

红字部分表示错误发生阶段,绿字部分表示错误类别,蓝字部分表示错误内容

COMPILE FAILED: Parse error: [Error 40000] line 1:0 cannot recognize input near 'seletc' '*' 'from'

表示编译阶段出错,为语法错误,内容为不认识seletc这个单词

COMPILE FAILED: Semantic error: [Error 10001] Table not found t

表示编译阶段出错,为语义错误,内容为表t不存在

COMPILE FAILED: Internal error ClassCastException: [Error 40000] org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc cannot be cast to org.apache.hadoop.hive.ql.plan.ExprNodeConstantDesc

表示编译阶段出错,为编译器内部错误,异常为ClassCastException,内容为ExprNodeGenericFuncDesc类不能转换为ExprNodeConstantDesc类(显然是代码里的逻辑不正确,武断的做了强转)

EXECUTION FAILED: Task DDL error HiveException: [Error 1] AlreadyExistsException(message:Table t already exists)

表示执行阶段出错,执行的task为DDL task,异常为HiveException,内容为表已存在

EXECUTION FAILED: Task MAPRED-SPARK error HiveException: [Error 1] MetaException(message:Filtering is supported only on partition keys of type string)

表示执行阶段出错,执行的task为Spark task,异常为HiveException,内容为单值partition只允许用string来做过滤(显然这里的error code 1依然是非常不准确的,有待梳理)

EXECUTION FAILED: Task EXEC PLSQL error PLException: [Error -1024] USER_DEFINED

Program Output:

Now firing dynamic sql.

PL block in dynamic sql100

*********************************************

ANONYMOUS BLOCK (LINE 6, COLUMN 0, TEXT "raise ex")

PROCEDURE 'error_dynamic_sql_test' (LINE 15, COLUMN 18, TEXT "execute immediate stmt using s_var, 100; (statement: declare

ex exception

pragma exception_init(ex, -1024)

begin

put_line(:s || :i)

raise ex

select * from t1 t1

end; :s="PL block in dynamic sql"; :i=100.)")

ANONYMOUS BLOCK (LINE 2, COLUMN 0, TEXT "error_dynamic_sql_test();")

*********************************************

表示执行阶段出错,执行的task为PLSQL task,异常为PLSQL系统异常(PLException),内容为用户显式抛出了自定义异常(异常码为-1024),并且附带了PLSQL程序的标准输出(Program Output)和callstack

注,如果是使用BeeLine的同学,会看到如下格式:

Error: EXECUTION FAILED: Task MAPRED-SPARK error HiveException: [Error 1] MetaException(message:Filtering is supported only on partition keys of type string) (state=08S01,code=1)

粉字部分为BeeLine附带的异常信息,目前没有对这部分做处理,可以适当无视



收藏 0 0

登录 后评论。没有帐号? 注册 一个。

admin

官方人员
  • 0 回答
  • 0 粉丝
  • 0 关注