Scala 确定在Apache Flink中哪个对象不可序列化

Scala 确定在Apache Flink中哪个对象不可序列化,scala,serialization,apache-flink,serializable,Scala,Serialization,Apache Flink,Serializable,我正在编写一个Flink transformer,我有一个自定义对象直方图,具有以下属性: case class Histogram( nRows: Int, nCols: Int, min: Int, step: Double, private val countMatrix: Array[ArrayBuffer[Double]], private val cutMatrixL1: Array[ArrayBuffer[Double]], val distribMat

我正在编写一个Flink transformer,我有一个自定义对象
直方图
,具有以下属性:

case class Histogram(
  nRows: Int,
  nCols: Int,
  min: Int,
  step: Double,
  private val countMatrix: Array[ArrayBuffer[Double]],
  private val cutMatrixL1: Array[ArrayBuffer[Double]],
  val distribMatrixL1: Array[ArrayBuffer[Map[Int, Double]]],
  private val distribMatrixL2: Array[ArrayBuffer[Map[Int, Double]]],
  private val cutMatrixL2: ArrayBuffer[ArrayBuffer[Double]])
  extends Serializable {
    ???
}
这是我的
fit操作

implicit val fitOp = new FitOperation[PIDiscretizerTransformer, LabeledVector] {
    override def fit(
                      instance: PIDiscretizerTransformer,
                      fitParameters: ParameterMap,
                      input: DataSet[LabeledVector]): Unit = {

      // get params...

      val metric = input.map { x ⇒
        // (instance, histrogram totalCount)
        (x, Histogram(nAttrs, l1InitialBins, min, instance.step), 1)
      }.reduce { (m1, m2) ⇒
        // Update Layer 1
        val updatedL1 = updateL1(m1._1, m1._2, instance.step, initialElems, alpha, m1._3)

        //         Update Layer 2 if neccesary
        val updatedL2 = if (m1._3 % l2updateExamples == 0) {
          updateL2(m1._1, updatedL1)
        } else updatedL1

        (m2._1, updatedL2, m1._3 + 1)
      }.map(_._2)

      //      instance.metricsOption = Some(metric)
    }
  }
这很好,但是如果我取消注释最后一行:
instance.metricoption=Some(metric)
我会得到一个
java.io.NotSerializableException:org.apache.flink.api.scala.DataSet

我怎样才能找到我的类中的哪个对象
直方图
导致了问题?据我所知,
ArrayBuffer
是可序列化的,Map也是。虽然我发现这个问题很严重:


这说明
.mapValues
是不可序列化的,但我没有在任何地方使用
.mapValues

问题是您在
映射函数中引用了
实例。步骤
<代码>实例
的类型为
PIDiscretizerTransformer
,无法序列化。因此,您需要计算
MapFunction
之外的步骤,并将值传递到函数中。然后您的程序应该是可序列化的。

问题是您引用的是
实例。步骤
映射函数中<代码>实例
的类型为
PIDiscretizerTransformer
,无法序列化。因此,您需要计算
MapFunction
之外的步骤,并将值传递到函数中。那么你的程序应该是可序列化的。

你能给我看一下完整的代码吗?您可能会在一个上下文中创建
fitOp
,在该上下文中,fitOp在其闭包中捕获
数据集
实例。当然,这里是:直方图:转换器:您能给我看一下完整的代码吗?您可能会在上下文中创建
fitOp
,在上下文中,fitOp在其闭包中捕获
数据集
实例。当然,这里是:直方图:转换器:谢谢!,就这样。在提问之前,删除了对映射中的
实例的调用。步骤
,但忘记了我在下一次调用(
reduce
)中也在使用它,因此我仍然得到了错误。谢谢!,就这样。在提问之前,删除了对映射中的
instance.step
的调用,但忘记了我在下一个调用(
reduce
)中也在使用它,因此我仍然得到了错误。