kafka入门介绍及环境搭建

 

kafka分布式初步:

http://my.oschina.net/ielts0909/blog/92972

kafka分布式环境搭建:

 http://my.oschina.net/ielts0909/blog/93190

 kafka开发环境搭建:

http://blog.csdn.net/blue_jjw/article/details/9293983

问题导读

1.kafka是否需要zookeeper?
2.kafka是什么?
3.kafka包含哪些概念?
4.如何模拟客户端发送、接受消息初步测试?
5.kafka cluster怎么同zookeeper交互的?







1.前言
由于项目涉及到kafka,自己以前没有接触过这方面的,学习了下,将搭建kafka运行环境同大家分享。

2.搭建步骤


第一步,到Apache Kafka官网下载最新的压缩包,比如我下载的就是:
  1. kafka_2.9.2-0.8.1.1.tgz
复制代码

 
 



第二步,解压并启动Zookeeper

  1. tar -xzvf kafka_2.9.2-0.8.1.1.tgz
  2. cd kafka_2.9.2-0.8.1.1
  3. bin/zookeeper-server-start.sh config/zookeeper.properties &
复制代码



说明:
  • 由于kafka用到了zookeeper,所以应该首先启动它。
  • 应该确保已经安装JDK,并设定好JAVA_HOME,CLASSPATH,PATH这些环境变量。否则会提示:

java command not found

1.jpg (408.11 KB, 下载次数: 3)

下载附件  保存到相册

2015-4-30 19:59 上传



查看端口信息:

2.jpg (91.42 KB, 下载次数: 2)

下载附件  保存到相册

2015-4-30 19:59 上传



查看zookeeper.properties配置信息:
  1. # the port at which the clients will connect
  2. clientPort=2181
复制代码


第三步:启动kafka
  1. bin/kafka-server-start.sh config/server.properties
复制代码


我在启动中遇到了下面的2个问题:

Unrecognized VM option '+UseCompressedOops'
原因及解决办法:
kafka用了很多优化运行的jvm参数,而我安装的jdk所带的jvm不一定支持这些参数,比如:
-XX:+UseCompressedOops
所以需要编辑kafka-run-class.sh,将这个选项注释掉:
  1. KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:+UseCompressedOops -XX:+UseParNewGC
  2. -XX:+UseConcMarkSweepGC
  3. -XX:+CMSClassUnloadingEnabled
  4. -XX:+CMSScavengeBeforeRemark
  5. -XX:+DisableExplicitGC -Djava.awt.headless=true"
复制代码



Error occurred during initialization of VM Could not reserve enough space for object heap
原因及解决办法:
查看kafka-server-start.sh配置文件,发现有heap设置信息:
  1. export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
复制代码



我们可以java -X来看看这些参数的意义:

3.jpg (197.66 KB, 下载次数: 3)

下载附件  保存到相册

2015-4-30 19:59 上传


-Xms表示JAVA堆内存的初始化大小,而-Xmx表示最大值。
我在创建虚拟机时,指定的内存大小为256M,很显然不够,因此我尝试改为:
  1. #export KAFKA_HEAP_OPTS="-Xmx100m -Xms200m"
复制代码


但是依然报错,看来这个参数不能调到这么小,最后我将虚拟机内存调到1G,启动成功。


4.jpg (432.01 KB, 下载次数: 2)

下载附件  保存到相册

2015-4-30 19:59 上传


注意输出信息中,端口信息:9092


进程验证:

5.jpg (12.11 KB, 下载次数: 2)

下载附件  保存到相册

2015-4-30 19:59 上传


端口验证:

6.jpg (27.96 KB, 下载次数: 2)

下载附件  保存到相册

2015-4-30 19:59 上传


说明:
Kafka的进程ID为9300,占用端口为9092
QuorumPeerMain为对应的zookeeper实例,进程ID为6379,在2181端口监听

3.一些基本概念

  • kafka是什么?


记住几个关键点,分布式、高吞吐量 的 订阅、发布 消息系统

  • kafka有什么?


producer   消息的生成者,即发布消息
consumer   消息的消费者,即订阅消息
broker     Kafka以集群的方式运行,可以由一个或多个服务组成,服务即broker
zookeeper  协调转发

  • kafka的工作图


7.jpg (21.32 KB, 下载次数: 4)

下载附件  保存到相册

2015-4-30 19:59 上传


producers通过网络将消息发送到Kafka集群,集群向消费者提供消息
kafka对消息进行归纳,即topic,也就是说producer发布topic,consumer订阅topic

下面,我们来一个初步的测试,来加深这些概念的理解。


4.模拟客户端发送、接受消息初步测试


Step 1 : 创建一个topic

8.jpg (29.73 KB, 下载次数: 5)

下载附件  保存到相册

2015-4-30 19:59 上传


命令运行后提示:
Created topic "my_first_topic".

注意,创建topic时需要指明zookeeper的socket(IP+PORT)在哪里,以及topic名称。
(至于partitions,replication-factor这些分区,副本的概念以后再说,暂放)

此时:
zookeeper进程提示:

9.jpg (227.2 KB, 下载次数: 3)

下载附件  保存到相册

2015-4-30 19:59 上传


kafka进程提示:

10.jpg (85.86 KB, 下载次数: 2)

下载附件  保存到相册

2015-4-30 19:59 上传




Step 2 : 查看topic list

11.jpg (26.81 KB, 下载次数: 2)

下载附件  保存到相册

2015-4-30 19:59 上传



Step 3 : 发送、接受消息

下面,我启动2个XSHELL客户端,一个用于生产者发送消息,一个用于消费者接受消息。

XSHELL-A

12.jpg (61.06 KB, 下载次数: 3)

下载附件  保存到相册

2015-4-30 19:59 上传


XSHELL-B

13.jpg (60.38 KB, 下载次数: 4)

下载附件  保存到相册

2015-4-30 19:59 上传


只要我们在XSHELL-A中输入消息回车,那么马上XSHELL-B中就会有消息显示。

注意:
producer,指定的Socket(localhost+9092),说明生产者的消息要发往kafka,也即是broker
consumer, 指定的Socket(localhost+2181),说明消费者的消息来自zookeeper(协调转发)


上面的只是一个单个的broker,下面我们来实验一个多broker的集群。


5.搭建一个多个broker的集群

刚才只是启动了单个broker,现在启动有3个broker组成的集群,这些broker节点
也都是在本机上的

Step 1 : 为每一个broker提供配置文件

我们先看看config/server.properties配置信息:

  1. [root@localhost config]# grep -v '#' server.properties  | sort
  2. broker.id=0
  3. port=9092
  4. num.network.threads=2
  5. num.io.threads=8
  6. socket.send.buffer.bytes=1048576
  7. socket.receive.buffer.bytes=1048576
  8. socket.request.max.bytes=104857600
  9. log.dirs=/tmp/kafka-logs
  10. num.partitions=2
  11. log.retention.hours=168
  12. log.segment.bytes=536870912
  13. log.retention.check.interval.ms=60000
  14. log.cleaner.enable=false
  15. zookeeper.connect=localhost:2181
  16. zookeeper.connection.timeout.ms=1000000
复制代码
说明:
broker.id为集群中唯一的标注一个节点,因为在同一个机器上,所以必须指定不同的
端口和日志文件,避免数据被覆盖。

在上面单个broker的实验中,为什么kafka的端口为9092,这里可以看得很清楚。

注意日志目录:
  1. [root@localhost kafka-logs]# pwd
  2. /tmp/kafka-logs
  3. [root@localhost kafka-logs]# ls -l
  4. total 32
  5. drwxr-xr-x 2 root root 4096 Sep 20 22:58 my_first_topic-0
  6. -rw-r--r-- 1 root root   32 Sep 20 23:54 recovery-point-offset-checkpoint
  7. -rw-r--r-- 1 root root   32 Sep 20 23:54 replication-offset-checkpoint
  8. drwxr-xr-x 2 root root 4096 Sep 20 20:22 test-0
  9. [root@localhost kafka-logs]# tree my_first_topic-0
  10. my_first_topic-0
  11. |-- 00000000000000000000.index
  12. `-- 00000000000000000000.log
  13. 0 directories, 2 files
复制代码
【topic,分区,offset等等这些概念,暂放】


kafka cluster怎么同zookeeper交互的,配置信息中也有体现。

那么下面,我们仿照上面的配置文件,提供2个broker的配置文件:

  1. [root@localhost config]# touch server-1.properties
  2. [root@localhost config]# touch server-2.properties
  3. [root@localhost config]# vi server-1.properties
  4. [root@localhost config]#
  5. [root@localhost config]#
  6. [root@localhost config]# vi server-2.properties
  7. [root@localhost config]#
  8. [root@localhost config]#
  9. [root@localhost config]# cat server-1.properties
  10. broker.id=1
  11. port=9093
  12. log.dir=/tmp/kafka-logs-1
  13. zookeeper.connect=localhost:2181
  14. [root@localhost config]# cat server-2.properties
  15. broker.id=2
  16. port=9094
  17. log.dir=/tmp/kafka-logs-2
  18. zookeeper.connect=localhost:2181
复制代码
Step 2 : 启动所有的broker

由于在上面的实验中,已经启动了zookeeper和一个broker(id=0),那么现在只需要启动
broker(id=1)和broker(id=2)。

命令如下:

  1. bin/kafka-server-start.sh config/server-2.properties &
  2. bin/kafka-server-start.sh config/server-1.properties &
复制代码
会发现,zookeeper进程会有提示信息输出。

进程,端口观察:

14.jpg (135.6 KB, 下载次数: 4)

下载附件  保存到相册

2015-4-30 19:59 上传


一个zookeeper在2181端口上监听,3个kafka cluster(broker)分别在端口
9092,9093,9094监听。



Step 3 : 创建topic
  1. bin/kafka-topics.sh --create --topic topic_1 --partitions 1 --replication-factor 3  \
  2. --zookeeper localhost:2181
  3. bin/kafka-topics.sh --create --topic topic_2 --partitions 1 --replication-factor 3  \
  4. --zookeeper localhost:2181
  5. bin/kafka-topics.sh --create --topic topic_3 --partitions 1 --replication-factor 3  \
  6. --zookeeper localhost:2181
复制代码
查看topic创建情况:

15.jpg (95.55 KB, 下载次数: 2)

下载附件  保存到相册

2015-4-30 19:59 上传


上面的有些东西,也许还不太清楚,暂放,继续试验。需要注意的是topic_1的Leader=1


Step 4 : 模拟客户端发送,接受消息

XSHELL-A
  1. bin/kafka-console-consumer.sh --topic topic_1 --zookeeper localhost:2181 --from-beginning
复制代码
XSHELL-B

  1. bin/kafka-console-producer.sh --topic topic_1 --broker-list localhost:9092,localhost:9093,
  2. localhost:9094
复制代码

需要注意,此时producer将topic发布到了3个broker中,现在分布式的概念就有点了。

在XSHELL-B中发消息,XSHELL-A中就会有消息显示出来。


Step 5 : kill some broker

测试点一:
kill broker(id=0)
首先,我们根据前面的配置,得到broker(id=0)应该在9092监听,这样就能确定它的PID了。

16.jpg (78.22 KB, 下载次数: 2)

下载附件  保存到相册

2015-4-30 19:59 上传




得到broker(id=0)的PID为9300,那么接下来,我们KILL这个broker:

17.jpg (67.75 KB, 下载次数: 2)

下载附件  保存到相册

2015-4-30 19:59 上传


再次观察,topic在kafka cluster中的情况:

18.jpg (126.45 KB, 下载次数: 2)

下载附件  保存到相册

2015-4-30 19:59 上传


需要与broker(id=0)没有被kill前,做下对比。很明显,主要变化在于Isr,以后在分析。

测试下,发送消息,接受消息,是否收到影响。

生产者:

19.jpg (72.22 KB, 下载次数: 2)

下载附件  保存到相册

2015-4-30 19:59 上传


消费者:

20.jpg (69.99 KB, 下载次数: 2)

下载附件  保存到相册

2015-4-30 19:59 上传


结论,并没有收到影响。


测试点二:

kill broker(id=1)

同上可以得到broker(id=1)的PID为21165,同样的kill它,并测试发送,接受消息
是否收到影响。

发送端:

21.jpg (11.1 KB, 下载次数: 2)

下载附件  保存到相册

2015-4-30 19:59 上传



接受端:

22.jpg (10.71 KB, 下载次数: 2)

下载附件  保存到相册

2015-4-30 19:59 上传


可见,kafka的分布式机制,容错能力还是挺好的~





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值