【问题标题】:testing spark jobs with mocks用模拟测试火花作业
【发布时间】:2016-05-03 12:40:56
【问题描述】:

我有这样的火花工作:

stream.
..do some stuff..
map(HbaseEventProcesser.process)

现在 HbaseEventProcesser 是一个 scala 对象(单例)。所以,序列化没有问题。

问题在于测试该火花作业(使用了holdenkarau spark-test lib)。我想用其他一些实现来模拟 HbaseEventProcessor。我尝试了两种方法

  • 将实现传递给 spark 作业(作为构造函数参数,而不是调用 map 内的方法)。这会导致序列化问题
  • 使用 powerMock。不幸的是,如果使用 SharedSparkContext,deepcopy 操作会失败。

还有其他解决方法吗?

【问题讨论】:

    标签: scala unit-testing apache-spark mockito


    【解决方案1】:

    您至少有以下选择:

    1) 制作 HbaseEventProcesser 常规类,扩展一些纯特性 EventProcessor,然后使用您选择的框架对其进行模拟

    2) 像这样重构你的代码

    def mapStream[T, R](stream: DStream[T], process: T => R) = {
     stream.
     ..do some stuff..
     map(process)
    }
    
    //in main code:
    mapStream(stream, HbaseEventProcesser.process)
    
    //in test code:
    mapStream(stream, customFunc)
    

    【讨论】:

    • 这是我做的第一个。但是,它会导致序列化问题。我的意思是:让 HBaseEventProcessor 类扩展 EventProcessor 和 SparkJob(eventProcessor: EventProcessor) {.... rdd.map(eventProcessor)}
    • 您是否尝试使其可序列化:class HBaseEventProcessor extends java.io.Serializable with EventProcessor
    • 当然,结果我得到: 引起:java.io.NotSerializableException .....- 对象(com 类......ClientDerivedEventsStreamingJob$$anonfun$preStream$2$$anonfun$9 , )
    • 确保您的实例不捕获外部范围,将其声明为本地值(在堆栈上),而不是作为类属性或 lambda。
    猜你喜欢
    • 2017-06-01
    • 2019-06-01
    • 2017-02-21
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多