我想实现一个 class
有一个通过spark从hbase读取的函数,如下所示:
public abstract class QueryNode implements Serializable{
private static final long serialVersionUID = -2961214832101500548L;
private int id;
private int parent;
protected static Configuration hbaseConf;
protected static Scan scan;
protected static JavaSparkContext sc;
public abstract RDDResult query();
public int getParent() {
return parent;
}
public void setParent(int parent) {
this.parent = parent;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public void setScanToConf() {
try {
ClientProtos.Scan proto = ProtobufUtil.toScan(scan);
String scanToString = Base64.encodeBytes(proto.toByteArray());
hbaseConf.set(TableInputFormat.SCAN, scanToString);
} catch (IOException e) {
e.printStackTrace();
}
}}
这是一个父类,我有一些子类实现了这个方法 query()
从hbase读取,但如果我设置 Configuration
, Scan
以及 JavaSparkContext
不是静态的,我会得到一些错误:这些类没有序列化。
为什么这些类必须是静态的?我有别的办法解决这个问题吗?厚度。
1条答案
按热度按时间e4eetjau1#
你可以试着
transient
以避免序列化异常,如原因:java.io.notserializableexception:org.apache.spark.streaming.api.java.javastreamingcontext
所以你对java说你只是不想序列化这些字段:
你在初始化吗
JavaSparkContext
,Configuration
以及Scan
主要还是静态方法?使用static,您的字段通过所有示例共享。但这取决于你的用例如果static
应该使用。但与
transient
这样比static
因为JavaSparkCOntext
没有意义,因为这是在驱动程序上创建的。--在评论中讨论后编辑:
用于newapihadooprdd的java文档