Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何创建模拟元素的Spark RDD?_Scala_Apache Spark_Mockito_Hbase_Rdd - Fatal编程技术网

Scala 如何创建模拟元素的Spark RDD?

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来自

我想创建一个RDD(一个实际的RDD,不是模拟的RDD),它包含单元测试中的模拟元素(使用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:任务不可序列化


有什么方法可以实现我的目标吗?谢谢大家!

默认情况下,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是的,我复制了你