Уточнение операций смещения 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 ответов


Я искал средства поиска отставания в разделах. И это включает в себя те же шаги, что и вы. До сих пор, из того, что я узнал, я могу дать вам ответы.

  1. logSize напрямую указывает, сколько сообщений было накоплено в этом конкретном разделе. Или указывает максимальное смещение сообщений в этом разделе. Offset-это смещение последнего успешно использованного сообщения. Таким образом, лаг - это просто разница между размером журнала и смещением.
  2. да правильный. До сих пор это только два способа найти текущее смещение и самое раннее или последнее смещение
  3. Я не знаю, почему необходимо указать versionId. Вы можете использовать kafka.api.OffsetRequest.CurrentVersion() чтобы получить versionId. Так что прописать можно избежать. Вы можете с уверенностью предположить correlationId как 0.
  4. Это странно. Когда я использую 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 истек