并行和键控流

时间:2018-07-16 21:28:47

标签: apache-flink

我有一个元组流(通道: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")
   }
  }
}

预先感谢

0 个答案:

没有答案