9.10. 分布式流执行
分布式流执行方式类似于映射减少。除了本例中,我们会向不同的节点发送零到多个中间操作(映射、过滤等)和单个终端操作。操作基本上会减少到以下几项:
- 所需的片段由哪个节点分组,这是给定网段的主要所有者
生成请求以发送到包含中间和终端操作的每个远程节点,包括它应该处理的片段
- 如有必要,终端操作将在本地执行
- 每个远程节点都将接收此请求并运行操作,然后发送响应回
- 然后,本地节点将收集本地响应和远程响应,同时执行操作本身所需的任何减少。
- 最终减少了响应,然后返回给用户
在大多数情况下,所有操作都是完全分发的,因为操作是在每个远程节点上完全应用,通常只有最后一个操作或相关操作才可以重新应用,以减少多个节点的结果。务必要注意,中间值实际上不需要被序列化,它是发送的最后一个值,这是所需部分(突出显示各种操作的异常)。
终端 operator 分布的结果 会减少以下段落描述了各种终端操作器的分布式缩减如何工作。其中一些是特殊的,可能需要中间值才能被序列化,而不是最终结果。
- allMatch noneMatch anyMatch
- allMatch 操作在每个节点上运行,然后所有结果在本地逻辑上进行,以获取适当的值。noneMatch 和 anyMatch 操作使用逻辑或替代。这些方法也有早期终止支持,在已知的最终结果后停止远程和本地操作。
- collect
- collect 方法很有趣,它可以执行一些额外的步骤。远程节点以正常方式执行所有内容,但它不会在结果上执行最终的 结束 程序,而是发回完全组合的结果。然后,本地线程 会将 远程和本地结果合并为一个值,然后最后完成。这里要记住的键是最终的值不一定是可序列化的,而是来自供应商和 组合 方法的值。https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collector.html#supplier--
- 数�
- count 方法只从每个节点中添加数字。
- findAny findFirst
- findAny 操作只返回它们找到的第一个值,无论是来自远程节点还是本地。请注意,当发现一个值后,它就不会处理其他值。请注意 findFirst 方法是特殊的,因为它需要排序的中间操作,这在 例外 部分中详细介绍。
- 最大分钟
- max 和 min 方法在每个节点上找到对应的 min 或 max 值,然后在本地执行最终缩减,以确保返回所有节点中的 min 或 max。
- reduce
- 各种减少方法 1、2、3 将按顺序化结果,与累计者可以尽可能多。然后,如果提供,它将在本地整合本地和远程结果。请注意,这意味着来自 combiner 的值不必是 Serializable。