Hive 在配置单元上使用UDF时,如何修复此Kryo异常?
我有一个在hortonworks 2.6沙盒中工作的配置单元查询,但它在沙盒版本中不工作。3.0由于该例外情况:Hive 在配置单元上使用UDF时,如何修复此Kryo异常?,hive,hortonworks-sandbox,apache-tez,Hive,Hortonworks Sandbox,Apache Tez,我有一个在hortonworks 2.6沙盒中工作的配置单元查询,但它在沙盒版本中不工作。3.0由于该例外情况: Caused by: org.apache.hive.com.esotericsoftware.kryo.KryoException: Encountered unregistered class ID: 95
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)
我怎么修理它
我已经看到一些答案建议执行sethive.exec.parallel=false代码>但它不工作,我仍然得到这个错误
我检查了我使用的库的版本,并确保hadoop版本
和hive--version
与我在jar中使用的库的版本匹配
我也尝试过这个方法:它也不起作用。在缩小了udf.jar的大小后,我终于能够运行我的查询了。它以前是150MB,我把它减少到50KB。它看起来像一只克鲁虫。我从这里得到了这些信息:
通过将所有依赖项标记为提供的,我减小了udf.jar的大小。所以我从这里开始:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.1.1</version>
</dependency>
org.apache.hadoop
hadoop hdfs
3.1.1
为此:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.1.1</version>
<scope>provided</scope> <!--Notice this line-->
</dependency>
org.apache.hadoop
hadoop hdfs
3.1.1
假如
这绝对是一个kryo bug,因为我能够使用hortonworks 2.6中的大udf.jar
文件运行这个查询
我希望有人觉得这些信息很有价值。我实际上指的是这个蜂巢的线索
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
}
}
import org.apache.hive.com.esotericsoftware.kryo.kryo;
导入org.apache.hive.com.esotericsoftware.kryo.Serializer;
导入org.apache.hive.com.esotericsoftware.kryo.io.Input;
导入org.apache.hive.com.esotericsoftware.kryo.io.Output;
公共类DoNothingSerializer扩展序列化程序{
@凌驾
公共应用程序读取(Kryo arg0,输入arg1,类arg2){
//TODO自动生成的方法存根
返回新应用程序();
}
@凌驾
公共无效写入(Kryo arg0、输出arg1、应用arg2){
//TODO自动生成的方法存根
}
}