Как узнать, к какой подзадаче принадлежит локальное окно

Можно ли узнать, к какой подзадаче принадлежит локальное окно при потоковой передаче flink? Я хочу использовать метод getRuntimeContext().getIndexOfThisSubtask() в реализациях TriggerPolicy.


person zhangshengxiong    schedule 01.09.2015    source источник


Ответы (1)


На данный момент нет способа получить индекс подзадачи, над которой работает оконный оператор с TriggerPolicy.

Однако вы можете обойти это, поместив операцию map вверх по течению, которая присваивает каждому элементу данных текущий индекс подзадачи.

DataStream<Tuple2<Integer, String>> ds = env.fromElements(
        new Tuple2<Integer, String>(1, "a"),
        new Tuple2<Integer, String>(2, "b"),
        new Tuple2<Integer, String>(1, "c"),
        new Tuple2<Integer, String>(2, "d"));

ds.groupBy(0)
    .map(new RichMapFunction<Tuple2<Integer,String>, Tuple3<Integer, Integer, String>>() {
        @Override
        public Tuple3<Integer, Integer, String> map(Tuple2<Integer, String> integerStringTuple2) throws Exception {
            return new Tuple3<Integer, Integer, String>(
                getRuntimeContext().getIndexOfThisSubtask(),
                integerStringTuple2.f0,
                integerStringTuple2.f1);
        }
    })
    .window(new TestingTriggerPolicy(), new TestingEvictionPolicy())
    .mapWindow(new WindowMapFunction<Tuple3<Integer, Integer, String>, String>() {
        @Override
        public void mapWindow(Iterable<Tuple3<Integer, Integer, String>> iterable, Collector<String> collector) throws Exception {
            StringBuilder builder = new StringBuilder();

            for (Tuple3<Integer, Integer, String> element : iterable) {
                builder.append(element.toString() +"; ");
            }

            collector.collect(builder.toString());
        }
    })
person Till Rohrmann    schedule 01.09.2015
comment
Спасибо, я просто знаю, что локальное окно и его подчиненный оператор (например, mapWindow) обрабатываются последовательно в одном потоке. - person zhangshengxiong; 01.09.2015
comment
@zhangshengxiong, обработка одним или несколькими потоками здесь не проблема. Чего вам следует избегать, так это перетасовки данных, которая разрушит разделение ваших элементов и, следовательно, сопоставление ваших элементов с индексом подзадачи. Но пока вы используете локальные окна, это не должно быть проблемой. - person Till Rohrmann; 01.09.2015