Scala 如何创建模拟元素的Spark RDD?
我想创建一个RDD(一个实际的RDD,不是模拟的RDD),它包含单元测试中的模拟元素(使用Mockito) 我的尝试是:Scala 如何创建模拟元素的Spark RDD?,scala,apache-spark,mockito,hbase,rdd,Scala,Apache Spark,Mockito,Hbase,Rdd,我想创建一个RDD(一个实际的RDD,不是模拟的RDD),它包含单元测试中的模拟元素(使用Mockito) 我的尝试是: lazy val sc = SparkContext.getOrCreate() val myRDD = sc.parallelize(Seq( (Mockito.mock(classOf[ImmutableBytesWritable]), Mockito.mock(classOf[Result])) )) 其中ImmutableBytesWritable和Result来自
lazy val sc = SparkContext.getOrCreate()
val myRDD = sc.parallelize(Seq( (Mockito.mock(classOf[ImmutableBytesWritable]), Mockito.mock(classOf[Result])) ))
其中ImmutableBytesWritable
和Result
来自HBase API。
我得到了org.apache.spark.SparkException:任务不可序列化
有什么方法可以实现我的目标吗?谢谢大家! 默认情况下,Mockito mock是不可序列化的,这就是为什么会出现错误 要创建可序列化模拟,必须明确定义它:
mock=Mockito.mock(
[ImmutableBytesWritable]的类,
Mockito.withSettings().serializable()
)
同样的事情也应该应用于结果
模拟
如果您遇到java.lang.ClassNotFoundException:org.apache.hadoop.hbase.io.ImmutableBytesWritable$MockitoMock$…
异常,您可能需要使用:
import org.mockito.mock.SerializableMode
mock=Mockito.mock(
[ImmutableBytesWritable]的类,
Mockito.withSettings().serializable(SerializableMode.Cross_类加载器)
)
最后,您应该有如下内容:
import org.apache.spark.SparkContext
导入org.apache.spark.SparkConf
导入org.apache.hadoop.hbase.io.ImmutableBytesWritable
导入org.apache.hadoop.hbase.client.Result
导入org.mockito.mockito
导入org.mockito.mock.SerializableMode
对象测试扩展应用程序{
val conf=new SparkConf()
.setMaster(“本地[2]”)
.setAppName(“测试”)
lazy val sc=新的SparkContext(conf)
val mockImmutableBytesWritable=Mockito.mock(
[ImmutableBytesWritable]的类,
Mockito.withSettings().serializable(
SerializableMode.Cross_类加载器
)
)
val mockResult=Mockito.mock(
类别[结果],
Mockito.withSettings().serializable(
SerializableMode.Cross_类加载器
)
)
val myRDD=sc.parallelize(Seq((mockImmutableBytesWritable,mockResult)))
println(myRDD.count)
sc.停止()
}
默认情况下,Mockito mock是不可序列化的,这就是为什么会出现错误
要创建可序列化模拟,必须明确定义它:
mock=Mockito.mock(
[ImmutableBytesWritable]的类,
Mockito.withSettings().serializable()
)
同样的事情也应该应用于结果
模拟
如果您遇到java.lang.ClassNotFoundException:org.apache.hadoop.hbase.io.ImmutableBytesWritable$MockitoMock$…
异常,您可能需要使用:
import org.mockito.mock.SerializableMode
mock=Mockito.mock(
[ImmutableBytesWritable]的类,
Mockito.withSettings().serializable(SerializableMode.Cross_类加载器)
)
最后,您应该有如下内容:
import org.apache.spark.SparkContext
导入org.apache.spark.SparkConf
导入org.apache.hadoop.hbase.io.ImmutableBytesWritable
导入org.apache.hadoop.hbase.client.Result
导入org.mockito.mockito
导入org.mockito.mock.SerializableMode
对象测试扩展应用程序{
val conf=new SparkConf()
.setMaster(“本地[2]”)
.setAppName(“测试”)
lazy val sc=新的SparkContext(conf)
val mockImmutableBytesWritable=Mockito.mock(
[ImmutableBytesWritable]的类,
Mockito.withSettings().serializable(
SerializableMode.Cross_类加载器
)
)
val mockResult=Mockito.mock(
类别[结果],
Mockito.withSettings().serializable(
SerializableMode.Cross_类加载器
)
)
val myRDD=sc.parallelize(Seq((mockImmutableBytesWritable,mockResult)))
println(myRDD.count)
sc.停止()
}
谢谢,但我还是犯了同样的错误。你能看看这是否正确吗val-mockImmutableBytesWritable=Mockito.mock(classOf[ImmutableBytesWritable],Mockito.withSettings().serializable())
val-mockResult=Mockito.mock(classOf[Result],Mockito.withSettings().serializable())Mockito.withSettings().serializable()和执行简单的myRDD.count
时,出现了一个不同的错误(java.lang.ClassNotFoundException:org.apache.hadoop.hbase.io.ImmutableBytesWritable$MockitoMock$…
)。我发现正在修复它,因此您可能需要在Mockito设置中添加SerializableMode.Cross_CLASSLOADERS
(请参阅我编辑的答案)。非常感谢!它在你的机器上工作了吗?你的Mockito依赖项的版本号是多少?@Nightingale是的,我用一个简单的例子在本地复制了你的问题。我使用的是mockito核心:2.21.0
,hbase客户端:1.4.6
,hbase通用:1.4.6
和spark核心:2.3.0
。我已经用我使用的示例代码更新了我的答案。谢谢,但我仍然得到了相同的错误。你能看看这是否正确吗val-mockImmutableBytesWritable=Mockito.mock(classOf[ImmutableBytesWritable],Mockito.withSettings().serializable())
val-mockResult=Mockito.mock(classOf[Result],Mockito.withSettings().serializable())
Mockito.withSettings().serializable()和执行简单的myRDD.count
时,出现了一个不同的错误(java.lang.ClassNotFoundException:org.apache.hadoop.hbase.io.ImmutableBytesWritable$MockitoMock$…
)。我发现正在修复它,因此您可能需要在Mockito设置中添加SerializableMode.Cross_CLASSLOADERS
(请参阅我编辑的答案)。非常感谢!它在你的机器上工作了吗?你的Mockito依赖项的版本号是多少?@Nightingale是的,我复制了你