... Может ли Flink обрабатывать считывание нескольких сегментов, а затем перераспределять данные, чтобы все данные одного идентификатора пользователя передавались в одну и ту же задачу агрегатора?
Эффект keyBy(e -> e.userId)
, если вы используете Flink DataStream API, заключается в перераспределении всех событий, так что все события для любого конкретного userId будут переданы в одну и ту же задачу агрегатора нижестоящего потока.
Будет ли каждый хост считывать данные из подмножества сегментов в потоке и будет ли Flink использовать оператор keyBy для передачи сообщений того же ключа хосту, который будет выполнять фактическую агрегацию?
Да, верно.
Если, например, у вас есть 8 физических хостов, каждый из которых предоставляет 8 слотов для выполнения задания, тогда будет 64 экземпляра задачи-агрегатора, каждый из которых будет отвечать за непересекающееся подмножество ключевого пространства.
Предполагая, что доступно более 64 сегментов для чтения, затем каждый из 64 заданий будет считывать источник из одного или нескольких сегментов, а затем распространять события, которые он читает, в соответствии с их идентификаторами пользователя. Если предположить, что идентификаторы пользователя равномерно распределены по осколкам, то каждый исходный экземпляр обнаружит, что некоторые из событий, которые он читает, предназначены для идентификаторов пользователей, которым он назначен для обработки, и следует использовать локальный агрегатор. Каждое из остальных событий необходимо будет отправить одному из 63 других агрегаторов, в зависимости от того, какой работник отвечает за каждый идентификатор пользователя.