好了,那么该如何开始学习Apache Kafka呢?一言以蔽之:因人而异!这取决于你的职业特色。学习Kafka可能有不少种方式,稍后我会详细向你介绍,不过这些方法都有相通的部分,因此让咱们先从这些地方开始吧:
第一步就是要下载Kafka。Confluent提供了免费的
Confluent下载(
译者:Confluent.io是Kafka团队独立出来成立的一个创业公司,该公司开发的Confluent是一个基于kafka的流式处理平台,提供了一些社区版Kafka没有的功能)。Confluent不只拥有Apache Kafka提供的全部功能,同时还提供了一些额外的开源插件(好比REST proxy,超多种类的Connector和一个schema registry)
Kafka的安装主要就是解压下载的.tar.gz文件。固然你也能够经过RPM或DEB文件的方式进行安装,教程在
这里。
Apache Kafka是一个流式数据处理平台,其本质就是一个发布/订阅模式的消息队列,所以在安装以后你能够尝试建立一些话题(topic),而后往话题中生产一些消息,以后再订阅这些话题进行消费。最好的方式就是参照
quick start文档——注意,从第二步开始作就行了,第一步的下载咱们已经完成了:)
恭喜你! 你已经成功地对Kafka进行了消息的发布与订阅。不过在继续以前,我建议你花一些时间去读一下Kafka的
设计文档——这会极大地帮助你理解不少Kafka的术语与核心概念。
okay,你已经能够简单地往kafka发送和消费消息了,不过真实系统中咱们可不会这样用。首先,在quick start中咱们只配置了一个Kafka服务器(Kafka broker)——生产环境中咱们至少要配置3台以实现高可用;其次,教程中使用了命令行工具进行消息的发布与订阅。而实际线上环境一般都要求在业务系统中来作或者是使用connector实现与外部系统的集成。
下面咱们就根据每一个人的实际状况具体给出学习Kafka的路线图。
~~~我是软件工程师~~~
软件工程师一般都有一门熟练掌握的编程语言,所以做为软件工程师的你第一步就要根据你掌握的编程语言寻找对应的Kafka客户端。Apache Kafka支持的客户端列表
在此,赶忙去找一下吧。
挑选合适本身的客户端自己就是一门技术活,有不少注意事项。不过我推荐你们使用这两种客户端:Java客户端和
libkafka。这两个客户端支持绝大多数的Kafka协议,也更加的标准化,同时有很好的性能以及可靠性(毕竟通过了大量的测试)。可是,不管你选择了上述列表中的哪一个客户端,咱们都推荐你要确认它至少是有活跃社区维护的——Kafka版本迭代速度很快,客户端版本更新太慢会致使不少新功能没法使用的。如何判断客户端更新速度呢? 答案就是查看对应的github上面的commit数和issue数,它们一般均可以帮助识别是否有活跃社区在维护它(
译者:KafkaOffsetsMonitor更新速度就很慢,彷佛到目前为止还不支持对于Kafka保存offset的监控)
一旦肯定了要使用的客户端,立刻去它的官网上学习一下代码示例(好吧,若是都没有样例,你要从新思考一下它是否合适了?)——确认你可以正确编译和运行这些样例,这样你就有把握可以驾驭该客户端了。下一步你能够稍微修改一下样例代码尝试去理解并使用其余的API,而后观察结果。
这些都作完以后你能够本身编写一个小项目来进行验证了。第一个项目一般都是一个生产者程序(下称producer),好比它负责发送/生产一些整数到一个话题的某个分区(partition)中,而后再写一个消费者程序(下称consumer)来获取这些整数。做为你的第一个项目,它教会了你大多数Kafka API的使用,你必定会印象深入的。另外客户端的文档一般都是十分齐全的,但若是你仍有疑问而无处解答,那么给
邮件组或
StackOverflow发问题吧,会有大神回答你的(
译者:作个广告,我在StackOverflow的名字是amethystic,一般都会看到你的问题的)。
作完了这些,下面就是要提高客户端的可靠性与性能了。再去复习一遍Kafka的文档吧,确保你真的理解了不一样客户端之间那些影响可靠性和性能的参数,而后去作一些实验来巩固你的理解。举个例子,给producer配置acks=0, 重启服务器而后去看看吞吐率有什么变化? 而后再试试acks=1。另外注意一下在重启的过程当中是否出现消息丢失?你是否能说清楚为何(不)会丢失吗?若是acks=-1的话还会有消息丢失吗?这些配置下的性能都是怎么样的?若是你增长batch.size和linger.ms会发生什么? Kafka提供了不少的参数,若是你以为目不暇接,那么先从“高重要度”(high importance)的那些开始学起吧。
学完了client及其API的使用,也尝试了一些配置修改和样例运行,下面你就能够真正地开始进行Kafka应用的开发了。
若是你使用Java,只须要继续学习高级流式处理API就能够了。这些API不只生产/消费消息,还可以执行更为高级的流式处理操做(好比时间窗口聚合以及流链接stream joining等)。文档在
这里,例子在
这里,不用客气 :-)
~~~我是系统管理员/运维工程师~~~
和开发工程师不一样,你的目标是学习如何管理Kafka线上生产环境。所以,从一开始你就须要一个真实的Kafka集群环境,即3节点集群(推荐的线上生产环境配置)。
若是不知道怎么搭建请参考上面quick start中提到的第6步:
安装多节点集群。你也可使用
Docker来直接配置出多节点Kafka集群(
译者:这是Confluent本身制做的镜像,不是目前STAR数最多的那个)。这些镜像都是咱们在生产环境中用到的,因此请放心地做为基础镜像来使用~~
有了这个环境,你可使用quick-start中提到的
bin/kafka-topics.sh脚本建立多个分区多个副本(replica)的topic了,去试试吧。
俗话说的好,作好监控生产环境的部署就成功了一半,因此我推荐你及时地作好对于Kafka的监控。Kafka默认提供了超多的JMX监控指标。咱们能够用不少种方式对其进行收集,可是你必定要保证Kafka启动时配置了JMX_PORT环境变量(
译者:最简单地方式就是修改bin/kafka-server-start.sh脚本)! 不知道你习惯使用什么监控工具,反正我是用
JMXTrans和
Graphite进行收集和监控的。若是你也使用Graphite,别客气,
个人配置你就拿去用吧:) (
译者: 我一直使用JConsole来进行监控,其实也挺好的) 总之使用你习惯的工具就好,另外
这里列出了一些经常使用的监控指标,给你作个参考吧~
做为系统运维管理员,下一步你要观察在必定负载状况下你的Kafka的集群表现。Apache Kafka提供了不少命令行工具用于模拟运行负载:
bin/kafka-producer-perf-test和
bin/kafka-consumer-perf-test。去学习一下这些工具的使用方法吧,在你的系统中模拟一些负载出来而后观察刚才提到的监控指标。好比producer/consumer可以达到的最大吞吐量是多少? 你是否可以找到整个集群的瓶颈所在?
哦,对了,Kafka的日志也不容忽视。默认状况下它们保存在logs/或/var/log下——取决于你的设置了。你须要仔细地查看server.log,保证没有重大的错误。若是不理解出现错误的含义,发信给邮件组或StackOverflow吧。
咱们刚刚所作的都是正常的Kafka操做,去搞些异常出来吧! 好比停掉集群中的一台服务器,而后去查看监控指标——你应该能够发现leader数会降低而后恢复,leader选举数攀升而under-replicated分区数也增长了(
译者:under-replicated分区指备份不充分的分区,好比正常状况下我设置该分区有3个副本,但实际中只有2个副本,那么此时该分区就是备份不充分的)。你也能够去查看服务器日志(包括你停掉的那台)——日志应该标明了有新的leader选举发生。
我推荐你在调优producer/consumer性能的时候尝试不断地关闭/启动服务器,甚至直接kill -9也行,而后查看日志和监控指标,搞明白这其中到底发生了什么以及系统是怎么恢复整个过程的。
做为系统管理员的最后一个重要的事情就是学习Kafka的管理工具,好比:
- kafka-topics.sh:修改分区数,副本数以及分配新的分区和副本到指定broker上
- kafka-topics.sh:删除topic
- kafka-config.sh:修改topic配置,好比topic日志留存时间
- kafka-consumer-groups.sh:开发人员一般都要求运维人员帮忙查看consumer消费状况(是否滞后太多),那么使用这个脚本去查看consumer group的消费状况
- kafka-reassign-partitions.sh:从新在各个服务器之间分配分区和副本
- 若是安装的是Confluent Kafka,你可使用Confluent Rebalancer去检查每一个服务器上的负载状况并自动地进行分区再平衡
~~~我是ETL工程师/数据仓库工程师~~~html

做为一个ETL或数仓工程师,你更在乎数据如何在Kafka与外部系统间进行可靠地传输,而且尽可能不修改模式信息。不用担忧,Kafka提供了Kafka Connect组件用于企业级的数据管理。除此以外,你还能够学习Confluent提供的模式 注册中心的功能。
Kafka Connect是Kafka自己就提供的功能,不须要安装Confluent也能使用。学习Kafka Connect的第一步就是在一个单机环境或分布式环境中运行Connector而且在多个文件的内容导入到Kafka中——具体步骤参见文档中的
第7步。
听上去还挺有意思吧,可是导入文件内容其实也没什么大不了的,咱们要操做真实的数据存储设备。
Schema Registry会假定数据不是文本或JSON格式,而是Avro文件且包含了模式信息。当producer向Kafka发送消息时,数据模式保存在registry中,然后者会对模式进行验证。Consumer使用registry中保存的模式来与不一样版本的数据进行交互,从而实现版本兼容性。这样用户很方便识别数据与topic的对应关系。
若是你不想安装Schema Registry也没有问题。Kafka默认提供了大多数的Connector实现,可是你要确保在使用Connector时设置转换器来把数据转成JSON格式,方法以下:
key.converter=org.apache.kafka.connect.json.JsonConverter value.converter=org.apache.kafka.connect.json.JsonConverter
假设你要导出MySQL数据到ElasticSearch中。Confluent安装包中提供了JDBC Connector以及一个ElasticSearch Connector,你能够直接使用它们,固然也能够从github中编译构建。具体使用方法请参考
JDBC Source和
ElasticSearch Sink。
~~~~~~~~~~~~
好了,大部分我认为值得翻译的都在这里了,后面那些关于各类博客和峰会宣传的就不详细列出了。总之,我但愿本译文可以对那些想要学习Kafka的人有所帮助~ 2017年,咱们再战Kafka!