You are browsing a read-only backup copy of Wikitech. The live site can be found at


From Wikitech-static
Revision as of 17:20, 29 September 2020 by imported>Nintendofan885 (Use
Jump to navigation Jump to search

Apache Kafka is a scalable and durable distributed logging buffer. We currently run 4 Kafka clusters using Confluent's Kafka distribution.


See the Kafka Administration page for administration tips and documentation.

Kafka Clusters

Our six clusters are analytics-eqiad, jumbo-eqiad, main-eqiad, main-codfw,logging-eqiad,and logging-codfw

analytics (eqiad)

analytics-eqiad is the original Kafka install at WMF. (It was originally referred to as just eqiad.) It consists of 6 brokers inside the Analytics VLAN. It originally served webrequest logs and various other high volume analytics data. Most of its uses have been moved to jumbo-eqiad (described below). As of 2018-07, it still hosts the Mediawiki produced Avro topics for CirrusSearchRequestSet and ApiAction logs. Removal of these are blocked on this ticket.

This cluster is slated to be decommissioned as soon as we can remove all usage from it.

Brokers: kafka_clusters.eqiad.

jumbo (eqiad)

The Kafka jumbo cluster is the replacement for the Kafka analytics cluster. The bulk of the data on this cluster is from webrequests. This cluster is also used directly for Analytics EventLogging, Discovery Analytics, statsv and EventStreams. Much of the data here is imported into Hadoop using Camus. Data from main clusters is mirrored to this cluster for Analytics purposes.

This cluster is intended to be used for high volume Analytics, as well as other non production critical services. If you are building a production level (e.g. paging on a holiday) service that uses Kafka, you should use the main Kafka clusters. All (almost) topics from the main clusters are mirrored here via MirrorMaker instances running on each of the broker nodes. These MirrorMaker instances are called main-eqiad_to_jumbo-eqiad, and as such they mirror topics from the main-eqiad cluster.

Brokers: kafka_clusters.jumbo-eqiad.

main (eqiad and codfw)

The 'main' Kafka clusters in eqiad and codfw are mirrors of each other. The 'main' clusters should be used for low volume critical production services. Main is currently used directly by Event_Platform/EventGate and change-propagation.

MirrorMaker instance run on each broker node, and consume from the remote data center. On main-eqiad, these instances are called main-codfw_to_main-eqiad, and on main-codfw, they are callsed main-eqiad_to_main-codfw.

Only topics prefixed by the appropriate datacenter names are mirrored between the two main clusters. I.e. only eqiad.* topics are mirrored from main-eqiad -> main-codfw, and vice versa.

Brokers: kafka_clusters.main-eqiad, clusters.main-codfw.

logging (eqiad and codfw)

The 'logging' Kafka clusters in eqiad and codfw are a component of the ELK logging pipeline.

Hosts produce to this Kafka cluster by way of rsyslog omkafka, and logstash is the consumer. This provides a buffering layer to smooth load on the logstash collectors, and prevent lost log messages in the event that logstash crashes or is unable to cope with the load.

Multi-site for this cluster is designed so that logstash collectors in eqiad and codfw may consume from both kafka clusters, and agents may produce to only the nearest cluster. Currently the Kafka brokers for this cluster run on the same hardware as the logstash Elasticsearch instances.

Brokers: kafka_clusters.logging-eqiad,kafka_clusters.logging-codfw

Webrequest logs

varnishkafka is installed on frontend varnishes. It sends webrequest logs to the jumbo Kafka brokers.

kafaktee is a replacement for udp2log that consumes from Kafka instead of from the udp2log firehose. It runs on oxygen, consumes, samples, and filters the webrequest to files for easy grepping and troubleshooting. Fundraising also runs an instance of Kafkatee that feeds webrequest logs into banner analysis logic.


In Labs

Kafka is puppetized in order to be able to spawn up arbitrary clusters in labs. Here's how.

You'll need a running Zookeeper and Kafka broker. These instructions show how to set up a single node Zookeeper and Kafka on the same host.

Create a new Jessie labs instance. In this example we have named our new instance 'kafka1' and it is in the 'analytics' project. Thus the hostname is Wait for the instance to spawn and finish its first puppet run. Make sure you can log in.

Edit hiera data for your project and set the following:

zookeeper_cluster_name: my-zookeeper-cluster
     hosts: "1"

    zookeeper_cluster_name: my-zookeeper-cluster
            id: "1"

Go to the configure instance page for your new instance, and check the following boxes to include needed classes:

  • role::zookeeper::server
  • role::kafka::simple::broker

Run puppet on your new instance. Fingers crossed and you should have a new Kafka broker running.

To verify, log into your instance and run

 kafka topics --create --topic test --partitions 2 --replication-factor 1
 kafka topics --describe

If this succeeds, you will have created a topic in your new single node Kafka cluster.

Kafka clients usually take a list of brokers and/or a zookeeper connect string in order to work with Kafka. In this example, those would be:

  • broker list:
  • zookeeper connect:

Note that the zookeeper connect URL contains a path that has the value of kafka_cluster_name in it. You should substitute this for whatever you named your cluster in your hiera config.

How do I ...

Easiest CLI to interact with Kafka is kafkacat. This can be executed in several modes (e.g. consumer, producer, etc.) See kafkacat --help for more info.

List available Kafka topics

stat1007$ kafkacat -L -b kafka-jumbo1001.eqiad.wmnet:9092 | grep topic


stat1007$ kafkacat -C -b kafka-jumbo1001.eqiad.wmnet:9092 -t test


stat1007$ cat test_message.txt
Hola Mundo
stat1007$ cat test_message.txt | kafkacat -P -b kafka-jumbo1001.eqiad.wmnet:9092 -t test

Consume with a Python Kafka client

The two best Python Kafka clients (as of 2020-01) are confluent-kafka and kafka-python. Follow instructions there to connect to a Kafka broker and consume.

Consume using Spark Streaming

Consume avro schema from kafka

NOTE: WMF no longer actively uses Avro in Kafka. (The mediawiki_CirrusSearchRequestSet does not have any data.)

 from kafka import KafkaConsumer
 import avro.schema
 import io

 # To consume messages
 consumer = KafkaConsumer('mediawiki_CirrusSearchRequestSet',

 schema = avro.schema.parse(open(schema_path).read())

 for msg in consumer:
    bytes_reader = io.BytesIO(msg.value)
    decoder =
    reader =
    data =
    print data

See also