10.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
- max 和 min 方法在每个节点上找到对应的 min 或 max 值,然后在本地执行最终减少,以确保只返回所有节点的 min 或 max。
- 减少
- 各种减少方法 1、2,3 将最终对结果进行序列化,只要累积器可以做大量操作。然后,如果您提供了这一点,它会在本地组合本地和远程结果。请注意,来自组合器的值不必是 Serializable。