我刚刚得到了以下关于并行性的示例,并提出了一些相关问题:
setParallelism(5)将Parallelism 5设置为flatMap和sum的和?
我们是否可以将不同的Parallelism设置为不同的运算符,例如flatMap和sum?例如将Parallelism 5设置为sum,将10设置为flatMap。
根据我的理解,keyBy是根据不同的密钥将DataStream分区为逻辑Stream \ partitions,并假设有10,000个不同的密钥值,因此有10,000个不同的分区,那么有多少个线程会处理10,000个分区?只需5个帖子?如果我们没有设置setParallelism(5)?
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");
答案 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