Apache Flink DataStream API没有mapPartition转换

时间:2015-10-28 20:47:34

标签: apache-flink

Spark DStream有mapPartition API,而Flink DataStream API没有。是否有人可以帮助解释原因。我想要做的是在Flink上实现类似于Spark reduceByKey的API。

2 个答案:

答案 0 :(得分:6)

Flink的流处理模型与以迷你批次为中心的Spark Streaming截然不同。在Spark Streaming中,每个迷你批处理都像有限数据集上的常规批处理程序一样执行,而Flink DataStream程序则连续处理记录。

在Flink的DataSet API中,MapPartitionFunction有两个参数。输入的迭代器和函数结果的收集器。 Flink DataStream程序中的MapPartitionFunction永远不会从第一个函数调用返回,因为迭代器将迭代无休止的记录流。但是,Flink的内部流处理模型要求用户函数返回以便检查点功能状态。因此,DataStream API不提供mapPartition转换。

为了实现类似于Spark Streaming的reduceByKey的功能,您需要在流上定义一个键控窗口。 Windows离散化的流有点类似于迷你批次,但窗口提供了更多的灵活性。由于窗口的大小有限,您可以调用reduce窗口。

这可能看起来像:

yourStream.keyBy("myKey") // organize stream by key "myKey"
          .timeWindow(Time.seconds(5)) // build 5 sec tumbling windows
          .reduce(new YourReduceFunction); // apply a reduce function on each window

DataStream documentation显示了如何定义各种窗口类型并解释所有可用的功能。

注意: DataStream API最近已经过重新设计。该示例假定最新版本(0.10-SNAPSHOT)将在接下来的几天内以0.10.0发布。

答案 1 :(得分:0)

假设您的输入流是单个分区数据(比如String)

val new_number_of_partitions = 4

//below line partitions your data, you can broadcast data to all partitions
val step1stream = yourStream.rescale.setParallelism(new_number_of_partitions)

//flexibility for mapping
val step2stream = step1stream.map(new RichMapFunction[String, (String, Int)]{
  // var local_val_to_different_part : Type = null
  var myTaskId : Int = null

  //below function is executed once for each mapper function (one mapper per partition)
  override def open(config: Configuration): Unit = {
    myTaskId = getRuntimeContext.getIndexOfThisSubtask
    //do whatever initialization you want to do. read from data sources..
  }

  def map(value: String): (String, Int) = {
    (value, myTasKId)
  }
})

val step3stream = step2stream.keyBy(0).countWindow(new_number_of_partitions).sum(1).print
//Instead of sum(1), you can use .reduce((x,y)=>(x._1,x._2+y._2))
//.countWindow will first wait for a certain number of records for perticular key
// and then apply the function

Flink流媒体是纯流媒体(不是批量流媒体)。看看Iterate API。