Search in sources :

Example 1 with WatermarkEstimatorFactory

use of cz.o2.proxima.time.WatermarkEstimatorFactory in project proxima-platform by O2-Czech-Republic.

the class KafkaLogReader method listener.

// create rebalance listener from consumer
private ConsumerRebalanceListener listener(String name, AtomicReference<KafkaConsumer<Object, Object>> kafka, ElementConsumer<Object, Object> consumer, Map<TopicPartition, Integer> emptyPollCount, Map<TopicPartition, Integer> topicPartitionToId, AtomicReference<PartitionedWatermarkEstimator> watermarkEstimator) {
    return new ConsumerRebalanceListener() {

        private final Set<TopicPartition> currentlyAssigned = new HashSet<>();

        @Override
        public void onPartitionsRevoked(Collection<TopicPartition> parts) {
            currentlyAssigned.removeAll(parts);
        }

        @Override
        public void onPartitionsAssigned(Collection<TopicPartition> parts) {
            currentlyAssigned.addAll(parts);
            log.info("Consumer {} has assigned partitions {}", name, currentlyAssigned);
            emptyPollCount.clear();
            topicPartitionToId.clear();
            AtomicInteger id = new AtomicInteger();
            currentlyAssigned.forEach(p -> {
                topicPartitionToId.put(p, id.getAndIncrement());
                emptyPollCount.put(p, 0);
            });
            if (currentlyAssigned.isEmpty()) {
                watermarkEstimator.set(createWatermarkEstimatorForEmptyParts());
            } else {
                watermarkEstimator.set(new MinimalPartitionWatermarkEstimator(currentlyAssigned.stream().collect(toMap(topicPartitionToId::get, item -> createWatermarkEstimator()))));
            }
            Optional.ofNullable(kafka.get()).ifPresent(c -> consumer.onAssign(c, name != null ? getCommittedTopicOffsets(currentlyAssigned, c) : getCurrentTopicOffsets(currentlyAssigned, c)));
        }

        List<TopicOffset> getCurrentTopicOffsets(Collection<TopicPartition> parts, KafkaConsumer<Object, Object> c) {
            return parts.stream().map(tp -> new TopicOffset(new PartitionWithTopic(tp.topic(), tp.partition()), c.position(tp), watermarkEstimator.get().getWatermark())).collect(Collectors.toList());
        }

        List<TopicOffset> getCommittedTopicOffsets(Collection<TopicPartition> parts, KafkaConsumer<Object, Object> c) {
            Map<TopicPartition, OffsetAndMetadata> committed = new HashMap<>(c.committed(new HashSet<>(parts)));
            for (TopicPartition tp : parts) {
                committed.putIfAbsent(tp, null);
            }
            return committed.entrySet().stream().map(entry -> {
                final long offset = entry.getValue() == null ? 0L : entry.getValue().offset();
                return new TopicOffset(new PartitionWithTopic(entry.getKey().topic(), entry.getKey().partition()), offset, watermarkEstimator.get().getWatermark());
            }).collect(Collectors.toList());
        }

        private WatermarkEstimator createWatermarkEstimator() {
            final WatermarkIdlePolicyFactory idlePolicyFactory = accessor.getWatermarkConfiguration().getWatermarkIdlePolicyFactory();
            final WatermarkEstimatorFactory estimatorFactory = accessor.getWatermarkConfiguration().getWatermarkEstimatorFactory();
            return estimatorFactory.create(cfg, idlePolicyFactory);
        }
    };
}
Also used : Partition(cz.o2.proxima.storage.Partition) ConsumerRecords(org.apache.kafka.clients.consumer.ConsumerRecords) ExceptionUtils(cz.o2.proxima.util.ExceptionUtils) Collectors.toMap(java.util.stream.Collectors.toMap) StreamElement(cz.o2.proxima.storage.StreamElement) WatermarkEstimator(cz.o2.proxima.time.WatermarkEstimator) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) PartitionedWatermarkEstimator(cz.o2.proxima.time.PartitionedWatermarkEstimator) OnlineConsumer(cz.o2.proxima.direct.kafka.ElementConsumers.OnlineConsumer) Duration(java.time.Duration) Map(java.util.Map) WatermarkEstimatorFactory(cz.o2.proxima.time.WatermarkEstimatorFactory) WatermarkIdlePolicyFactory(cz.o2.proxima.time.WatermarkIdlePolicyFactory) TopicPartition(org.apache.kafka.common.TopicPartition) OffsetExternalizer(cz.o2.proxima.direct.commitlog.OffsetExternalizer) Collection(java.util.Collection) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Set(java.util.Set) ObserveHandle(cz.o2.proxima.direct.commitlog.ObserveHandle) UUID(java.util.UUID) PartitionInfo(org.apache.kafka.common.PartitionInfo) Collectors(java.util.stream.Collectors) RebalanceInProgressException(org.apache.kafka.common.errors.RebalanceInProgressException) BiConsumer(cz.o2.proxima.functional.BiConsumer) Objects(java.util.Objects) BulkConsumer(cz.o2.proxima.direct.kafka.ElementConsumers.BulkConsumer) CountDownLatch(java.util.concurrent.CountDownLatch) ConsumerRebalanceListener(org.apache.kafka.clients.consumer.ConsumerRebalanceListener) List(java.util.List) Slf4j(lombok.extern.slf4j.Slf4j) ConsumerRecord(org.apache.kafka.clients.consumer.ConsumerRecord) OffsetAndMetadata(org.apache.kafka.clients.consumer.OffsetAndMetadata) Optional(java.util.Optional) MinimalPartitionWatermarkEstimator(cz.o2.proxima.direct.time.MinimalPartitionWatermarkEstimator) KafkaConsumer(org.apache.kafka.clients.consumer.KafkaConsumer) Context(cz.o2.proxima.direct.core.Context) Getter(lombok.Getter) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) HashMap(java.util.HashMap) AtomicReference(java.util.concurrent.atomic.AtomicReference) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) Watermarks(cz.o2.proxima.time.Watermarks) CommitLogReader(cz.o2.proxima.direct.commitlog.CommitLogReader) ExecutorService(java.util.concurrent.ExecutorService) Nullable(javax.annotation.Nullable) AbstractStorage(cz.o2.proxima.storage.AbstractStorage) CommitLogObserver(cz.o2.proxima.direct.commitlog.CommitLogObserver) Offset(cz.o2.proxima.direct.commitlog.Offset) Preconditions(com.google.common.base.Preconditions) VisibleForTesting(com.google.common.annotations.VisibleForTesting) Collections(java.util.Collections) Position(cz.o2.proxima.storage.commitlog.Position) WatermarkIdlePolicyFactory(cz.o2.proxima.time.WatermarkIdlePolicyFactory) WatermarkEstimatorFactory(cz.o2.proxima.time.WatermarkEstimatorFactory) Set(java.util.Set) HashSet(java.util.HashSet) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) KafkaConsumer(org.apache.kafka.clients.consumer.KafkaConsumer) ConsumerRebalanceListener(org.apache.kafka.clients.consumer.ConsumerRebalanceListener) MinimalPartitionWatermarkEstimator(cz.o2.proxima.direct.time.MinimalPartitionWatermarkEstimator) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) TopicPartition(org.apache.kafka.common.TopicPartition) OffsetAndMetadata(org.apache.kafka.clients.consumer.OffsetAndMetadata) Collection(java.util.Collection) HashSet(java.util.HashSet)

Example 2 with WatermarkEstimatorFactory

use of cz.o2.proxima.time.WatermarkEstimatorFactory in project proxima-platform by O2-Czech-Republic.

the class PubSubReader method createWatermarkEstimator.

WatermarkEstimator createWatermarkEstimator(long minWatermark) {
    final WatermarkIdlePolicyFactory idlePolicyFactory = watermarkConfiguration.getWatermarkIdlePolicyFactory();
    final WatermarkEstimatorFactory estimatorFactory = watermarkConfiguration.getWatermarkEstimatorFactory();
    final WatermarkEstimator estimator = estimatorFactory.create(cfg, idlePolicyFactory);
    estimator.setMinWatermark(minWatermark);
    return estimator;
}
Also used : WatermarkIdlePolicyFactory(cz.o2.proxima.time.WatermarkIdlePolicyFactory) WatermarkEstimatorFactory(cz.o2.proxima.time.WatermarkEstimatorFactory) WatermarkEstimator(cz.o2.proxima.time.WatermarkEstimator)

Example 3 with WatermarkEstimatorFactory

use of cz.o2.proxima.time.WatermarkEstimatorFactory in project proxima-platform by O2-Czech-Republic.

the class BoundedOutOfOrdernessWatermarkEstimatorTest method testFactory.

@Test
public void testFactory() {
    Map<String, Object> cfg = new HashMap<String, Object>() {

        {
            put(prefixedKey(MAX_OUT_OF_ORDERNESS_MS), OUT_OF_ORDERNESS);
        }
    };
    WatermarkIdlePolicyFactory idlePolicyFactory = mock(WatermarkIdlePolicyFactory.class);
    when(idlePolicyFactory.create(cfg)).thenReturn(mock(WatermarkIdlePolicy.class));
    WatermarkEstimatorFactory factory = new BoundedOutOfOrdernessWatermarkEstimator.Factory();
    BoundedOutOfOrdernessWatermarkEstimator watermarkEstimator = (BoundedOutOfOrdernessWatermarkEstimator) factory.create(cfg, idlePolicyFactory);
    assertEquals(OUT_OF_ORDERNESS, watermarkEstimator.getMaxOutOfOrderness());
    verify(idlePolicyFactory, times(1)).create(cfg);
}
Also used : WatermarkIdlePolicyFactory(cz.o2.proxima.time.WatermarkIdlePolicyFactory) WatermarkEstimatorFactory(cz.o2.proxima.time.WatermarkEstimatorFactory) HashMap(java.util.HashMap) WatermarkIdlePolicy(cz.o2.proxima.time.WatermarkIdlePolicy) WatermarkIdlePolicyFactory(cz.o2.proxima.time.WatermarkIdlePolicyFactory) ConfigFactory(com.typesafe.config.ConfigFactory) WatermarkEstimatorFactory(cz.o2.proxima.time.WatermarkEstimatorFactory) Test(org.junit.Test)

Example 4 with WatermarkEstimatorFactory

use of cz.o2.proxima.time.WatermarkEstimatorFactory in project proxima-platform by O2-Czech-Republic.

the class UnboundedOutOfOrdernessWatermarkEstimatorTest method testFactory.

@Test
public void testFactory() {
    long estimateDurationMs = 100L;
    long stepMs = 10L;
    long allowedTimestampSkew = 200L;
    Map<String, Object> cfg = new HashMap<String, Object>() {

        {
            put(prefixedKey(ESTIMATE_DURATION_MS), estimateDurationMs);
            put(prefixedKey(STEP_MS), stepMs);
            put(prefixedKey(ALLOWED_TIMESTAMP_SKEW), allowedTimestampSkew);
        }
    };
    WatermarkIdlePolicyFactory idlePolicyFactory = mock(WatermarkIdlePolicyFactory.class);
    when(idlePolicyFactory.create(cfg)).thenReturn(mock(WatermarkIdlePolicy.class));
    WatermarkEstimatorFactory factory = new UnboundedOutOfOrdernessWatermarkEstimator.Factory();
    UnboundedOutOfOrdernessWatermarkEstimator watermarkEstimator = (UnboundedOutOfOrdernessWatermarkEstimator) factory.create(cfg, idlePolicyFactory);
    assertEquals(estimateDurationMs, watermarkEstimator.getEstimateDurationMs());
    assertEquals(stepMs, watermarkEstimator.getStepMs());
    assertEquals(allowedTimestampSkew, watermarkEstimator.getAllowedTimestampSkew());
    verify(idlePolicyFactory, times(1)).create(cfg);
}
Also used : WatermarkIdlePolicyFactory(cz.o2.proxima.time.WatermarkIdlePolicyFactory) WatermarkEstimatorFactory(cz.o2.proxima.time.WatermarkEstimatorFactory) HashMap(java.util.HashMap) WatermarkIdlePolicy(cz.o2.proxima.time.WatermarkIdlePolicy) WatermarkIdlePolicyFactory(cz.o2.proxima.time.WatermarkIdlePolicyFactory) WatermarkEstimatorFactory(cz.o2.proxima.time.WatermarkEstimatorFactory) Test(org.junit.Test)

Aggregations

WatermarkEstimatorFactory (cz.o2.proxima.time.WatermarkEstimatorFactory)4 WatermarkIdlePolicyFactory (cz.o2.proxima.time.WatermarkIdlePolicyFactory)4 HashMap (java.util.HashMap)3 WatermarkEstimator (cz.o2.proxima.time.WatermarkEstimator)2 WatermarkIdlePolicy (cz.o2.proxima.time.WatermarkIdlePolicy)2 Test (org.junit.Test)2 VisibleForTesting (com.google.common.annotations.VisibleForTesting)1 Preconditions (com.google.common.base.Preconditions)1 ConfigFactory (com.typesafe.config.ConfigFactory)1 CommitLogObserver (cz.o2.proxima.direct.commitlog.CommitLogObserver)1 CommitLogReader (cz.o2.proxima.direct.commitlog.CommitLogReader)1 ObserveHandle (cz.o2.proxima.direct.commitlog.ObserveHandle)1 Offset (cz.o2.proxima.direct.commitlog.Offset)1 OffsetExternalizer (cz.o2.proxima.direct.commitlog.OffsetExternalizer)1 Context (cz.o2.proxima.direct.core.Context)1 BulkConsumer (cz.o2.proxima.direct.kafka.ElementConsumers.BulkConsumer)1 OnlineConsumer (cz.o2.proxima.direct.kafka.ElementConsumers.OnlineConsumer)1 MinimalPartitionWatermarkEstimator (cz.o2.proxima.direct.time.MinimalPartitionWatermarkEstimator)1 BiConsumer (cz.o2.proxima.functional.BiConsumer)1 AbstractStorage (cz.o2.proxima.storage.AbstractStorage)1