Scala 确定在Apache Flink中哪个对象不可序列化
我正在编写一个Flink transformer,我有一个自定义对象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
直方图
,具有以下属性:
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
)中也在使用它,因此我仍然得到了错误。