使用Java API从HBase读取Apache Spark(任务不可序列化)

使用Java API从HBase读取Apache Spark(任务不可序列化),hbase,apache-spark,Hbase,Apache Spark,此链接介绍了一种通过JavaAPI编写HBase的极好方法 如何从HBase读取数据 例如,我有一个属性名->文件,它提供了开始行和停止行(每行提供一个单独的开始行和停止行,可以在不同的服务器之间划分) 其他属性告诉我服务器名和表名。 可以任何请提供样品我,如何可以做到,我尝试了,但我不断得到不可序列化的错误 (这就是我试过的,) 任何帮助都将不胜感激。首先,您没有给出任何细节。没有人能帮助确定什么不是以这种方式序列化的 默认情况下,您在Spark中执行的函数所使用或引用的任何对象都必须是可序

此链接介绍了一种通过JavaAPI编写HBase的极好方法

如何从HBase读取数据

例如,我有一个属性名->文件,它提供了开始行和停止行(每行提供一个单独的开始行和停止行,可以在不同的服务器之间划分) 其他属性告诉我服务器名和表名。 可以任何请提供样品我,如何可以做到,我尝试了,但我不断得到不可序列化的错误

(这就是我试过的,)

任何帮助都将不胜感激。

首先,您没有给出任何细节。没有人能帮助确定什么不是以这种方式序列化的

默认情况下,您在Spark中执行的函数所使用或引用的任何对象都必须是可序列化的。这取决于您以这种方式设计对象,或者不引用它们。当内部类发挥作用时,对引用的内容进行推理会变得复杂,而
函数
s通常是内部类


尽管如此,您的某些内容不可
序列化
,总有一个直截了当的原因。我建议尽量避免使用非静态内部类。检查是否在
函数中无意义地保留对对象的引用。将它们转换为不包含这些引用,不需要它们,或者只使用可序列化的值的一部分。接下来,如果某些对象不是可序列化的,并且允许默认序列化管理序列化是否合理,则可能必须将它们标记为可序列化的。我不同意
@transient
是一种修复方法;它只是使一些字段根本不被发送,这只适用于某些情况。当您发现值在远程计算机上“消失”(未序列化)时,可能会导致意外的
NullPointerException
s。

这是一个常见问题,我自己也不完全理解。但是经过一些挖掘之后,将
@transient
(根据我的评论)添加到所有不可序列化的类型应该可以工作。为了更好地帮助我,请您发布最小代码,特别是对于未正确序列化的类。谢谢@SeanOwen。我同意
@transient
ing一切只在某些情况下适用。您是否同意,当一个类包含不可序列化的字段,并且希望在传递给
RDD
高阶函数的lambda中使用该类中的方法时,自然的用例是这样的?如果没有,我们还能用什么方法呢?我想如果可能的话,我会尝试重构。如果
函数
调用一个方法,而该方法“真的”不需要状态,那么它应该是某个地方的
静态
方法。有时,
Function
s是在某个庞大的中心类中定义的,该类有20个不同管理器和连接的字段。它只需要进一步分解和分离,以仅依赖于一些较小的对象,这些对象只有基本(和可序列化)状态。嗯,我想如果一个方法不需要类中的状态,它应该位于该类的伴生对象中。美好的