如何创建模拟元素的 Spark RDD?
How to create a Spark RDD of mocked elements?
我想在单元测试中创建一个包含模拟元素(使用 Mockito)的 RDD(实际的,不是模拟的)。
我的尝试是:
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: Task not serializable
有什么方法可以实现我的目标吗?谢谢!
默认情况下,Mockito 模拟不可序列化,这就是您收到错误的原因。
要创建可序列化的模拟,您必须明确定义它:
mock = Mockito.mock(
classOf[ImmutableBytesWritable],
Mockito.withSettings().serializable()
)
你的 Result
mock 也应该应用同样的东西。
如果遇到 java.lang.ClassNotFoundException: org.apache.hadoop.hbase.io.ImmutableBytesWritable$MockitoMock$...
异常,您可能需要使用 :
import org.mockito.mock.SerializableMode
mock = Mockito.mock(
classOf[ImmutableBytesWritable],
Mockito.withSettings().serializable(SerializableMode.ACROSS_CLASSLOADERS)
)
最后,你应该有这样的东西:
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.client.Result
import org.mockito.Mockito
import org.mockito.mock.SerializableMode
object Test extends App {
val conf = new SparkConf()
.setMaster("local[2]")
.setAppName("test")
lazy val sc = new SparkContext(conf)
val mockImmutableBytesWritable = Mockito.mock(
classOf[ImmutableBytesWritable],
Mockito.withSettings().serializable(
SerializableMode.ACROSS_CLASSLOADERS
)
)
val mockResult = Mockito.mock(
classOf[Result],
Mockito.withSettings().serializable(
SerializableMode.ACROSS_CLASSLOADERS
)
)
val myRDD = sc.parallelize(Seq((mockImmutableBytesWritable, mockResult)))
println(myRDD.count)
sc.stop()
}
我想在单元测试中创建一个包含模拟元素(使用 Mockito)的 RDD(实际的,不是模拟的)。
我的尝试是:
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: Task not serializable
有什么方法可以实现我的目标吗?谢谢!
默认情况下,Mockito 模拟不可序列化,这就是您收到错误的原因。
要创建可序列化的模拟,您必须明确定义它:
mock = Mockito.mock(
classOf[ImmutableBytesWritable],
Mockito.withSettings().serializable()
)
你的 Result
mock 也应该应用同样的东西。
如果遇到 java.lang.ClassNotFoundException: org.apache.hadoop.hbase.io.ImmutableBytesWritable$MockitoMock$...
异常,您可能需要使用 :
import org.mockito.mock.SerializableMode
mock = Mockito.mock(
classOf[ImmutableBytesWritable],
Mockito.withSettings().serializable(SerializableMode.ACROSS_CLASSLOADERS)
)
最后,你应该有这样的东西:
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.client.Result
import org.mockito.Mockito
import org.mockito.mock.SerializableMode
object Test extends App {
val conf = new SparkConf()
.setMaster("local[2]")
.setAppName("test")
lazy val sc = new SparkContext(conf)
val mockImmutableBytesWritable = Mockito.mock(
classOf[ImmutableBytesWritable],
Mockito.withSettings().serializable(
SerializableMode.ACROSS_CLASSLOADERS
)
)
val mockResult = Mockito.mock(
classOf[Result],
Mockito.withSettings().serializable(
SerializableMode.ACROSS_CLASSLOADERS
)
)
val myRDD = sc.parallelize(Seq((mockImmutableBytesWritable, mockResult)))
println(myRDD.count)
sc.stop()
}