在配置单元上使用 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 version
和 hive --version
与我在我的 jar 中使用的库版本相匹配。
在我减小 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
}
}
我有一个在 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 version
和 hive --version
与我在我的 jar 中使用的库版本相匹配。
在我减小 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
}
}