如何创建模拟元素的spark rdd?

rlcwz9us  于 2021-06-09  发布在  Hbase
关注(0)|答案(1)|浏览(466)

我想在单元测试中创建一个rdd(实际的rdd,不是mocked),它包含mockito元素。
我的尝试是:

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 有什么办法可以达到我的目标吗?谢谢您!

xghobddn

xghobddn1#

默认情况下,mockito mock是不可序列化的,这就是为什么会出现错误。
要创建可序列化的模拟,必须显式定义它:

mock = Mockito.mock(
    classOf[ImmutableBytesWritable],
    Mockito.withSettings().serializable()
)

同样的事情也应该适用于你的 Result 嘲弄。
万一你有 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()

}

相关问题