Flink中操作员Parallelism的一些难题

时间:2017-06-08 12:56:11

标签: apache-flink flink-streaming

我刚刚得到了以下关于并行性的示例,并提出了一些相关问题:

  1. setParallelism(5)将Parallelism 5设置为flatMap和sum的和?

  2. 我们是否可以将不同的Parallelism设置为不同的运算符,例如flatMap和sum?例如将Parallelism 5设置为sum,将10设置为flatMap。

  3. 根据我的理解,keyBy是根据不同的密钥将DataStream分区为逻辑Stream \ partitions,并假设有10,000个不同的密钥值,因此有10,000个不同的分区,那么有多少个线程会处理10,000个分区?只需5个帖子?如果我们没有设置setParallelism(5)?

  4. 怎么样?

    https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/parallel.html

    final StreamExecutionEnvironment env =     
      StreamExecutionEnvironment.getExecutionEnvironment();
    
    DataStream<String> text = [...]
    DataStream<Tuple2<String, Integer>> wordCounts = text
      .flatMap(new LineSplitter())
      .keyBy(0)
      .timeWindow(Time.seconds(5))
      .sum(1).setParallelism(5);
    
    wordCounts.print();
    
    env.execute("Word Count Example");
    

2 个答案:

答案 0 :(得分:4)

在运算符上调用setParallelism时,它会更改此特定运算符的并行度。因此,在您的示例中,只有窗口运算符将以5和前一个flatMap运算符的并行度执行,并具有默认的并行性。

因此,您可以为每个运算符设置不同的并行度。但是,请注意,具有不同并行性的运算符无法链接并且需要重新平衡(类似于shuffle)操作。

如果要为所有运算符设置并行度,则必须通过ExecutionEnvironment#setParallelism API调用来执行此操作。

keyBy操作将输入流中的分区划分为与并行运算符实例一样多的分区。这可确保具有相同键的所有元素都在同一分区中结束。因此,在您将并行度设置为5的示例中,最终会得到5个分区。每个分区都可以包含具有不同键的元素。

答案 1 :(得分:0)

执行环境级别 如此处所述,Flink程序是在执行环境的上下文中执行的。执行环境为执行的所有运算符,数据源和数据接收器定义了默认的并行性。通过显式配置运算符的并行性,可以覆盖执行环境并行性。

可以通过调用setParallelism()方法来指定执行环境的默认并行性。要执行并行度为3的所有运算符,数据源和数据接收器,请按如下所示设置执行环境的默认并行度:

Gson gson=new Gson();
List<ViewPair>data = gson.fromJson(array.toString(), listType);
JSONObject object = item.getJSONObject("value");
String spinnerLabel=object.getString("label");
JsonPrimitive spinnerValue=(JsonPrimitive) object.get("value");<-error
Caused by: java.lang.ClassCastException: java.lang.Boolean cannot be cast to com.google.gson.JsonPrimitive