在配置单元上使用 UDF 时如何修复此 Kryo 异常?

How do I fix this Kryo exception when using a UDF on hive?

我有一个在 hortonworks 2.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 versionhive --version 与我在我的 jar 中使用的库版本相匹配。

我也试过这个:https://community.hortonworks.com/content/supportkb/150199/orgapachehivecomesotericsoftwarekryokryoexception-1.html也没用。

在我减小 udf.jar 的大小后,我终于可以 运行 我的查询了。它曾经是 150 mb,我将它减少到 50 kb。这似乎是一个 kryo 错误。我从这里得到了这个信息: https://github.com/EsotericSoftware/kryo/issues/307

我通过将所有依赖项标记为 provided 来减小 udf.jar 的大小。所以我从这里开始:

<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 错误,因为我能够 运行 使用 hortonworks 2.6 中的那个大 udf.jar 文件进行此查询。

我希望有人认为此信息有价值。

其实我参考了hive的这个线程https://issues.apache.org/jira/browse/HIVE-7711 Dr.Christian Betz 对此问题的评论建议实施 DoNothingSerializer 来解决此异常。我尝试实施该解决方案并解决了问题。但是,我无法理解添加 Serializer 如何解决此问题的细节。 在此 link 处找到解决方案。 尝试为扩展 GenericUDF 的 class 实现以下序列化程序。

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



}



}