我有一个元组流(通道:Int,索引:Long,值:Double),我在通道上使用keyBy将其形成为keyedStream。然后,我需要并行处理每个通道。必须按索引按严格的顺序处理每个并行流,以计算比率value(index)/ value(index-1)。如果我将并行度设置为1,一切正常,则按索引1,2,3,,4…的顺序处理每个通道。
我的问题是,当我将并行度设置为大于1的值时,每个通道的keyedStream似乎被拆分为多个进程。因此通道可能被错误地处理,例如value(2),value(5),Value(6),value(9).....
通道数N未知。因此,如何装配具有未知并行性的N个处理流,以便每个流通过严格增加索引v(1),v(2),.... v(t),v(t + 1),...来处理每个通道。 ..v(t + n)
在这里澄清引起问题的代码,没有什么聪明的。代码在“ logRatioWindowFunction:Failure非单调索引失败”行失败。 Long索引值是在序列1,2,3,4,5,6,7 ...中早些设置的...
val scaledReadings : DataStream[(Int,Long, Double, Double)] = maxChannelReading
.keyBy(0)
.map { in =>
LOG.info(s"scaledReadings $in")
(in._1, in._2, in._3/in._4 + 2.0D, in._3) }
val logRatioWindow: DataStream[(Int,Long, Int, Double)] = scaledReadings
.keyBy(0)
.countWindow(100, 99)
.process(new logRatioWindowFunction() )
和
class logRatioWindowFunction extends ProcessWindowFunction[(Int, Long, Double, Double), (Int, Long, Int, Double), org.apache.flink.api.java.tuple.Tuple, GlobalWindow] {
def process(key: Tuple, context: logRatioWindowFunction.this.Context,
input: Iterable[(Int, Long, Double, Double)],
out: Collector[(Int, Long, Int, Double)]) =
{
val a: Array[(Int, Long, Double, Double)] = input toArray;
val ch = a(0)._1
val s = a(0)._2
val l = input.size
if (l < 100)
Job.LOG.info(s"Log ratio window length $l on channel $ch at sample $s")
for (i <- 1 to a.size - 1)
assert (
a(i)._2 == a(i-1)._2+1,
"logRatioWindowFunction:Failure non-monotonic indexes "+
a(i-1)._2 + " and " + a(i)._2 )
if (l == 100) {
for (i <- 0 to l-2) {
val v: Int = rint(100 * log (E + a(i+1)._3 / a(i)._3)) toInt;
out.collect(scala.Tuple4(a(i+1)._1, a(i+1)._2, v, a(i+1)._4))
}
Job.LOG.debug("logRatioWindowFunction [" + a.head._1 + ", " + a.head._2 +
" ... " + a.last._2 +"] collected")
}
}
}
预先感谢