Search in sources :

Example 1 with WatermarkIdlePolicyFactory

use of cz.o2.proxima.time.WatermarkIdlePolicyFactory 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 WatermarkIdlePolicyFactory

use of cz.o2.proxima.time.WatermarkIdlePolicyFactory 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 WatermarkIdlePolicyFactory

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

the class NotProgressingWatermarkIdlePolicyTest method testFactory.

@Test
public void testFactory() {
    WatermarkIdlePolicyFactory factory = new NotProgressingWatermarkIdlePolicy.Factory();
    WatermarkIdlePolicy policy = factory.create(Collections.emptyMap());
    assertNotNull(policy);
    assertEquals(NotProgressingWatermarkIdlePolicy.class, policy.getClass());
}
Also used : WatermarkIdlePolicyFactory(cz.o2.proxima.time.WatermarkIdlePolicyFactory) WatermarkIdlePolicy(cz.o2.proxima.time.WatermarkIdlePolicy) WatermarkIdlePolicyFactory(cz.o2.proxima.time.WatermarkIdlePolicyFactory) Test(org.junit.Test)

Example 4 with WatermarkIdlePolicyFactory

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

the class SkewedProcessingTimeIdlePolicyTest method testFactory.

@Test
public void testFactory() {
    WatermarkIdlePolicyFactory factory = new SkewedProcessingTimeIdlePolicy.Factory();
    SkewedProcessingTimeIdlePolicy policy = (SkewedProcessingTimeIdlePolicy) factory.create(Collections.emptyMap());
    assertNotNull(policy);
    assertEquals(DEFAULT_TIMESTAMP_SKEW, policy.getTimestampSkew());
}
Also used : WatermarkIdlePolicyFactory(cz.o2.proxima.time.WatermarkIdlePolicyFactory) WatermarkIdlePolicyFactory(cz.o2.proxima.time.WatermarkIdlePolicyFactory) Test(org.junit.Test)

Example 5 with WatermarkIdlePolicyFactory

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

the class PubSubWatermarkConfigurationTest method testConfigureDefault.

@Test
public void testConfigureDefault() {
    // Check backward compatibility with legacy behaviour
    Map<String, Object> cfg = emptyMap();
    PubSubWatermarkConfiguration configuration = new PubSubWatermarkConfiguration(cfg, ESTIMATE_DURATION, TIMESTAMP_SKEW);
    WatermarkIdlePolicyFactory policyFactory = configuration.getWatermarkIdlePolicyFactory();
    UnboundedOutOfOrdernessWatermarkEstimator estimator = (UnboundedOutOfOrdernessWatermarkEstimator) configuration.getWatermarkEstimatorFactory().create(cfg, policyFactory);
    SkewedProcessingTimeIdlePolicy policy = (SkewedProcessingTimeIdlePolicy) policyFactory.create(cfg);
    assertNotNull(estimator);
    assertNotNull(policy);
    assertEquals(ESTIMATE_DURATION, estimator.getEstimateDurationMs());
    assertEquals(TIMESTAMP_SKEW, estimator.getAllowedTimestampSkew());
}
Also used : WatermarkIdlePolicyFactory(cz.o2.proxima.time.WatermarkIdlePolicyFactory) SkewedProcessingTimeIdlePolicy(cz.o2.proxima.direct.time.SkewedProcessingTimeIdlePolicy) UnboundedOutOfOrdernessWatermarkEstimator(cz.o2.proxima.direct.time.UnboundedOutOfOrdernessWatermarkEstimator) Test(org.junit.Test)

Aggregations

WatermarkIdlePolicyFactory (cz.o2.proxima.time.WatermarkIdlePolicyFactory)11 Test (org.junit.Test)9 HashMap (java.util.HashMap)7 WatermarkEstimatorFactory (cz.o2.proxima.time.WatermarkEstimatorFactory)4 WatermarkIdlePolicy (cz.o2.proxima.time.WatermarkIdlePolicy)3 SkewedProcessingTimeIdlePolicy (cz.o2.proxima.direct.time.SkewedProcessingTimeIdlePolicy)2 WatermarkEstimator (cz.o2.proxima.time.WatermarkEstimator)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 BoundedOutOfOrdernessWatermarkEstimator (cz.o2.proxima.direct.time.BoundedOutOfOrdernessWatermarkEstimator)1 MinimalPartitionWatermarkEstimator (cz.o2.proxima.direct.time.MinimalPartitionWatermarkEstimator)1