仅仅是一段代码
Kafka Streams作为集成在Kafka系统中的一个API,在配合Kafka来进行流处理时有着得天独厚的优势。
不同于Spark Streaming和Flink等,使用Kafka Streams不需要单独的集群,只要在代码中调用Kafka Streams的API即可,并且天生可以享受Kafka本身带来的优势:高可扩展性,高容错等。
简单来说,Kafka Streams应用就是一段Java/Scala代码,仅此而已。
这使得Kafka Streams应用像其它Java程序一样,可以通过命令行运行,也可以通过Puppet,Chef等进行部署,又或者通过Docker容器作为微服务运行。
这里,我们展示如何在IntelliJ中编写Kafka Streams程序,与已经存在的Kafka集群连接,并方便地进行扩展。
如何配置Kafka Streams
以WordCount为例,具体代码可以参考Kafka Streams 入门实例1 WordCount。
Kafka Streams应用需要调用Kafka Streams API,并与Kafka集群进行交互。实际的交互操作在内部是通过Consumer API以及Producer API来实现的。
需要配置的两个最重要的参数为:
application.id
这个参数定义了Kafka Streams应用的ID。同时,应用在调用Consumer API来和集群交互时,使用的consumer group id也将与这个值相同。因此,如果中途修改了这个参数的值,consumer group id也将随之变化,并将失去之前从Kafka消费的数据。bootstrap.servers
这个参数即是Kafka集群的位置。
如何扩展Kafka Streams
Kafka Streams的另一个特点就是,作为一段Java/Scala代码,在进行扩展时,代码本身不需要作任何变动。
当我们运行编写好的应用时,可以在运行日志中查看当前的任务,这里以将拥有2个partition的topic作为源topic的WordCount为例:
可以看到当前的任务有0_0和0_1。
此时只有一个WordCount实例在运行。为了增加一个实例,只需要再次点击绿色运行按钮。之后会出现另一个终端窗口。此时再检查两边的日志,会发现第一个中显示的当前任务变为:
而第二个则是:
显然两个任务被重新分配到了这两个不同的实例上。