我有一个在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 version
和hive --version
与我在jar中使用的库的版本匹配。
答案 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
}
}