轉自:http://my.oschina.net/ielts0909/blog/95440
如果你要利用程式碼來跑kafka的應用,那你最好先把官網給出的example先在單機環境和分散式環境下跑通,然後再逐步將原有的consumer、producer和broker替換成自己寫的程式碼。所以在閱讀這篇文章前你需要具備以下前提:
1. 簡單瞭解kafka功能,理解kafka的分散式原理
2. 能在分散式環境下成功執行—topic test。
如果你還沒有完成上述兩個前提,請先看:
kafka分散式初步 kafka搭建分散式環境
接下來我們就簡單介紹下kafka開發環境的搭建。
1. 搭建scala環境,這裡有兩種方案,第一直接去scala官網下載SDK,解壓配置環境變數;第二種辦法,你可以不用安裝SDK,直接在專案中引用kafka編譯後下載下來的scala編譯包和編碼包(scala-compiler.jar和scala-library.jar)。我推薦第二種,因為通過kafka編譯下載下來的scala版本和kafka版本都是匹配的(但是有時候可能會跟eclipse的外掛需要的環境衝突,所以最好把第一種也安裝一下,以防萬一),而一般我們用的是java專案來寫,所以直接匯入相關依賴包就可以了,第一種方案有助於我們看原始碼和用scala開發。這些jar的路徑位於kafka-0.7.2-incubating-src\javatest\lib目錄下。
2. 為eclipse安裝scala開發環境。這只是一個外掛,可以在:http://scala-ide.org/中下載安裝或者線上安裝。裝完之後,你就能在eclipse中建立scala的專案了。
我們可以先寫一個hello world試一下,這樣一來,是不是又多了一種語言寫hello world了。
有些人new的時候找不到scala相關的類,那是因為你eclipse的perspective不對,切換到scala的perspective下就可以了。注意new的是object,然後輸入:
1 |
package com.a 2 .kafka.scala.test |
5 |
def main(args : Array[String]) : Unit = { |
6 |
printf( "Hello
Scala!!" ); |
3. 找到編碼需要的依賴包。記住去你linux上經過update的kafka資料夾裡找,不要從直接從官網上下載的檔案裡找。具體路徑是:kafka-0.7.2-incubating-src\javatest\lib 這是你用java開發kafka相關程式用到的最基礎的包,如果你用到了hadoop,只要去相關的資料夾找一下就可以了。然後把這些包加到專案裡即可。
到了這裡,基本的開發環境應該是搭建完了,然後我們要開始寫點兒簡單的程式碼了。我們還是根據之前《分散式環境搭建》中給出的例子。稍微回憶下:
1. 啟動zookeeper server :bin/zookeeper-server-start.sh ../config/zookeeper.properties & (用&是為了能退出命令列)
2. 啟動kafka server: bin/kafka-server-start.sh ../config/server.properties &
3. Kafka為我們提供了一個console來做連通性測試,下面我們先執行producer:bin/kafka-console-producer.sh
--zookeeper 192.168.10.11:2181 --topic test 這是相當於開啟了一個producer的命令列。
4. 接下來執行consumer,新啟一個terminal:bin/kafka-console-consumer.sh --zookeeper 192.168.10.11:2181
--topic test --from-beginning
5. 執行完consumer的命令後,你可以在producer的terminal中輸入資訊,馬上在consumer的terminal中就會出現你輸的資訊。
這個例子就是在分散式的環境下producer生產資料,然後consumer從broker抓取資料顯示在console上。當然注意一點server.properties中的hostname需要換成你的對應地址,具體可以回去看《分散式環境搭建》。現在我們就用程式碼來模擬producer傳送資料的過程:
這裡我們建一個java project就可以了,匯入依賴包。kafka-0.7.2-incubating-src\javatest\lib目錄下的jar.
01 |
package com.a2.test.kafka; |
03 |
import java.util.Properties; |
05 |
import kafka.javaapi.producer.Producer; |
06 |
import kafka.javaapi.producer.ProducerData; |
08 |
import kafka.producer.ProducerConfig; |
10 |
public class Producertest
{ |
11 |
public static void main(String[]
args) { |
12 |
Properties
props = new Properties(); |
13 |
props.put( "zk.connect" , "192.168.10.11:2181" ); |
14 |
props.put( "serializer.class" , "kafka.serializer.StringEncoder" ); |
15 |
ProducerConfig
config = new ProducerConfig(props); |
16 |
Producer<String,
String> producer = new Producer<String,
String>(config); |
17 |
ProducerData<String,
String> data = new ProducerData<String,
String>( "test" , "Hello" ); |
這樣我們就用程式碼代替了console去傳送資訊了,這裡我們用了utils中的properties物件直接構建了配置,而不是直接讀取,當然你也可以讀配置。Data裡的兩個引數,第一個是指定topic,第二個是傳送的內容。
接下來就是執行了,如果你是在windows下,可能會等待很久然後報Unable to connect to zookeeper server within timeout: 6000,這個可能是網路卡的原因,你可以直接放到linux上,然後用命令列執行,注意引包。
1 |
Java
–jar test.jar Dclasspath=/lib |
Consumer的程式碼以及實現和producer差不多,如果你感興趣可以去官網找相關的程式碼,都很簡單。當然還有一部分關於producer和consumer的配置,我們下篇再說。