在蜂巢上使用UDF时,如何解决此Kryo异常?

时间:2019-02-07 11:17:20

标签: hive hortonworks-sandbox apache-tez

我有一个在hortonworks 2.6沙箱中运行的配置单元查询,但不适用于沙箱ver。 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也不起作用。

2 个答案:

答案 0 :(得分:0)

减小udf.jar的大小后,终于可以运行查询了。以前是150 mb,我将其减少到50 kb。似乎是一个Kryo错误。我从这里得到此信息: pathlib.Path

我通过将所有依赖项都标记为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错误,因为我能够使用hortonworks 2.6中的大udf.jar文件运行此查询。

我希望有人觉得这些信息有价值。

答案 1 :(得分:-1)

我实际上是指此配置单元https://issues.apache.org/jira/browse/HIVE-7711的线程 克里斯蒂安·贝茨(Christian Betz)在此问题上的评论建议实施DoNothingSerializer来解决此异常。我尝试实施该解决方案,问题已解决。但是,我无法理解添加串行器如何解决此问题的详细信息。 在此link中找到解决方案。 尝试为扩展GenericUDF的类实现以下Serializer。

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



}



}