在hive上使用udf时如何修复此kryo异常?

lbsnaicq  于 2021-06-27  发布在  Hive
关注(0)|答案(2)|浏览(838)

我有一个在HortonWorks2.6沙盒中工作的配置单元查询,但它在沙盒版本中不工作。3.0因为这个例外:

Caused by: org.apache.hive.com.esotericsoftware.kryo.KryoException: Encountered unregistered class ID: 95                                                                                                          
Serialization trace:                                                                                                                                                                                               
parentOperators (org.apache.hadoop.hive.ql.exec.vector.reducesink.VectorReduceSinkLongOperator)                                                                                                                    
childOperators (org.apache.hadoop.hive.ql.exec.vector.VectorFilterOperator)                                                                                                                                        
childOperators (org.apache.hadoop.hive.ql.exec.TableScanOperator)                                                                                                                                                  
aliasToWork (org.apache.hadoop.hive.ql.plan.MapWork)                                                                                                                                                               
        at org.apache.hive.com.esotericsoftware.kryo.util.DefaultClassResolver.readClass(DefaultClassResolver.java:137)                                                                                            
        at org.apache.hive.com.esotericsoftware.kryo.Kryo.readClass(Kryo.java:670)                                                                                                                                 
        at org.apache.hadoop.hive.ql.exec.SerializationUtilities$KryoWithHooks.readClass(SerializationUtilities.java:185)

我该怎么修?
我已经看到了一些建议做的答案 set hive.exec.parallel=false; 但它不起作用,我仍然得到这个错误。
我检查了我使用的库的版本并确保 hadoop version 以及 hive --version 匹配我在jar中使用的库的版本。
我也试过这个:https://community.hortonworks.com/content/supportkb/150199/orgapachehivecomesotericsoftwarekryokryoexception-1.html 它也不起作用。

amrnrhlw

amrnrhlw1#

我终于可以运行我的查询后,我缩小了我的尺寸 udf.jar . 它以前是150MB,我把它减少到50KB。它看起来像一只kryo虫子。我从这里得到这个信息:https://github.com/esotericsoftware/kryo/issues/307
我缩小了我的尺寸 udf.jar 通过将所有依赖项标记为 provided . 所以我从这里开始:

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>3.1.1</version>
</dependency>

对此:

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>3.1.1</version>
    <scope>provided</scope> <!--Notice this line-->
</dependency>

这绝对是一个kryo bug,因为我能够用这么大的 udf.jar 在hortonworks 2.6中归档。
我希望有人觉得这些信息很有价值。

r8uurelv

r8uurelv2#

实际上我指的是Hive的线https://issues.apache.org/jira/browse/hive-7711 christian betz博士对此问题的评论建议实现donothingserializer来解决这个异常。我试着实施这个解决方案,问题就解决了。但是,我无法理解添加序列化程序如何解决此问题的细节。在此链接中查找解决方案。尝试为扩展genericudf的类实现以下序列化程序。

import org.apache.hive.com.esotericsoftware.kryo.Kryo;

import org.apache.hive.com.esotericsoftware.kryo.Serializer;

import org.apache.hive.com.esotericsoftware.kryo.io.Input;

import org.apache.hive.com.esotericsoftware.kryo.io.Output;

public class DoNothingSerializer extends Serializer<App> {

@Override

public App read(Kryo arg0, Input arg1, Class<App> arg2) {

// TODO Auto-generated method stub

return new App();

}

@Override

public void write(Kryo arg0, Output arg1, App arg2) {

// TODO Auto-generated method stub

}

}

相关问题