Kafka

配置
在配置文件server.properties修改如下内容:

#broker.id是broker的标识,具有唯一性
broker.id=3
#端口号默认为9092
port=9092
#host.name位kafka所在机器的ip
host.name=192.168.152.45
#设置zookeeper,可连接多个zookeeper服务器
zookeeper.connect=zookeeper.connect=192.168.152.45:2181,192.168.152.39:2181,192.168.152.29:2181

 

启动停止

#进入$KAFKA_HOME 
 #启动
 sudo bin/kafka-server-start.sh config/server.properties &
 #停止bin/kafka-server-stop.sh

生产/消费消息

#创建topic
 bin/kafka-topics.sh --create --zookeeper 192.168.152.45:2182 --replication-factor 1 --partitions 1 --topic test
 #生产消息
 bin/kafka-console-producer.sh --broker-list 192.168.152.45:9092 --topic test
 #消费消息
bin/kafka-console-consumer.sh –zookeeper 192.168.152.45:2181,192.168.152.39:2181,192.168.152.29:2181 --topic test --from-beginning

设置多个broker集群

到目前,我们只是单一的运行一个broker,,没什么意思。对于Kafka,一个broker仅仅只是一个集群的大小, 所有让我们多设几个broker.
首先为每个broker创建一个配置文件:

> cp config/server.properties config/server-1.properties 
> cp config/server.properties config/server-2.properties

现在编辑这些新建的文件,设置以下属性:
 

config/server-1.properties: 
    broker.id=1 
    listeners=PLAINTEXT://:9093 
    log.dir=/tmp/kafka-logs-1

config/server-2.properties: 
    broker.id=2 
    listeners=PLAINTEXT://:9094 
    log.dir=/tmp/kafka-logs-2

broker.id是集群中每个节点的唯一且永久的名称,我们修改端口和日志分区是因为我们现在在同一台机器上运行,我们要防止broker在同一端口上注册和覆盖对方的数据。

我们已经运行了zookeeper和刚才的一个kafka节点,所有我们只需要在启动2个新的kafka节点。

> bin/kafka-server-start.sh config/server-1.properties &
... 
> bin/kafka-server-start.sh config/server-2.properties &
...

现在,我们创建一个新topic,把备份设置为:3

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

好了,现在我们已经有了一个集群了,我们怎么知道每个集群在做什么呢?运行命令“describe topics”

[root@slave2 kafka_2.11-0.11.0.1]# ./bin/kafka-topics.sh --describe --zookeeper 192.168.152.45:2181 --topic my-replicated-topic
Topic:my-replicated-topic   PartitionCount:1    ReplicationFactor:3 Configs:
    Topic: my-replicated-topic  Partition: 0    Leader: 2   Replicas: 2,3,1 Isr: 2,3,1

这是一个解释输出,第一行是所有分区的摘要,每一个线提供一个分区信息,因为我们只有一个分区,所有只有一条线。

"leader":该节点负责所有指定分区的读和写,每个节点的领导都是随机选择的。
"replicas":备份的节点,无论该节点是否是leader或者目前是否还活着,只是显示。
"isr":备份节点的集合,也就是活着的节点集合。
我们运行这个命令,看看一开始我们创建的那个节点:

[root@slave2 kafka_2.11-0.11.0.1]# ./bin/kafka-topics.sh --describe --zookeeper 192.168.152.45:2181 --topic test
Topic:test  PartitionCount:1    ReplicationFactor:1 Configs:
    Topic: test Partition: 0    Leader: 3   Replicas: 3 Isr: 3

没有惊喜,刚才创建的topic(主题)没有Replicas,所以是0。
让我们来发布一些信息在新的topic上:

> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-replicated-topic
 ...
my test message 1
my test message 2
^C

现在,消费这些消息。

> bin/kafka-console-consumer.sh --zookeeper localhost:2181 --from-beginning --topic my-replicated-topic
 ...
my test message 1
my test message 2
^C

我们要测试集群的容错,kill掉leader,Broker1作为当前的leader,也就是kill掉Broker1。

> ps | grep server-1.properties
7564 ttys002    0:15.91 /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin/java... 
> kill -9 7564

备份节点之一成为新的leader,而broker1已经不在同步备份集合里了。

> 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: 1,2,0    Isr: 2,0

但是,消息仍然没丢:

> bin/kafka-console-consumer.sh --zookeeper localhost:2181 --from-beginning --topic my-replicated-topic
...
my test message 1
my test message 2
^C

使用 Kafka Connect 来 导入/导出 数据

从控制台写入和写回数据是一个方便的开始,但你可能想要从其他来源导入或导出数据到其他系统。对于大多数系统,可以使用kafka Connect,而不需要编写自定义集成代码。Kafka Connect是导入和导出数据的一个工具。它是一个可扩展的工具,运行连接器,实现与自定义的逻辑的外部系统交互。在这个快速入门里,我们将看到如何运行Kafka Connect用简单的连接器从文件导入数据到Kafka主题,再从Kafka主题导出数据到文件,首先,我们首先创建一些种子数据用来测试:

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

接下来,我们开始2个连接器运行在独立的模式,这意味着它们运行在一个单一的,本地的,专用的进程。我们提供3个配置文件作为参数。第一个始终是kafka Connect进程,如kafka broker连接和数据库序列化格式,剩下的配置文件每个指定的连接器来创建,这些文件包括一个独特的连接器名称,连接器类来实例化和任何其他配置要求的。

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