首页 > 解决方案 > 跨 Flink 数据流的多个步骤的节点内的任务本地处理

问题描述

节点内的任务本地处理:

Flink 数据流管道中是否有办法确保数据流的第一步和第二步发生在同一个本地任务槽/本地机器上?

用例:有实时视频处理需求,其中第一步的图像需要在第二步的同一台机器上本地使用?这减轻了必须从第二个节点中的另一个节点获取巨大图像的情况(Hadoop 时代的基本位置要求)。TaskManager 可以将本地状态存储在内存中或本地磁盘上。如何让 JobManager 将第二步路由到同一个任务管理器?是否基于 .keyBy(sameKeyId) 将其推送到同一个分区?我可以通过 .keyBy(..) 执行类似的操作以限制为 1 个分区/分片并在第 1 步中存储图像的同一个任务管理器上的同一个分区中的第 2 步操作吗?在复数课程上看到了这个例子:

.partitionCustom(new Partitioner<Double>() {
                @Override
                public int partition(Double key, int numPartitions) {
                    return key.intValue() % numPartitions;
                }
            }, 1)
            .setParallelism(1)//can i have more than 1 here ?
            .mapPartition(new MapPartitionFunction<Tuple2<Long, Double>, Tuple2<Long, Double>>() {
                @Override
                public void mapPartition(Iterable<Tuple2<Long, Double>> values, Collector<Tuple2<Long, Double>> out) throws Exception {
                    Iterator<Tuple2<Long, Double>> iter = values.iterator();
                    for (int i = 0; i < 10 && iter.hasNext(); i++) {
                        out.collect(iter.next());
                    }
                }
            })
            .setParallelism(1)

TIA

标签: apache-flinkflink-streaming

解决方案


推荐阅读