https://kafka.apache.org/documentation.html#quickstart 官方文档
安装配置
【机器3台:
cdh-yhte01-03
】
1、下载kafka_2.9.2-0.8.1.1.tgz(http://mirrors.cnnic.cn/apache/kafka/0.8.1.1/kafka_2.9.2-0.8.1.1.tgz)
2、 解压 tar -zxvf kafka_2.9.2-0.8.1.1.tgz
3、 确认zookeeper已启动
[root@cdh-yhte01 ~]# ps -ef | grep zookeeper
4、修改配置文件 config/server.properties
host.name=cdh-yhte01
log.dirs=/usr/local/kafka/kafka-logs
zookeeper.connect=cdh-yhte01:2181,cdh-yhte02:2181,cdh-yhte03:2181
不配置host.name的话,发送信息时会出现以下错误:
kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.
at kafka.producer.async.DefaultEventHandler.handle(DefaultEventHandler.scala:90)
at kafka.producer.async.ProducerSendThread.tryToHandle(ProducerSendThread.scala:104)
at kafka.producer.async.ProducerSendThread$$anonfun$processEvents$3.apply(ProducerSendThread.scala:87)
at kafka.producer.async.ProducerSendThread$$anonfun$processEvents$3.apply(ProducerSendThread.scala:67)
at scala.collection.immutable.Stream.foreach(Stream.scala:526)
at kafka.producer.async.ProducerSendThread.processEvents(ProducerSendThread.scala:66)
at kafka.producer.async.ProducerSendThread.run(ProducerSendThread.scala:44)
5、启动kafka
bin/kafka-server-start.sh config/server.properties &
6、部署到其他机器
[
root@cdh-yhte01 local]# tar -zcvf kafka.tar.gz kafka
[
root@cdh-yhte01 local]# scp kafka.tar.gz cdh-yhte02:/usr/local
解压后按如下步骤操作:
修改配置文件 config/server.properties
【cdh-yhte02】
broker.id=2
port=9092
//端口可以不修改,只有配置在一台机器的时候需要修改
host.name=cdh-yhte02
【cdh-yhte03】
broker.id=3
port=9093
host.name=cdh-yhte03
7、启动02、03机器上的kafka
bin/kafka-server-start.sh config/server.properties &
创建一个主题
[
root@cdh-yhte01 bin]# ./kafka-topics.sh --create --zookeeper cdh-yhte01:2181 --replication-factor 1 --partitions 2 --topic TestKafa
Created topic "TestKafa".
[
root@cdh-yhte01 bin]#
(
创建主题后,在另外两台机器上都能看到,why?)
[
root@cdh-yhte02 bin]# ./zookeeper-shell.sh cdh-yhte02:2181
Connecting to cdh-yhte02:2181
Welcome to ZooKeeper!
JLine support is disabled
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
ls /
[hbase, zookeeper, admin, consumers, config, controller, brokers, controller_epoch]
ls /brokers/topics
[TestKafa]
[
root@cdh-yhte03 bin]# ./zookeeper-shell.sh cdh-yhte03:2181
Connecting to cdh-yhte03:2181
Welcome to ZooKeeper!
JLine support is disabled
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
ls /brokers/topics
[TestKafa]
查看一个主题
[
root@cdh-yhte01 bin]# ./kafka-topics.sh --list --zookeeper cdh-yhte01:2181
TestKafa
[
root@cdh-yhte01 bin]#
查看详细信息
[
root@cdh-yhte01 bin]# ./kafka-topics.sh --describe --zookeeper cdh-yhte01:2181
Topic:GCSJ PartitionCount:3 ReplicationFactor:3 Configs:
Topic: GCSJ Partition: 0 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
Topic: GCSJ Partition: 1 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1
Topic: GCSJ Partition: 2 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2
[
root@cdh-yhte01 bin]#
- leader:负责处理消息的读和写,leader是从所有节点中随机选择的.
- replicas:列出了所有的副本节点,不管节点是否在服务中.
- isr:是正在服务中的节点.
删除一个主题
[
root@cdh-yhte01 bin]# ./kafka-topics.sh --list --zookeeper cdh-yhte01:2181
TestKafa
[
root@cdh-yhte01
bin]# ./kafka-run-class.sh kafka.admin.DeleteTopicCommand --topic TestKafa --zookeeper cdh-yhte01:2181
deletion succeeded!
root@node01:/usr/local/bigdata/kafka_2.11-0.10.0.0/bin# ./kafka-topics.sh --zookeeper node01:2181 --delete --topic CHENLEI
Topic CHENLEI is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.
root@node01:/usr/local/bigdata/kafka_2.11-0.10.0.0/bin# ./kafka-topics.sh --zookeeper node01:2181 --delete --topic CHENLEI
Topic CHENLEI is already marked for deletion.
验证是否删除
[
root@cdh-yhte01 bin]# ./zookeeper-shell.sh cdh-yhte01:2181
Connecting to cdh-yhte01:2181
Welcome to ZooKeeper!
JLine support is disabled
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
ls /
[hbase, zookeeper, admin, consumers, config, controller, brokers, controller_epoch]
ls /brokers
[topics, ids]
ls /brokers/topics
[]
向主题写入数据
./kafka-console-producer.sh --broker-list cdh-yhte01:9091 --sync --topic TestKafa
从主题取出数据
./kafka-console-consumer.sh --zookeeper node01:2181 --topic CHENLEI --from-beginning
查看消费者位置:
bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zkconnect
cdh-yhte01:2181 --group
group1
[
root@cdh-yhte02 bin]# ./kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zkconnect cdh-yhte01:2181 --group group1
Group Topic Pid Offset logSize Lag Owner
group1 YHTE02 0 41 44 3 none
[
root@cdh-yhte02 bin]# ./kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zkconnect cdh-yhte01:2181 --group group1
Group Topic Pid Offset logSize Lag Owner
group1 YHTE02 0 44 44 0 group1_leichen-1413446167433-a9b95fe0-0
auto.offset.reset:如果zookeeper没有offset值或offset值超出范围。
那么就给个初始的offset。有smallest、largest、anything可选,
分别表示给当前最小的offset、当前最大的offset、抛异常。默认largest
1、数据流将被划分成独立的部分(partitions)。这个语义是将划分的过程留给了producer,producer来指定一个消息属于哪个部分。在一个partition中,消息是按照接受顺序排序的,并且会以相同的顺序发送给consumer。这意味着我们需要记录 每一部分(consumer、topic、and partition)的“high water mark”。
2、在kafka中,high-water mark 以“offset”的形式记录,这对于各方面来说将变的非常清晰。
在kafka中,consumer将保持记录已经处理的消息状态(offset),consumer会将这些记录信息写到zookeeper中,但是如果把这些信息存储到consumer正在写入数据的数据库会更好,例如:consumer可能会简单将一些统计信息写到OLTP数据库。这样 consumer可以把状态信息写到正在进行事务操作的数据库,这样解决了分布式一致性问题。
很多应用场景下,可以讲consumer存储的状态信息(offset)同步到别的地方(如搜索系统的索引字段里,HDFS中),这样,如果consumer挂了,还能从上次处理的记录的offset继续,避免重复处理。
另外,这种机制还可以这样用,直接从头开始处理,虽然会有出发处理,但是有些场景确实需要这样做。例如:发现处理过程有BUG,等BUG修复了可以从头开始处理。