kafka

目錄

一、介紹

二、kafka環境搭建(win)

三、測試Demo


  以下內容只是簡單介紹和入門的Demo,如果有比較想深入理解kafka的同學可以看官網;像英語水平和我差不多的同學可以看這裏

一、介紹

Kafka是由Apache軟件基金會開發的一個開源流處理平臺,由ScalaJava編寫。Kafka是一種高吞吐量的分佈式發佈訂閱消息系統,它可以處理消費者在網站中的所有動作流數據。 這種動作(網頁瀏覽,搜索和其他用戶的行動)是在現代網絡上的許多社會功能的一個關鍵因素。 這些數據通常是由於吞吐量的要求而通過處理日誌和日誌聚合來解決。 對於像Hadoop一樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka的目的是通過Hadoop的並行加載機制來統一線上和離線的消息處理,也是爲了通過集羣來提供實時的消息。

                                                                                                                                                                    ——百度百科

以下內容摘抄自官網(https://kafka.apache.org/intro)的介紹:

Apache Kafka® is a distributed streaming platform. What exactly does that mean?

A streaming platform has three key capabilities:

  • Publish and subscribe to streams of records, similar to a message queue or enterprise messaging system.

  • Store streams of records in a fault-tolerant durable way.

  • Process streams of records as they occur.

Kafka is generally used for two broad classes of applications:

  • Building real-time streaming data pipelines that reliably get data between systems or applications

  • Building real-time streaming applications that transform or react to the streams of data

To understand how Kafka does these things, let's dive in and explore Kafka's capabilities from the bottom up.

First a few concepts:

  • Kafka is run as a cluster on one or more servers that can span multiple datacenters.

  • The Kafka cluster stores streams of records in categories called topics.

  • Each record consists of a key, a value, and a timestamp.

Kafka has four core APIs:

  • The Producer API allows an application to publish a stream of records to one or more Kafka topics.

  • The Consumer API allows an application to subscribe to one or more topics and process the stream of records produced to them.

  • The Streams API allows an application to act as a stream processor, consuming an input stream from one or more topics and producing an output stream to one or more output topics, effectively transforming the input streams to output streams.

  • The Connector API allows building and running reusable producers or consumers that connect Kafka topics to existing applications or data systems. For example, a connector to a relational database might capture every change to a table.                              

 

二、kafka環境搭建(win)

內容摘抄自:https://www.cnblogs.com/zhangkaimin/p/10947553.html

1) 安裝包:Java SE Development Kit 9.0.1

下載地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html

 

2) 配置環境:(與之前版本設置有差異)

3) 打開Dos界面,運行java:

4) 運行javac:

 

5) 配置完成。

 

Zookeeper:

1) 建議下載穩定版。

下載地址:http://mirrors.hust.edu.cn/apache/zookeeper/

 

2) 下載後解壓到一個目錄:eg: D:\Java\Tool\zookeeper-3.4.10

3) 在zookeeper-3.4.10目錄下,新建文件夾,並命名(eg: data).(路徑爲:D:\Java\Tool\zookeeper-3.4.10\conf\data)

4) 進入Zookeeper設置目錄,eg: D:\Java\Tool\zookeeper-3.4.10\conf

複製“zoo_sample.cfg”副本à並將副本重命名爲“zoo.cfg”

在任意文本編輯器(eg:記事本)中打開zoo.cfg

找到並編輯dataDir=D:\Java\Tool\zookeeper-3.4.10\data

5) 添加系統環境變量:

在系統變量中添加ZOOKEEPER_HOME = D:\Java\Tool\zookeeper-3.4.10

編輯path系統變量,添加爲路徑%ZOOKEEPER_HOME%\bin

6) 在zoo.cfg文件中修改默認的Zookeeper端口(默認端口2181)

7) Dos下運行:zkserver

8) 搭建成功。

Kafka:

1) 安裝包:kafka_2.12-1.0.0.tgz

下載地址:http://kafka.apache.org/downloads.html

推薦版本:kafka_2.12-1.0.0.tgz

 

2) 下載後解壓縮。eg: D:\Tools\kafka_2.11-1.0.0\

3) 建立一個空文件夾 logs. eg: D:\Tools\kafka_2.11-1.0.0\logs

4) 進入config目錄,編輯 server.properties文件(eg: 用“寫字板”打開)。

找到並編輯log.dirs= D:\Tools\kafka_2.11-1.0.0\logs

找到並編輯zookeeper.connect=localhost:2181。表示本地運行。

(Kafka會按照默認,在9092端口上運行,並連接zookeeper的默認端口:2181)

 

運行:請確保在啓動Kafka服務器前,Zookeeper實例已經準備好並開始運行。(就是開着Zookeeper窗口不要關)

1) 在 D:\WorkSoftware\kafka_2.11-1.0.0下,按住shift+鼠標右鍵。

選擇“在此處打開Powershell窗口(S)”(如果沒有此選項,在此處打開命令窗口)。

2) 運行:.\bin\windows\kafka-server-start.bat .\config\server.properties

3) 可能會報錯:“找不到或無法加載主類 Files\java\jdk-9.0.1\lib;C:\Program”

 

4) 解決(3)的辦法:

在kafka安裝目錄中找到bin\windows目錄中的kafka-run-class.bat爲%CLASSPATH%加上雙引號(可用Matlab打開,並進行搜索)

修改前:setCOMMAND=%JAVA%%KAFKA_HEAP_OPTS% %KAFKA_JVM_PERFORMANCE_OPTS% %KAFKA_JMX_OPTS%%KAFKA_LOG4J_OPTS% -cp%CLASSPATH% %KAFKA_OPTS% %*

修改後:SetCOMMAND=%JAVA%%KAFKA_HEAP_OPTS% %KAFKA_JVM_PERFORMANCE_OPTS% %KAFKA_JMX_OPTS%%KAFKA_LOG4J_OPTS% -cp"%CLASSPATH%"%KAFKA_OPTS% %*

 

5) 再次運行:.\bin\windows\kafka-server-start.bat.\config\server.properties

 

6) 搭建成功。

三、測試

以下內容摘抄自(https://blog.csdn.net/qq_38417913/article/details/82108486

1.pom引入jar包

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka_2.12</artifactId>
    <version>1.1.1</version>
</dependency>

2.創建生產者

public class KProducer {
​
   public static void main(String[] args) throws InterruptedException {
      Properties props = new Properties();
      //kafka服務器地址
      props.put("bootstrap.servers", "localhost:9092");
      //ack是判斷請求是否爲完整的條件(即判斷是否成功發送)。all將會阻塞消息,這種設置性能最低,但是最可靠。
      props.put("acks", "1");
      //retries,如果請求失敗,生產者會自動重試,我們指定是0次,如果啓用重試,則會有重複消息的可能性。
      props.put("retries", 0);
      //producer緩存每個分區未發送消息,緩存的大小是通過batch.size()配置設定的。值較大的話將會產生更大的批。並需要更多的內存(因爲每個“活躍”的分區都有一個緩衝區)
      props.put("batch.size", 16384);
      //默認緩衝區可立即發送,即便緩衝區空間沒有滿;但是,如果你想減少請求的數量,可以設置linger.ms大於0.這將指示生產者發送請求之前等待一段時間
      //希望更多的消息補填到未滿的批中。這類似於tcp的算法,例如上面的代碼段,可能100條消息在一個請求發送,因爲我們設置了linger時間爲1ms,然後,如果我們
      //沒有填滿緩衝區,這個設置將增加1ms的延遲請求以等待更多的消息。需要注意的是,在高負載下,相近的時間一般也會組成批,即使是linger.ms=0。
      //不處於高負載的情況下,如果設置比0大,以少量的延遲代價換取更少的,更有效的請求。
      props.put("linger.ms", 1);
      //buffer.memory控制生產者可用的緩存總量,如果消息發送速度比其傳輸到服務器的快,將會耗盡這個緩存空間。當緩存空間耗盡,其他發送調用將被阻塞,阻塞時間的閾值
      //通過max.block.ms設定,之後他將拋出一個TimeoutExecption。
      props.put("buffer.memory", 33554432);
      //key.serializer和value.serializer示例:將用戶提供的key和value對象ProducerRecord轉換成字節,你可以使用附帶的ByteArraySerizlizaer或StringSerializer處理簡單的byte和String類型.
      props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
      props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
      //設置kafka的分區數量
      props.put("kafka.partitions", 12);
​
      Producer<String, String> producer = new KafkaProducer<>(props);
      for (int i = 0; i < 50; i++) {
         System.out.println("key-->key" + i + "  value-->vvv" + i);
         producer.send(new ProducerRecord<String, String>("my-topic", "key" + i, "vvv" + i));
         Thread.sleep(1000);
      }
​
      producer.close();
   }
}
3.創建消費者
public class KConsumer {
​
   public KafkaConsumer<String, String> getConsmer() {
      Properties props = new Properties();
      //設置kafka服務器
//    props.put("bootstrap.servers", "192.168.4.40:9092");
      props.put("bootstrap.servers", "localhost:9092");
      //消費者羣組ID,發佈-訂閱模式,即如果一個生產者,多個消費者都要消費,那麼需要定義自己的羣組,同一個羣組內的消費者只有一個能消費到消息
      props.put("group.id", "test");
      //true,消費者的偏移量將在後臺定期提交;false關閉自動提交位移,在消息被完整處理之後再手動提交位移
      props.put("enable.auto.commit", "true");
      //如何設置爲自動提交(enable.auto.commit=true),這裏設置自動提交週期
      props.put("auto.commit.interval.ms", "1000");
      //session.timeout.ms:在使用kafka的組管理時,用於檢測消費者故障的超時
      props.put("session.timeout.ms", "30000");
      //key.serializer和value.serializer示例:將用戶提供的key和value對象ProducerRecord轉換成字節,你可以使用附帶的ByteArraySerizlizaer或StringSerializer處理簡單的byte和String類型.
      props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
      props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
      KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
      return consumer;
   }
​
​
   public static void main(String[] args) {
​
        // 用法一
        ConsumerProperties consumerProperties = new ConsumerProperties("my-topic");
        consumerProperties.setServers("localhost:9092");
        TopicConsumer.receive(consumerProperties,(k) -> {
            System.out.println(k);
        });
        
/*      // 用法二 
      KConsumer kconsumer = new KConsumer();
      KafkaConsumer<String, String> consumer = kconsumer.getConsmer();
*/
​
      // 指定消費者消費的topic  多個topic用,分隔
   /* consumer.subscribe(Arrays.asList("my-topic"));
        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(100);
            for (ConsumerRecord<String, String> record : records)
                System.out.println("offset =  " + record.offset() + ", key = " + record.key() + ", value = " + record.value());
        }*/
​
​
   /*     // 取出所有(包括歷史)topic 以及 topic 對應的分區信息
        Map<String, List<PartitionInfo>> topics = consumer.listTopics();
        topics.keySet().forEach(k -> {
            System.out.println("topic : "+k+" "+topics.get(k));
        });*/
​
​
//    consumer.close();
​
   }
 }

 

     

                 {\__/}                                          {\__/}
                 ( ·-·)                                          (·-· )
                 / >------------------------------------------------< \
                          |      ☆                            |
                          |         ☆                         |
                          |  ★                                |
                          |         ☆                         |
                          |      ☆                            |
                          |                                   |
                          -------------------------------------

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章