流处理系统的并行性有多好?
How good is the parallelism of Stream Processing Systems?
假设我们要计算给定时间段内多个温度传感器的平均值,并且该计算将使用 SPE 以并行方式完成。通常,此计算至少由四个 UDF 完成:
map -> keyBy -> window -> aggregate
如果我的 keyBy
操作员负责获取每个传感器的 ID 而我只有 2 个传感器,那么 2 个的并行度对我的应用程序来说就足够了(免责声明:我不想考虑有多大是 window 或暂时适合内存的元组)。
如果我有 1000 个传感器,那么增加并行性会非常好。假设有 100 个节点。
但是如果我的并行度设置为 100 并且我只处理 2 个传感器的元组怎么办?我会有 98 个节点空闲吗? Spark、Flink 或 Storm 知道他们不必将数据洗牌到 98 个节点吗?
我的问题的动机是另一个问题。
- 我可以实现什么样的应用程序和场景,表明当前的流处理引擎(Storm、Flink、Spark)不知道如何在内部优化并行性,以便通过网络洗牌更少的数据?
- 他们能否预测数据量或种类的任何特征?还是引擎盖下的资源?
谢谢
整点keyBy()
就是把相同key的items分发给同一个operator。如果您有 2 个键,则您的项目实际上被分成 2 组,并且该流的最大并行度为 2。具有键 A
的项目将被发送给一个操作员,而具有键 B
的项目将被发送给另一个运营商。
在 Flink 中,如果你只想将项目的处理分配给所有并行运算符,那么你可以使用 DataStream::shuffle()。
假设我们要计算给定时间段内多个温度传感器的平均值,并且该计算将使用 SPE 以并行方式完成。通常,此计算至少由四个 UDF 完成:
map -> keyBy -> window -> aggregate
如果我的 keyBy
操作员负责获取每个传感器的 ID 而我只有 2 个传感器,那么 2 个的并行度对我的应用程序来说就足够了(免责声明:我不想考虑有多大是 window 或暂时适合内存的元组)。
如果我有 1000 个传感器,那么增加并行性会非常好。假设有 100 个节点。
但是如果我的并行度设置为 100 并且我只处理 2 个传感器的元组怎么办?我会有 98 个节点空闲吗? Spark、Flink 或 Storm 知道他们不必将数据洗牌到 98 个节点吗?
我的问题的动机是另一个问题。
- 我可以实现什么样的应用程序和场景,表明当前的流处理引擎(Storm、Flink、Spark)不知道如何在内部优化并行性,以便通过网络洗牌更少的数据?
- 他们能否预测数据量或种类的任何特征?还是引擎盖下的资源?
谢谢
整点keyBy()
就是把相同key的items分发给同一个operator。如果您有 2 个键,则您的项目实际上被分成 2 组,并且该流的最大并行度为 2。具有键 A
的项目将被发送给一个操作员,而具有键 B
的项目将被发送给另一个运营商。
在 Flink 中,如果你只想将项目的处理分配给所有并行运算符,那么你可以使用 DataStream::shuffle()。