Windows下Kafka2.8環境搭建教程

beiqiaosu發表於2023-05-19

前言:

        週末空閒時間無意找到了一套個性化推薦的原始碼,整體專案運用了SSH,HDFS,Flume,Hive,Kafka,Spark,Scala等。執行時,本來透過spark計算業務埋點資料時,卻發現本地沒有Kafka。因為我一直也沒使用過Kafka,所以也作為新人,淺談以下Kafka的環境安裝與分別在PHP,Scala中的使用。

 

對比:

1. 橫向,相比其他中介軟體。

           關於kafka與其他訊息中介軟體的比較,網上很多的博主,不管是從執行原理還是中介軟體架構都有很詳細的介紹。因為我平時用Rabbit居多,在沒有看別人介紹前。Rabbi比Kafka於PHP開發更友好。因為kafka除了PHP的composer依賴包常年不更新外,kafka在windows下的PHP擴充套件需要自己編譯。從這一點上看Rabbit就更適合業務性的訊息佇列,更別說他還有事務等對訊息消費的高保障。kafka在資料增量方面更具優勢,所以多數在大資料和推薦系統中都有運用。

2. 縱向,相比其他版本。

           如標題所見,這裡主要是2.8+與之前版本的對比。因為在2.8以前,kafka安裝前需要安裝zookeeper。這裡只是一小個區別,其他的新特性具體參考kafka官方文件,因為我看到網上關於kafka的安裝文章,別人都會安裝zookeeper,所以這裡就特別說明以下,以及後面啟動時與其他人部落格的不同。

Windows下Kafka2.8環境搭建教程

安裝:

1. 下載

        見上圖。

2. 配置

        下載完後目錄結構如下,進入config, 主要對zookeeper.properties和server.properties進行分佈節點,服務埠,日誌存放目錄等等的設定,前期也是什麼不用管保持預設配置進行啟動。

         Windows下Kafka2.8環境搭建教程

3. 啟動

           也不知道是不是從2.8開始,bin目錄下多了一個windows。所以在windows下啟動進入到改目錄,執行如下命令執行bat檔案。注意啟動的時候先zookeeper後kafka,停止的時候先kafka後zookeeper。

(1). zookeeper啟動

zookeeper-server-start.bat ..\..\config\zookeeper.properties &

Windows下Kafka2.8環境搭建教程

(2).kafka啟動

kafka-server-start.bat ..\..\config\server.properties &

Windows下Kafka2.8環境搭建教程

(3). 其他命令

檢視所有topics
kafka-topics.bat --list --zookeeper localhost:2181
新增topics 
kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

 

Kafka儲存機制:

  • topic中partition儲存分佈

  • partiton中檔案儲存方式

  • partiton中segment檔案儲存結構

  • 在partition中透過offset查詢message

 

圖形化工具:

        前期可以藉助圖形化工具快速具象的檢視kafka的訊息資料,也能便於理解其基本操作流程。以下推薦一塊桌面端工具——offsetexplorer,可以在網上搜尋下載,當然web控制檯也不錯,比如kafka manager。

1. kafka連線

Windows下Kafka2.8環境搭建教程

Windows下Kafka2.8環境搭建教程

(2). Cluster name檢視

        這個值如果沒有設定的情況是生成的,可以在啟動日誌中檢視,根目錄/logs/server.log

Windows下Kafka2.8環境搭建教程

(3). Topics檢視

         透過執行一下新增topics或新增訊息後就可以在Offset Explorer檢視了,更多的使用方法也可以在網上找到。

Windows下Kafka2.8環境搭建教程

Windows下Kafka2.8環境搭建教程

 

PHP操作:

1. 下載依賴

composer require nmred/kafka-php

2.  生產者 Producer.php

<?php
 
require './vendor/autoload.php';
 
date_default_timezone_set('PRC');
 
/* 建立一個配置例項 */
$config = \Kafka\ProducerConfig::getInstance();
 
/* Topic的元資訊重新整理的間隔 */
$config->setMetadataRefreshIntervalMs(10000);
 
/* 設定broker的地址 */
$config->setMetadataBrokerList('127.0.0.1:9092');
 
/* 設定broker的代理版本 */
$config->setBrokerVersion('1.0.0');
 
/* 只需要leader確認訊息 */
$config->setRequiredAck(1);
 
/* 選擇非同步 */
$config->setIsAsyn(false);
 
/* 每500毫秒傳送訊息 */
$config->setProduceInterval(500);
 
/* 建立一個生產者例項 */
$producer = new \Kafka\Producer();
 
for($i = 0; $i < 100; $i++ ) {
    $producer->send([
        [
            'topic' => 'test', 
            'value' => 'test'.$i, 
        ],
    ]);
}

3. 消費者 Consumer.php

<?php
 
require './vendor/autoload.php';
 
date_default_timezone_set('PRC');
 
$config = \Kafka\ConsumerConfig::getInstance();
$config->setMetadataRefreshIntervalMs(10000);
$config->setMetadataBrokerList('127.0.0.1:9092');
$config->setGroupId('test');
$config->setBrokerVersion('1.0.0');
$config->setTopics(['test']);
 
$consumer = new \Kafka\Consumer();
$consumer->start(function($topic, $part, $message) {
    var_dump($message);
});

 

Scala操作:

1.  建立基於Maven的Scala專案

(1). 建立

Windows下Kafka2.8環境搭建教程

(2). 新增模板(沒有模板的前提)

可以網上搜尋Scala-archetype-simple的位置並填寫。

Windows下Kafka2.8環境搭建教程

(3). 完成建立等待IDE自動構建

Windows下Kafka2.8環境搭建教程

Windows下Kafka2.8環境搭建教程

(4). 給專案新增Scala SDK依賴

Windows下Kafka2.8環境搭建教程

Windows下Kafka2.8環境搭建教程

Windows下Kafka2.8環境搭建教程

2. 配置

(1). 修改pom.xml的scala版本為本地安裝scala對應的號。

(2). Cannot resolve plugin org.scala-tools:maven-scala-plugin: unknown解決方法

新增一下依賴後再Maven重新整理 
<dependency>
      <groupId>org.scala-tools</groupId>
      <artifactId>maven-scala-plugin</artifactId>
      <version>2.11</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-eclipse-plugin</artifactId>
      <version>2.5.1</version>
    </dependency>

 

3. 新增kafka依賴
<!--kafka--><dependency>
  <groupId>org.apache.kafka</groupId>
  <artifactId>kafka_2.11</artifactId>
  <version>1.1.0</version></dependency><dependency>
  <groupId>org.apache.kafka</groupId>
  <artifactId>kafka-clients</artifactId>
  <version>1.1.0</version></dependency>

Windows下Kafka2.8環境搭建教程

4. 建立消費者

package com.xudongimport java.util.Propertiesimport org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord, RecordMetadata}object KafkaProducerDemo {
  def main(args: Array[String]): Unit = {    val prop = new Properties    // 指定請求的kafka叢集列表
    prop.put("bootstrap.servers", "127.0.0.1:9092")
    prop.put("acks", "all")    // 請求失敗重試次數
    //prop.put("retries", "3")
    // 指定key的序列化方式, key是用於存放資料對應的offset
    prop.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")    // 指定value的序列化方式
    prop.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")    // 配置超時時間
    prop.put("request.timeout.ms", "60000")    val producer = new KafkaProducer[String, String](prop)    // 傳送給kafka
    for (i <- 1 to 25) {      val msg = s"${i}: this is a linys ${i} kafka data"
      println("send -->" + msg)      val rmd: RecordMetadata = producer.send(new ProducerRecord[String, String]("ceshi", msg)).get()
      println(rmd.toString)
      Thread.sleep(500)
    }
    producer.close()
  }
}

Windows下Kafka2.8環境搭建教程

5. 建立消費者

package com.xudongimport java.util.{Collections, Properties}import org.apache.kafka.clients.consumer.{ConsumerRecords, KafkaConsumer}object KafkaConsumerDemo {
  def main(args: Array[String]): Unit = {    val prop = new Properties
    prop.put("bootstrap.servers", "127.0.0.1:9092")
    prop.put("group.id", "group01")
    prop.put("auto.offset.reset", "earliest")
    prop.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
    prop.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
    prop.put("enable.auto.commit", "true")
    prop.put("session.timeout.ms", "30000")    val kafkaConsumer = new KafkaConsumer[String, String](prop)
    kafkaConsumer.subscribe(Collections.singletonList("ceshi"))    // 開始消費資料
    while (true) {      val msgs: ConsumerRecords[String, String] = kafkaConsumer.poll(2000)      // println(msgs.count())
      val it = msgs.iterator()      while (it.hasNext) {        val msg = it.next()
        println(s"partition: ${msg.partition()}, offset: ${msg.offset()}, key: ${msg.key()}, value: ${msg.value()}")
      }
    }
  }
}

Windows下Kafka2.8環境搭建教程



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70029959/viewspace-2953358/,如需轉載,請註明出處,否則將追究法律責任。

相關文章