1.下载Kafka

wget tar zxvf kafka_2.11-0.10.0.0.tgz
cd kafka_2.11-0.10.0.0

2.启动服务端

Kafka需要用到ZooKeepr,所以需要先启动一个ZooKeepr服务端,如果没有单独的ZooKeeper服务端,可以使用Kafka自带的脚本快速启动一个单节点ZooKeepr实例


# bin/zookeeper-server-start.sh config/zookeeper.properties


启动Kafka服务端实例

# bin/kafka-server-start.sh config/server.properties



3.创建一个Kafka Topic

创建一个名为test的topic,这个topic只有一个分区和一个副本

# bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partition 1 --topic test


创建以后就可以查看了

# bin/kafka-topics.sh --list  --zookeeper localhost:2181


另外,除了手动创建topics,可以配置Brokers自动创建topics


4.发送一些消息

Kafka带有一个命令行工具kafka-console-producer.sh,可以从一个文件或者标准输入读入数据然后以消息的方式发送到Kafka集群。默认每行将被单独作为消息发送。

# bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test2
This is a message
This is another message


5.启动一个消费者

Kafka也自带一个命令行工具用以消费Kafka集群的消息

# bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test2 --from-beginning


producer和consumer分别开两个Linu终端,producer端输入一些内容,就可以看到consumer端会实时显示producer输入的内容


6.建立一个multi-broker集群

以上我们建立运行了单个Kafka broker,但是对于Kafka,单个broker只是Kafka集群的的一个成员,下面我们将扩展Kafka集群到三个broker实例

#cp config/server.properties config/server1.properties
#cp config/server.properties config/server2.properties


主要修改几个参数

broker.id

listeners

log.dirs


broker.id是一个Kafka broker实例在集群中的唯一属于,每个实例需要不同。

bin/kafka-server-start.sh config/server1.properties &
bin/kafka-server-start.sh config/server2.properties &


现在创建一个具有三个复制成员的topic

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic


查看集群中每个broker的状态

# bin/kafka-topics.sh --describe --zookeeper localhost:2181  --topic my-replicated-topic
Topic:my-replicated-topic	PartitionCount:1	ReplicationFactor:3	Configs:
	Topic: my-replicated-topic	Partition: 0	Leader: 0	Replicas: 0,2,1	Isr: 0,2,1



先列出所有分区的概要信息,一个分区显示一行

Leader  负责给定分区的所有读写操作,每个集群节点会是所有分区中随机选取的分区的leader

Replicas 列出当前分区的复制节点,不管这些节点是否是Leader甚至是否当前存活

Isr    in-sync复制集的子集,列出当前存活并且赶上leader的集群节点


向新的topic发送一些消息

# bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-replicated-topic

输入一些消息

再开一个终端消费这些消息

# bin/kafka-console-consumer.sh --zookeeper localhost:2181 --from-beginning --topic my-replicated-topic


可以看到输入的消息很快就别消费掉了


现在测试搭建的Kafka Cluster的容错能力

# bin/kafka-topics.sh --describe --zookeeper localhost:2181  --topic my-replicated-topic
Topic:my-replicated-topic	PartitionCount:1	ReplicationFactor:3	Configs:
	Topic: my-replicated-topic	Partition: 0	Leader: 0	Replicas: 0,2,1	Isr: 0,1,2


Leader:0 表示Broker 0 是leader,Broker 1和Broker 2是replica


现在我们把Broker 0 给kill 掉

# kill -9 $(ps -ef|grep server.properties|grep -v grep|awk '{print $2}')


再查看集群节点状态

# bin/kafka-topics.sh --describe --zookeeper localhost:2181  --topic my-replicated-topic
Topic:my-replicated-topic	PartitionCount:1	ReplicationFactor:3	Configs:
	Topic: my-replicated-topic	Partition: 0	Leader: 2	Replicas: 0,2,1	Isr: 1,2


可以看到Leader已经切换到Broker 2了,Broker 0已经不在Isr这个子集中了,Replicas还是三个成员


再次执行消费者

# bin/kafka-console-consumer.sh --zookeeper localhost:2181 --from-beginning --topic my-replicated-topic


可以看到之前生产者发送的消息依然可以被消费,虽然负责消息写入的leader已经挂掉了




7.使用Kfaka Connect导入导出数据

从Linux终端读入数据然后将数据输出到终端方便了解Kafka,接下来使用Kafka从其他数据来源导入数据,然后导出数据到其他系统中去。对于很多系统来说,可以使用Kafka Connect来导入导出数据来取代重新编写一些自定义代码。Kafka Connect是一个Kafka自带的工具用于导入导出数据。


先向一个文件中写入一些数据

echo -e "foo\nbar" > test.txt


然后,启动两个Kafka Connector以standalone模式运行

bin/connect-standalone.sh config/connect-standalone.properties config/connect-file-source.properties config/connect-file-sink.properties


connect-standalone.properties

bootstrap.servers=localhost:9092
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=true
value.converter.schemas.enable=true
internal.key.converter=org.apache.kafka.connect.json.JsonConverter
internal.value.converter=org.apache.kafka.connect.json.JsonConverter
internal.key.converter.schemas.enable=false
internal.value.converter.schemas.enable=false
offset.storage.file.filename=/tmp/connect.offsets
offset.flush.interval.ms=10000


connect-file-source.properties

name=local-file-source
connector.class=FileStreamSource
tasks.max=1
file=test.txt
topic=connect-test



connect-file-sink.properties

name=local-file-sink
connector.class=FileStreamSink
tasks.max=1
file=test.sink.txt
topics=connect-test


一旦启动Kafka Connect进程,source connector会从test.txt中读入数据,然后将这些数据推送给connect-test这个topic,sink connector会从这个topic读出数据并写入数据到test.sink.txt文件

# cat test.sink.txt 
foo
bar


消息是存储在connect-test这个topic中的

# bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic connect-test --from-beginning 
{"schema":{"type":"string","optional":false},"payload":"foo"}
{"schema":{"type":"string","optional":false},"payload":"bar"}


connector的终端先不要断开,继续向test.txt文件中追加几行,看看console-consumer是否会有刷新

# echo "Another line" >> test.txt
# cat test.sink.txt 
foo
bar
Another line



可以看到test.sink.txt这个文件也多了一行



8.Use Kafka Streams to process data

Kafka Streams是Kafka用于实时流数据处理和分析Kafka brokers中存储的数据的客户端库。

#echo -e "all streams lead to kafka\nhello kafka streams\njoin kafka summit" > file-input.txt
# cat file-input.txt | bin/kafka-console-producer.sh --broker-list localhost:9092 --topic streams-file-input
# ./bin/kafka-run-class.sh  org.apache.kafka.streams.examples.wordcount.WordCountDemo


# ./bin/kafka-console-consumer.sh --zookeeper localhost:2181 \
> --topic streams-wordcount-output \
> --from-beginning \
> --formatter kafka.tools.DefaultMessageFormatter \
> --property print.key=true \
> --property key.deserializer=org.apache.kafka.common.serialization.StringDeserializer \
> --property value.deserializer=org.apache.kafka.common.serialization.LongDeserializer


输出

all	1
streams	1
lead	1
to	1
kafka	1
hello	1
kafka	2
streams	2
join	1
kafka	3
summit	1








参考文档:

http://kafka.apache.org/documentation.html#quickstart