Tüm Ürünler
Search
Belge Merkezi

DataHub:DataHub Kafka uyumluluk modu

Son Güncelleme:Oct 07, 2026

DataHub Kafka uyumluluk modu

DataHub artık Apache Kafka protokolüyle uyumludur. Veri yayınlamak ve abone olmak için standart bir Kafka SDK kullanarak DataHub'a bağlanabilirsiniz.

DataHub ile Kafka arasındaki kavram eşleştirmesi


Kafka


DataHub


topic


Project.topic


partition


shard


offset


sequence

Kafka topic

DataHub'da da topic bulunur. Ancak DataHub, Kafka'da mevcut olmayan proje adında ek bir kaynak katmanı içerir. Uyumluluğu sağlamak için bir Kafka topic'i, nokta (.) ile birleştirilen bir DataHub projesi ve topic kombinasyonuna karşılık gelir. Örneğin, DataHub'da test_project adlı bir projeniz ve test_topic adlı bir topic'iniz varsa, karşılık gelen Kafka topic adı test_project.test_topic olur.

Kafka partition

Bir Kafka partition'ı doğrudan bir DataHub shard'ına eşdeğerdir. Her ikisi de sıralı bir veri kuyruğunu temsil eder.

Kafka consumer group

Bir DataHub consumer group'u, bir Kafka consumer group'u gibi davranır. Bir proje içinde bir consumer group oluşturabilir ve bunu abone olmak istediğiniz topic'lerle ilişkilendirebilirsiniz. Grup, o proje içindeki birden fazla topic'e abone olabilir. Bir consumer group bir topic'e bağlandığında, abonelik otomatik olarak oluşturulur ve topic'in abonelik listesi sayfasında görünür. Bu aboneliği silmek, grubun topic'e abone olmasını engeller ve önceki tüm consumer offset'lerini siler.

Consumer group bir projenin alt kaynağı olduğundan, bunu projeyle birlikte belirtmeniz gerekir. Örneğin, DataHub projeniz test_project ve consumer group'unuz test_group ise, Kafka grup adı test_project.test_group olur.

Consumer group oluştur iletişim kutusunda, bir Name ve Description girin, Topic alanında abone olunacak topic'leri seçin, sağdaki seçili listeye eklemek için > düğmesini tıklayın ve ardından Create öğesini tıklayın.

Her grup en fazla 50 topic'e abone olabilir. Daha fazlasına abone olmanız gerekiyorsa lütfen bir destek talebi gönderin.

Kafka Record

Bir Kafka kaydı anahtar-değer biçimini kullanır. DataHub kayıtları iki biçimde mevcuttur: Tuple (güçlü yapılandırılmış veri) ve Blob (ikili veri). Bir Kafka kaydı iki bölümden oluşur: bir başlık ve bir anahtar-değer çifti.

Kafka Header

Bir Kafka başlığı, kayıtlara meta veri ekler ve bu bir DataHub niteliğine eşdeğerdir. Başlıklarla veri yazmak için bir Kafka istemcisi kullandığınızda, başlık bilgileri DataHub nitelikleri olarak depolanır. Bir Kafka başlığının değeri NULL ise, ilgili başlık yoksayılır. Rezerve edilmiş bir iç anahtar olduğu için "__kafka_key__" ifadesini başlık anahtarı olarak kullanmayın.

Kafka anahtar-değer verileri

  • Bir DataHub topic'i Tuple türündeyse, anahtarı ilk String sütuna ve değeri ikinci String sütuna karşılık gelir.

  • Bir DataHub topic'i Blob türündeyse, değeri veri içeriğine karşılık gelir ve anahtarı <"__kafka_key__", key> biçimindeki bir niteliğe yerleştirilir.

Kafka offset

Bir Kafka offset'i, 0'dan başlayan ve her partition içinde otomatik olarak artan 64 bitlik bir tamsayıdır; bu, her kayda benzersiz bir konum verir. Temel olarak consumer ilerlemesini izlemek için kullanılır. Bir DataHub sequence'i doğrudan bir Kafka offset'ine eşdeğerdir.

Sınırlamalar

DataHub, Kafka işlemlerini, idempotency özelliğini, SchemaRegistry'yi veya Log Compaction'ı desteklemez.

Hızlı Başlangıç

  1. Önerilen Kafka istemci sürümü 2.4.0'ı kullanın. Bu sürüm 0.10.0 ile 4.0 arasındaki sürümlerle uyumludur.

  2. DataHub'da ilgili Project, Topic ve Group kaynaklarını oluşturun.

  3. Güvenlik kimlik doğrulama yöntemini SASL/SSL olarak değiştirin, SASL için PLAIN mekanizmasını kullanın ve Alibaba Cloud AccessKey çiftinizi (AK/SK) yapılandırın.

  4. Kafka broker bilgilerini DataHub uç noktasına değiştirin (hizmet alanları listesine bakın).

Kaynak oluşturma

İlk olarak, DataHub konsoluna giriş yapın ve bir proje oluşturun.

Yeni Proje iletişim kutusunda, Name değerini test_kafka_project ve Description değerini test kafka olarak ayarlayın.

Topic oluşturma

DataHub konsolunun New Topic sayfasında, oluşturma yöntemi olarak Direct Create öğesini seçin, ad olarak test_kafka girin ve tür olarak TUPLE seçeneğini belirleyin. Şema ayrıntıları bölümünde, key ve value adlı iki alan ekleyin, her ikisinin türünü STRING olarak ayarlayın ve Allow NULL seçeneğini işaretleyin. Shard Count değerini 1 ve Lifecycle değerini 3 olarak ayarlayın, Shard Scaling Mode özelliğini etkinleştirin ve Multi-version özelliğini devre dışı bırakın. Bir açıklama girin ve Create öğesini tıklayın.

Bir grup oluşturun ve tüketmeniz gereken topic'leri bağlayın. Grup oluşturulduktan sonra bağlı topic listesini değiştirebilirsiniz. Mesajları tüketmeniz gerekmiyorsa bu adımı atlayın.

New Group panelinde, bir Name ve Description girin, transfer listesini kullanarak soldaki kullanılabilir listeden sağdaki seçili listeye tüketilecek topic'leri taşıyın ve ardından Create öğesini tıklayın.

Kimlik Doğrulama Yöntemi

kafka_client_producer_jaas.conf adlı bir dosya oluşturun ve aşağıdaki içerikle herhangi bir yola kaydedin:

KafkaClient {
  org.apache.kafka.common.security.plain.PlainLoginModule required
  username="accessId"
  password="accessKey";
};

kafka_client_producer_jaas.conf adlı bir dosya oluşturun ve aşağıdaki içerikle herhangi bir dizine kaydedin:

KafkaClient {
  org.apache.kafka.common.security.plain.PlainLoginModule required
  username="YOUR_ACCESS_ID"
  password="YOUR_ACCESS_KEY";
};

Üretici örneği

kafka clients pom dosyası

<dependency>
  <groupId>org.apache.kafka</groupId>
  <artifactId>kafka-clients</artifactId>
  <version>2.4.0</version>
</dependency>

Kafka istemci pom.xml dosyası:

<dependency>
  <groupId>org.apache.kafka</groupId>
  <artifactId>kafka-clients</artifactId>
  <version>2.4.0</version>
</dependency>

ProducerExample

Tüketici örneği

ConsumerExample

package com.aliyun.datahub.kafka.demo;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public class ConsumerExample2 {
    static {
        System.setProperty("java.security.auth.login.config", "/path/xxx/kafka_client_producer_jaas.conf");
    }
    public static void main(String[] args) {
        Properties properties = new Properties();
        properties.put("bootstrap.servers", "dh-cn-hangzhou.aliyuncs.com:9092");
        properties.put("security.protocol", "SASL_SSL");
        properties.put("sasl.mechanism", "PLAIN");
        properties.put("group.id", "test_project.test_kafka_group");
        properties.put("auto.offset.reset", "earliest");
        properties.put("session.timeout.ms", "60000");
        properties.put("heartbeat.interval.ms", "40000");
        properties.put("ssl.endpoint.identification.algorithm", "");
        properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<String, String>(properties);
        List<String> topicList = new ArrayList<>();
        topicList.add("test_project.test_topic1");
        topicList.add("test_project.test_topic2");
        topicList.add("test_project.test_topic3");
        kafkaConsumer.subscribe(topicList);
        while (true) {
            ConsumerRecords<String, String> records = kafkaConsumer.poll(Duration.ofSeconds(5));
            for (ConsumerRecord<String, String> record : records) {
                System.out.println(record.toString());
            }
        }
    }
}

ConsumerExample

package com.aliyun.datahub.kafka.demo;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public class ConsumerExample {
    static {
        System.setProperty("java.security.auth.login.config", "/path/to/your/kafka_client_producer_jaas.conf");
    }
    public static void main(String[] args) {
        Properties properties = new Properties();
        properties.put("bootstrap.servers", "dh-cn-hangzhou.aliyuncs.com:9092");
        properties.put("security.protocol", "SASL_SSL");
        properties.put("sasl.mechanism", "PLAIN");
        properties.put("group.id", "test_project.test_kafka_group");
        properties.put("auto.offset.reset", "earliest");
        properties.put("session.timeout.ms", "60000");
        properties.put("heartbeat.interval.ms", "40000");
        properties.put("ssl.endpoint.identification.algorithm", "");
        properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<String, String>(properties);
        List<String> topicList = new ArrayList<>();
        topicList.add("test_project.test_topic1");
        topicList.add("test_project.test_topic2");
        topicList.add("test_project.test_topic3");
        kafkaConsumer.subscribe(topicList);
        while (true) {
            ConsumerRecords<String, String> records = kafkaConsumer.poll(Duration.ofSeconds(5));
            for (ConsumerRecord<String, String> record : records) {
                System.out.println(record.toString());
            }
        }
    }
}

Streams Örnekleri

Bu kod, test_project içindeki input konusundan veri okur, anahtar ve değer dizelerini küçük harfe dönüştürür ve veriyi output konusuna yeniden yazar.

public class StreamExample {
    static {
        System.setProperty("java.security.auth.login.config", "/path/xxx/kafka_client_producer_jaas.conf");
    }
    public static void main(final String[] args) {
        final String input = "test_project.input";
        final String output = "test_project.output";
        final Properties properties = new Properties();
        properties.put("bootstrap.servers", "dh-cn-hangzhou.aliyuncs.com:9092");
        properties.put("application.id", "test_project.test_kafka_group");
        properties.put("security.protocol", "SASL_SSL");
        properties.put("sasl.mechanism", "PLAIN");
        properties.put("session.timeout.ms", "60000");
        properties.put("heartbeat.interval.ms", "40000");
        properties.put("auto.offset.reset", "earliest");
        final StreamsBuilder builder = new StreamsBuilder();
        TestMapper testMapper = new TestMapper();
        builder.stream(input, Consumed.with(Serdes.String(), Serdes.String()))
                .map(testMapper)
                .to(output, Produced.with(Serdes.String(), Serdes.String()));
        final KafkaStreams streams = new KafkaStreams(builder.build(), properties);
        final CountDownLatch latch = new CountDownLatch(1);
        Runtime.getRuntime().addShutdownHook(new Thread("streams-shutdown-hook") {
            @Override
            public void run() {
                streams.close();
                latch.countDown();
            }
        });
        try {
            streams.start();
            latch.await();
        } catch (final Throwable e) {
            System.exit(1);
        }
        System.exit(0);
    }
    static class TestMapper implements KeyValueMapper<String, String, KeyValue<String, String>> {
        @Override
        public KeyValue<String, String> apply(String s, String s2) {
            return new KeyValue<>(StringUtils.lowerCase(s), StringUtils.lowerCase(s2));
        }
    }
}

Bu örnek, test_project projesindeki input topic'inden veri okur, anahtar ve değer dizelerini küçük harfe dönüştürür ve sonucu output topic'ine yazar.

public class StreamExample {
    static {
        System.setProperty("java.security.auth.login.config", "/path/to/your/kafka_client_producer_jaas.conf");
    }
    public static void main(final String[] args) {
        final String input = "test_project.input";
        final String output = "test_project.output";
        final Properties properties = new Properties();
        properties.put("bootstrap.servers", "dh-cn-hangzhou.aliyuncs.com:9092");
        properties.put("application.id", "test_project.test_kafka_group");
        properties.put("security.protocol", "SASL_SSL");
        properties.put("sasl.mechanism", "PLAIN");
        properties.put("session.timeout.ms", "60000");
        properties.put("heartbeat.interval.ms", "40000");
        properties.put("auto.offset.reset", "earliest");
        final StreamsBuilder builder = new StreamsBuilder();
        TestMapper testMapper = new TestMapper();
        builder.stream(input, Consumed.with(Serdes.String(), Serdes.String()))
                .map(testMapper)
                .to(output, Produced.with(Serdes.String(), Serdes.String()));
        final KafkaStreams streams = new KafkaStreams(builder.build(), properties);
        final CountDownLatch latch = new CountDownLatch(1);
        Runtime.getRuntime().addShutdownHook(new Thread("streams-shutdown-hook") {
            @Override
            public void run() {
                streams.close();
                latch.countDown();
            }
        });
        try {
            streams.start();
            latch.await();
        } catch (final Throwable e) {
            System.exit(1);
        }
        System.exit(0);
    }
    static class TestMapper implements KeyValueMapper<String, String, KeyValue<String, String>> {
        @Override
        public KeyValue<String, String> apply(String s, String s2) {
            return new KeyValue<>(StringUtils.lowerCase(s), StringUtils.lowerCase(s2));
        }
    }
}

Streams işini başlattıktan sonra, shard ataması yaklaşık bir dakika sürer. Ardından konsolda görev sayısını görüntüleyebilirsiniz. Görev sayısı, input topic'indeki shard sayısıyla eşleşir. Bu örnekte, input topic'i üç shard'a sahiptir.

Çıkış örnekleme sonucu, verilerin doğru şekilde yazıldığını gösterir. Streams görevindeki TestMapper tarafından işlendikten sonra, büyük harfli girdi küçük harfli çıktıya dönüştürüldü: anahtarlar aaaa, cccc ve eeee, karşılık gelen değerler ise bbbb, dddd ve ffff şeklindedir.

Self-managed Kafka'dan DataHub'a veri geçirin

  1. Broker adresini değiştirin. Daha fazla bilgi için aşağıdaki alan adı listesine bakın.

  2. DataHub'da kaynaklar oluşturun ve kodunuzdaki kaynak adlarını değiştirin. Daha fazla bilgi için yukarıdaki kaynak oluşturma bölümüne bakın.

  3. Kimlik doğrulama yöntemini SASL_SSL olarak değiştirin. Kimlik doğrulama mekanizması PLAIN'dir. Kullanıcı adınızı Alibaba Cloud AccessKey ID'niz (AK) ve şifrenizi AccessKey Secret'ınız (SK) olarak ayarlayın.

Ek Bilgiler

Yapılandırma Genel Bakışı

C=Tüketici, P=Üretici, S=Streams


Parametre


C/P/S


Önerilen değer


Gerekli


Açıklama


bootstrap.servers


*


Alan adı listesine bakın.


Evet


security.protocol


*


SASL_SSL


Evet


Veri iletiminin güvenliğini sağlamak için, Kafka'dan DataHub'a veri yazma işlemi varsayılan olarak SSL şifrelemesi kullanır.


sasl.mechanism


*


PLAIN


Evet


AccessKey kimlik doğrulaması. Yalnızca PLAIN desteklenir.


compression.type


P


LZ4


Hayır


Veri iletimi için sıkıştırmanın etkinleştirilip etkinleştirilmeyeceğini belirtir. Şu anda yalnızca LZ4 desteklenmektedir.


enable.idempotence


P


false


Hayır


Kafka istemci sürümü 3.0.1 ve sonrası, idempotency özelliğini varsayılan olarak etkinleştirir. DataHub idempotency özelliğini desteklemediğinden, bu özelliği manuel olarak devre dışı bırakmanız gerekir. Bu yapılandırma, 3.0.1 öncesi sürümler için gerekli değildir.


group.id


C


project.group


Evet


partition.assignment.strategy


C


org.apache.kafka.clients.consumer.RangeAssignor


Hayır


Kafka için varsayılan değer RangeAssignor'dur. DataHub şu anda yalnızca RangeAssignor'u destekler. Bu yapılandırmayı değiştirmeyin.


session.timeout.ms


C/S


[60000, 180000]


Hayır


Kafka'daki varsayılan değer 10000'dir. Ancak, DataHub minimum 60000 değerini zorunlu kılar, bu nedenle değer varsayılan olarak 60000 olur.


heartbeat.interval.ms


C/S


session.timeout.ms değerinin üçte ikisi.


Hayır


Kafka'daki varsayılan değer 3000'dir. session.timeout.ms varsayılan olarak 60000 olduğundan, sık heartbeat isteklerini önlemek için bu değeri açıkça 40000 olarak ayarlayın.


application.id


S


project.topic:subId veya project.group


Evet


project.topic:subId kullanıyorsanız, bu abone olunan topic ile eşleşmelidir. Aksi takdirde veri okunamaz. project.group kullanmanızı öneririz.

Hizmet Alan Adı Listesi


Bölge adı


Bölge


Genel uç nokta


VPC ECS uç noktası


China East 1 (Hangzhou)


cn-hangzhou


dh-cn-hangzhou.aliyuncs.com:9092


dh-cn-hangzhou-int-vpc.aliyuncs.com:9094


China East 2 (Shanghai)


cn-shanghai


dh-cn-shanghai.aliyuncs.com:9092


dh-cn-shanghai-int-vpc.aliyuncs.com:9094


China North 2 (Beijing)


cn-beijing


dh-cn-beijing.aliyuncs.com:9092


dh-cn-beijing-int-vpc.aliyuncs.com:9094


China (Ulanqab)


cn-wulanchabu


dh-cn-wulanchabu.aliyuncs.com:9092


dh-cn-wulanchabu-int-vpc.aliyuncs.com:9094


China South 1 (Shenzhen)


cn-shenzhen


dh-cn-shenzhen.aliyuncs.com:9092


dh-cn-shenzhen-int-vpc.aliyuncs.com:9094


China North 3 (Zhangjiakou)


cn-zhangjiakou


dh-cn-zhangjiakou.aliyuncs.com:9092


dh-cn-zhangjiakou-int-vpc.aliyuncs.com:9094


Asia Pacific SE 1 (Singapore)


ap-southeast-1


dh-ap-southeast-1.aliyuncs.com:9092


dh-ap-southeast-1-int-vpc.aliyuncs.com:9094


Asia Pacific SE 3 (Kuala Lumpur)


ap-southeast-3


dh-ap-southeast-3.aliyuncs.com:9092


dh-ap-southeast-3-int-vpc.aliyuncs.com:9094


Europe Central 1 (Frankfurt)


eu-central-1


dh-eu-central-1.aliyuncs.com:9092


dh-eu-central-1-int-vpc.aliyuncs.com:9094


China East 2 (Shanghai) Finance


cn-shanghai-finance-1


dh-cn-shanghai-finance-1.aliyuncs.com:9092


dh-cn-shanghai-finance-1-int-vpc.aliyuncs.com:9094


China (Hong Kong)


cn-hongkong


dh-cn-hongkong.aliyuncs.com:9092


dh-cn-hongkong-int-vpc.aliyuncs.com:9094

Kafka API uyumluluğu

Resmi Kafka belgeleri mevcut tüm API'leri listeler. Aşağıdaki tabloda, DataHub'un Kafka uyumluluk modunda desteklediği API'ler listelenmiştir.


API


Açıklama


Produce


Veri yazar.


Fetch


Veri okur.


ListOffsets


Zamana göre offset'leri alır. Eski sürümler bir offset listesi döndürürken, yeni sürümler tek bir offset döndürür.


Metadata


Okuma ve yazma işlemleri için meta verileri alır.


OffsetCommit


Bir offset'i commit eder.


OffsetFetch


Bir offset'i alır.


FindCoordinator


Koordinatörü barındıran broker'ı bulur ve sanal IP (VIP) adresini döndürür.


JoinGroup


Bir gruba katılır.


Heartbeat


Bir heartbeat gönderir.


LeaveGroup


Bir gruptan ayrılır.


SyncGroup


Grup lideri tarafından partition atama planını göndermek ve tüm üyeler tarafından bunu almak için kullanılır.


SaslHandshake


Kimlik doğrulama için Simple Authentication and Security Layer (SASL) el sıkışmasını işler.


ApiVersions


Mevcut tüm API'leri alır.


CreateTopics


Bir topic oluşturur.


DeleteTopics


Bir topic siler.


OffsetForLeaderEpoch


En son offset'i alır.


SaslAuthenticate


İstemciyi SASL kullanarak kimlik doğrular.


CreatePartitions


Bir partition ekler.


DeleteGroups


Bir grup siler.


OffsetDelete


Bir offset siler.