【问题标题】:Apache Flink: MapPartition Vs. FlatMapApache Flink:MapPartition 与。平面图
【发布时间】:2017-08-09 07:10:41
【问题描述】:

我对 MapPartition 的理解不是很清楚。请有人解释一下 Mappartition 的一些用例以及它与 FlatMap 有何不同?

【问题讨论】:

    标签: hadoop apache-flink


    【解决方案1】:

    区别在于方法的接口和调用方式。

    • 为每条记录调用FlatMapFunctionflatMap(IN val, Collector<OUT> out) 方法,并且可以为每条输入记录发出01 或更多记录。因此,FlatMapFunction 处理记录一个接一个。它不应该跨函数调用保持状态。
    • MapPartitionFunctionmapPartition(Iterable<IN> vals, Collector<OUT> out) 方法只被调用一次,并在所有分区上接收一个迭代器。它可以为整个分区发出01 或更多记录。因此,MapPartitionFunction 可以(原则上)收集整个分区并计算结果。但是,如果分区很大,这可能很危险,因为您很容易耗尽内存。如果您首先对分区进行排序,则 mapPartition 通常很有用。

    所以,一般来说,mapPartition 更通用,可以做flatMap 所做的一切,甚至更多。但是,与许多强大的工具一样,您需要更加小心,因为您可能会在自己的脚下开枪。 flatMap 接口使用起来更安全(通常也更容易)。

    【讨论】:

    • 感谢 fabian 的解释。所以总的来说 mapPartition 在性能方面应该比 flatMap 快,对吗?正如你所解释的 mapParition 收集整个分区,在这里我有一个疑问,根据我的理解,flink 中的 map 不依赖于拆分,它依赖于并行性。所以如果并行度小于否。的拆分比某些 mapPartition 将分配多个输入拆分。所以它收集的所有拆分都作为单个可迭代意味着多个拆分构成一个输入分区。
    • 拆分和分区在 Flink 中是不一样的。算子的每个并行实例处理一个分区,即一个分区可能由多个拆分组成。 MapPartition收集内存中的所有数据(除非您的用户函数这样做)。分区通过 Iterable 流式传输。它可能比 flatMap 更高效一点,但正如我所说,你必须小心。如果您没有明确地对数据进行分区,则结果可能是不确定的。
    • 太好了。请详细说明如何将拆分分配给分区,如果我没有明确分区我的数据并且没有 .of 分区与运算符的并行性相同。
    • Flink 的源操作符与 Hadoop 的工作方式不同。 Flink 启动固定数量的源任务(与算子的并行度一样多),并根据位置偏好(如果可用)将输入拆分延迟分配给这些源任务。因此,源任务处理多个输入拆分,并且拆分到源任务或分区没有确定性映射(因为任务处理一个分区,在这种情况下任务 = 分区)。
    • 非常感谢 fabian 解决了许多疑问。你能推荐一些好的资源来更深入地理解这些 flink 内部结构吗?
    【解决方案2】:

    在 Apache Flink 中,您可以对 DataSetDataStream 执行操作

    flatMap 是对两者之一的每条记录的函数调用

    .flatMap(new Tokenizer())  // calling on each record   
    .flatMap(String value, Collector<Tuple2<String, Integer>> out) //definition
    

    而,

    mapPartition 是每个分区上的一个映射和 for 循环,直到处理完一个 Key 的分区中的所有记录

    DataStream 在 API 中没有可用的 mapPartition

    更多信息请阅读this post

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 2017-02-03
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多