Уточнение операций смещения API Java Kafka
Я пытаюсь использовать низкоуровневый потребительский Java API для управления смещениями вручную, с последним kafka_2.10-0.8.2.1. Чтобы убедиться, что смещения, которые я фиксирую/читаю от Кафки, верны, я использую Кафку.инструменты.Инструмент ConsumerOffsetChecker.
вот пример вывода для моей темы / группы потребителей:
./bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --group elastic_search_group --zookeeper localhost:2181 --topic my_log_topic
Group Topic Pid Offset logSize Lag Owner
elastic_search_group my_log_topic 0 5 29 24 none
Вот моя интерпретация результата:
Offset = 5 --> это текущее смещение моей "elastic_search_group" потребитель
logSize = 29 --> это последнее смещение-смещение следующего сообщения, которое придет в эту тему/раздел
Lag = 24 --> 29-5-сколько сообщений еще не обработано моим потребителем "elastic_search_group"
пид - ID раздела
Q1: это правильно?
Теперь я хочу получить ту же информацию от моего потребителя Java. Здесь я обнаружил, что мне нужно использовать два разных Апис:
Кафка.javaapi.OffsetRequest чтобы получить самые ранние и последние смещения, но Кафка.javaapi.OffsetFetchRequest для получения текущего смещения.
чтобы получить самое раннее (или Последнее) смещение, я делаю:
TopicAndPartition topicAndPartition = new TopicAndPartition(myTopic, myPartition);
Map<TopicAndPartition, PartitionOffsetRequestInfo> requestInfo = new HashMap<TopicAndPartition, PartitionOffsetRequestInfo>();
requestInfo.put(topicAndPartition, new PartitionOffsetRequestInfo(OffsetRequest.EarliestTime(), 1));
// OR for Latest: requestInfo.put(topicAndPartition, new PartitionOffsetRequestInfo(OffsetRequest.LatestTime(), 1));
kafka.javaapi.OffsetRequest request = new kafka.javaapi.OffsetRequest(
requestInfo, kafka.api.OffsetRequest.CurrentVersion(), clientName);
OffsetResponse response = simpleConsumer.getOffsetsBefore(request);
long[] offsets = response.offsets(topic, partition);
long myEarliestOffset = offsets[0];
// OR for Latest: long myLatestOffset = offsets[0];
и чтобы получить текущее смещение я должен использовать совершенно другой API:
short versionID = 0;
int correlationId = 0;
List<TopicAndPartition> topicPartitionList = new ArrayList<TopicAndPartition>();
TopicAndPartition myTopicAndPartition = new TopicAndPartition(myTopic, myPartition);
topicPartitionList.add(myTopicAndPartition);
OffsetFetchRequest offsetFetchReq = new OffsetFetchRequest(
kafkaGroupId, topicPartitionList, versionID, correlationId, kafkaGroupId);
OffsetFetchResponse offsetFetchResponse = simpleConsumer.fetchOffsets(offsetFetchReq);
long currentOffset = offsetFetchResponse.offsets().get(myTopicAndPartition).offset();
Q2: это правильно? почему существуют два разных API для получения очень похожей информации?
В3: не важно какой versionId и correlationId я использую здесь? I хотя versionId должен быть 0 для pre-0.8.2.1 kafka, и быть 1 для 0.8.2.1 и позже - но, похоже, он работает с 0 для 0.8.2.1, а также - см. ниже ?
Итак, для примера состояния темы выше и приведенного выше вывода ConsumerOffsetChecker, вот что я получаю от моего Java-код:
currentOffset=5; earliestOffset=29; latestOffset=29
'' вроде нормально, "latestOffset" тоже правильно, но "earliestOffset"? Я бы ожидал, что это будет, по крайней мере, '5'?Q4: как могло случиться, что earliestOffset выше, чем currentOffset? Мое единственное подозрение, что, возможно, сообщения из этой темы были очищены из-за политики хранения.... Это могло произойти в других случаях?
1 ответов
Я искал средства поиска отставания в разделах. И это включает в себя те же шаги, что и вы. До сих пор, из того, что я узнал, я могу дать вам ответы.
- logSize напрямую указывает, сколько сообщений было накоплено в этом конкретном разделе. Или указывает максимальное смещение сообщений в этом разделе. Offset-это смещение последнего успешно использованного сообщения. Таким образом, лаг - это просто разница между размером журнала и смещением.
- да правильный. До сих пор это только два способа найти текущее смещение и самое раннее или последнее смещение
- Я не знаю, почему необходимо указать versionId. Вы можете использовать
kafka.api.OffsetRequest.CurrentVersion()
чтобы получить versionId. Так что прописать можно избежать. Вы можете с уверенностью предположить correlationId как 0. -
Это странно. Когда я использую EarliestTime (), я получаю самое раннее смещение как 0, даже когда мое текущее смещение продвинулось намного дальше. Это означает, что это начало раздела. Так что, когда некоторые сообщения истек в какое-то будущее время, это самое раннее смещение будет тогда некоторым ненулевым числом. Теперь, если сообщения были удалены из-за задержки политики хранения должны были быть изменены. Я не уверен в этом поведении. Одним из способов быть уверенным было бы, запустив потребителя после отслеживания такого чтения и проверки его журналов. Он должен показывать такие линии.
2015-06-09 18:49:15 :: DEBUG :: PartitionTopicInfo: 52:: reset потребляет смещение запросов:2: fetched offset = 405952: потребляемое смещение = 335372 - 335372 2015-06-09 18:49: 15:: DEBUG:: PartitionTopicInfo: 52:: reset потребляет смещение запросов: 2: fetched offset = 405952: потребляемое смещение = 335373 до 335373
обратите внимание, что в приведенных выше строках журнала полученное смещение остается неизменным, а потребляемое смещение увеличивается. Наконец-то это закончится
2015-06-09 18:49:16 :: DEBUG :: PartitionTopicInfo: 52:: reset потребляет смещение запросов:2: fetched offset = 405952: потребляемое смещение = 405952 to 405952
тогда это будет означать, что из-за смещения политики хранения журнала от 335372 до 405952 истек