kafkacat Utility

kafkacat is a command line utility that you can use to test and debug Apache Kafka deployments. You can use kafkacat to produce, consume, and list topic and partition information for Kafka. Described as “netcat for Kafka”, it is a swiss-army knife of tools for inspecting and creating data in Kafka.

It is similar to Kafka Console Producer (kafka-console-producer) and Kafka Console Producer (kafka-console-consumer), but even more powerful.

kafkacat is an open-source utility, available at https://github.com/edenhill/kafkacat. It is not included in Confluent Platform.

Consumer Mode

In consumer mode, kafkacat reads messages from a topic and partition and prints them to standard output (stdout). You must specify a Kafka broker (-b) and topic (-t). You can optionally specify delimiter (-D). The default delimiter is newline.

You can supply kafkacat with a broker (-b) and a topic (-t) and view see its contents:

$ kafkacat -b localhost:9092 -t mysql_users
% Auto-selecting Consumer mode (use -P or -C to override)
{"uid":1,"name":"Cliff","locale":"en_US","address_city":"St Louis","elite":"P"}
{"uid":2,"name":"Nick","locale":"en_US","address_city":"Palo Alto","elite":"G"}
[...]

kafkacat automatically selects its mode depending on the terminal or pipe type.

  • If data is being piped to kafkacat it will automatically select producer (-P) mode.
  • If data is being piped from kafkacat (e.g. standard terminal output) it will automatically select consumer (-C) mode.

You can explicitly specify mode by using the consumer (-C) or producer (-P) flag. You can also specify how many messages you want to see with the lowercase mode identifier and a number (e.g. -c<num>). For example, to consume a single message:

$ kafkacat -b localhost:9092 -t mysql_users -C -c1
{"uid":1,"name":"Cliff","locale":"en_US","address_city":"St Louis","elite":"P"}

You can view the message key by using the -K argument with a delimiter. For example, to view the message key with a tab delimiter:

$ kafkacat -b localhost:9092 -t mysql_users -C -c1 -K\t
1   {"uid":1,"name":"Cliff","locale":"en_US","address_city":"St Louis","elite":"P"}

The -f flag takes arguments specifying both the format of the output and the fields to include. Here’s a simple example of pretty-printing the key and value pairs for each message:

$ kafkacat -b localhost:9092 -t mysql_users -C -c1 -f 'Key: %k\nValue: %s\n'
Key: 1
Value: {"uid":1,"name":"Cliff","locale":"en_US","address_city":"St Louis","elite":"P"}

Note that the -K: was replaced because the key parameter is specified in the -f format string now.

A more advanced use of -f would be to show even more metadata - offsets, timestamps, and even data lengths:

$ kafkacat -b localhost:9092 -t mysql_users -C -c2 -f '\nKey (%K bytes): %k\t\nValue (%S bytes): %s\nTimestamp: %T\tPartition: %p\tOffset: %o\n--\n'

Key (1 bytes): 1
Value (79 bytes): {"uid":1,"name":"Cliff","locale":"en_US","address_city":"St Louis","elite":"P"}
Timestamp: 1520618381093        Partition: 0    Offset: 0
--

Key (1 bytes): 2
Value (79 bytes): {"uid":2,"name":"Nick","locale":"en_US","address_city":"Palo Alto","elite":"G"}
Timestamp: 1520618381093        Partition: 0    Offset: 1
--

Producer Mode

In producer mode, kafkacat reads messages from standard input (stdin). You must specify a Kafka broker (-b) and topic (-t). You can optionally specify a delimiter (-D). The default delimiter is newline.

You can easily send data to a topic using kafkacat. Run it with the -P command and enter the data you want, and then press Ctrl-D to finish:

$ kafkacat -b localhost:9092 -t new_topic -P
test

Replay it (replace -P with -C) to verify:

$ kafkacat -b localhost:9092 -t new_topic -C
test

You can send data to kafkacat by adding data from a file (<my_topic>). This example treats each line as an individual message by using the -l flag. Without the -l flag, the entire file is treated as its own message. This is useful for sending binary data. This example also uses the -T flag to also echo the input to stdout.

$ kafkacat -b localhost:9092 -t <my_topic> -T -P -l /tmp/msgs
These are
three messages
sent through kafkacat

You can specify the key for messages, using the same -K parameter plus delimiter character that was used for the previous consumer example:

$ kafkacat -b localhost:9092 -t keyed_topic -P -K:
1:foo
2:bar

$ kafkacat -b localhost:9092 -t keyed_topic -C -f 'Key: %k\nValue: %s\n'
Key: 1
Value: foo
Key: 2
Value: bar

You can set the partition:

$ kafkacat -b localhost:9092 -t partitioned_topic -P -K: -p 1
1:foo
$ kafkacat -b localhost:9092 -t partitioned_topic -P -K: -p 2
2:bar
$ kafkacat -b localhost:9092 -t partitioned_topic -P -K: -p 3
3:wibble

Replay, using the format and -f field as above:

$ kafkacat -b localhost:9092 -t partitioned_topic -C -f '\nKey (%K bytes): %k\t\nValue (%S bytes): %s\nTimestamp: %T\tPartition: %p\tOffset: %o\n--\n'
% Reached end of topic partitioned_topic [0] at offset 0

Key (1 bytes): 1
Value (3 bytes): foo
Timestamp: 1520620113485        Partition: 1    Offset: 0
--

Key (1 bytes): 2
Value (3 bytes): bar
Timestamp: 1520620121165        Partition: 2    Offset: 0
--

Key (1 bytes): 3
Value (6 bytes): wibble
Timestamp: 1520620129112        Partition: 3    Offset: 0
--

Metadata Listing Mode

In metadata list mode (-L), kafkacat displays the current state of the Kafka cluster and its topics, partitions, replicas and in-sync replicas (ISR).

$ kafkacat -b localhost:9092 -L

Add the JSON (-J) option to have the output emitted as JSON. This can be useful when passing this data to other applications for further processing.

$ kafkacat -b mybroker -L -J

For more information and examples, see the kafkacat GitHub repository.