Я создал прототип приложения с Spark Streaming в Java, которое использует HyperLogLog для оценки отдельных пользователей из имитируемого потока кликов.Spark Streaming parallelism с одним единственным ключом
Позвольте мне кратко набросать мое решение. Сначала я создаю поток с KafkaUtils: JavaPairReceiverInputDStream<String, String> directKafkaStream = KafkaUtils.createStream(streamingContext, ZOOKEEPER_ADDRESS, ZOOKEEPER_GROUP, topics);
Оттуда я создаю поток, который содержит только искомое поле, fullvisitorid: JavaDStream<String> fullvisitorids = directKafkaStream.map(line -> line._2().split(",")[0]);
Для поддержания глобального состояния (мой HyperLogLog-Object) единственный способ Я нашел методы udpateStateByKey или mapWithState. Кажется, что у обоих есть пара ключевых значений ... но в моем случае использования мне не нужен ключ.
Поэтому я решил использовать «фиктивный ключ»: fullvisitorids.mapToPair(value -> new Tuple2<String, String>("key", value));
Но теперь мои вопросы:
а) Как Спарк распараллеливания преобразований с updateStateByKey или mapWithState в этом потоке, который есть только один единственный ключ? Или как он разбивает RDD на кластер?
b) Есть ли лучшее решение для моей проблемы, чем добавление фиктивного ключа, который вообще не имеет никакой функции?
Спасибо. To b) Как именно такое распределение распределяется по кластеру? – JayKay