Как Storm обработва групирането на полета, когато добавите повече възли?

Просто четох повече подробности за storm и се натъкнах на способността му да прави групиране на полета, така че например, ако броите туитове на потребител и имате две задачи с групиране на полета на потребителски идентификатор, същите потребителски идентификатори ще бъдат изпратени до едни и същи задачи .

Така че задача 1 може да има следния брой в паметта bob: 10 alice: 5

задача 2 може да има следния брой в паметта jill:10 joe: 4

Ако добавя нова машина към клъстера, за да увелича капацитета и изпълня повторно балансиране, какво се случва с броя ми в паметта? Ще започнете ли да получавате потребители с различен брой?


person James    schedule 07.12.2013    source източник


Отговори (4)


Използвайки групиране на полета, можем да насочваме конкретно поле към определени задачи.

Групиране на полета: Потокът е разделен от полетата, посочени в групирането. Например, ако потокът е групиран по полето „user-id“, кортежи с един и същ „user-id“ винаги ще отиват към една и съща задача, но кортежи с различни „user-id“ може да отиват към различни задачи .

тези задачи винаги са статични в жизнения цикъл на storm, това, което можете да промените с помощта на rebalance, е броят на изпълнителите (нишките). в случай на добавяне на нов възел към клъстер ви позволява да преконфигурирате броя на изпълнителите, които да се изпълняват, без да изключвате топологията, но без значение какъв е броят на задачите остава същият. просто добавянето на нов възел ви дава предимството да увеличите производителността чрез настройка на паралелизма на storm.

person user2720864    schedule 07.12.2013
comment
Разбрах, така че след като bob отиде на една задача, той винаги ще отиде на същата, докато топологията не бъде спряна. Когато добавя нови възли, тази задача просто получава повече нишки за изпълнение на едновременни операции, така че всичките ви структури от данни трябва да са безопасни за нишки във вашите болтове? - person James; 09.12.2013
comment
вярно, прочетете повече за това тук - person user2720864; 09.12.2013

За да изпрати съобщението до една и съща задача всеки път, когато storm ще модифицира хеш-кода на стойността с броя на задачите (hashcode(values)% #tasks). Ако трябваше да увеличите задачите си, броят ви няма да е точен, тъй като може да не отива към същата задача/работник след повторно балансиране.

https://groups.google.com/forum/#!msg/storm-user/lCKnl8AmSVE/rVCH3uuUAcMJ
person Naresh    schedule 08.12.2013
comment
задачите не могат да се променят по време на изпълнение - person user2720864; 12.12.2013

За да го разберете напълно, трябва да видите кода:

Групирането на полета зависи от низа на полето, а не от това кой чучур го е излъчил. Така че ребалансът няма да го засегне. Това е функцията: https://github.com/apache/storm/blob/3b1ab3d8a7da7ed35adc448d24f1f1ccb6c5ff27/storm-core/src/jvm/org/apache/storm/daemon/GrouperFactory.java#L157-L161

@Override
public List<Integer> chooseTasks(int taskId, List<Object> values) {
    int targetTaskIndex = Math.abs(TupleUtils.listHashCode(outFields.select(groupFields, values))) % numTasks;
    return Collections.singletonList(targetTasks.get(targetTaskIndex));
}

TupleUtils.listHashCode води до

public static <T> int listHashCode(List<T> alist) {
  if (alist == null) {
      return 1;
  } else {
      return Arrays.deepHashCode(alist.toArray());
  }
}
person Nav    schedule 01.09.2016

Въз основа на полетата на един или повече кортежи, групирането на полета ви позволява да контролирате кортежи, изпратени до болтове. Той гарантира, че даден набор от стойности за комбинация от полета винаги се изпраща до един и същ болт.

person VIJ    schedule 02.09.2017