前言花絮
今天聽了kafka開發成員之一的饒軍老師的講座,講述了kafka的前生今世。干貨的東西倒是沒那么容易整理出來,還得刷一遍視頻整理,不過兩個比較八卦的問題,倒是很容易記住了。
Q:為什么kafka使用了Scala進行開發?
A:因為當年主R正在學習Scala,所以就用Scala開發了。並且這是他的第一個Scala項目。也正是因為他也在學習階段,所以寫出來的代碼都是按照Java的寫法實現的,這也是為什么Java開發者也能很容易讀懂源碼的原因。
Q:為什么kafka叫kafka?
A:因為主R在開發kafka的時候正在看卡夫卡的《變形記》,所以沒有多想就用了kafka這個名字。同時,因為kafka實際上是以日志的形式記錄消息的,屬於一個書寫者,所以用一位作家的名字命名也是很契合的。
思考:大佬們開發東西真隨意。
先來說下kafka是個什么東西,它是一個消息中間件框架,只負責發布--訂閱(幫忙存東西的)
接着給大家看一張大致的kafka流程圖
首先打個比方,kafka好比就是中央電視台,而中央電視台下面有很多節目,生產者就是制作節目的團隊,而消費者就是我們觀看這個節目的人,一開始在zookeeper創建一個節目,假設就叫cctv1,有了這個節目名后,我們就得請一個團隊來填充這個節目,比如拉廣告啊,放電視劇之類的數據,而我們消費者要觀看這個節目的話就得需要zookeeper來授權給我們。中央電視台則只是存數據的,相當於一個中間人,和現在中介差不多個意思。
1. 下載kafka的安裝包到電腦上並傳輸到Linux中的hadoop用戶下
2. 將這個壓縮包解壓到hadoop用戶的opt目錄下
接着就會在opt目錄下看到這個文件夾(/opt: 這是給主機額外安裝軟件所擺放的目錄。比如你安裝一個ORACLE數據庫就可以放到這個目錄下。默認是空的。)
3. 進入到該目錄下 /home/hadoop/opt/kafka_2.11-1.1.0/config目錄,將 zookeeper.properties 中的信息篩選出來並將篩選出來的數據給一個新建的文件zk.properties
#把非注釋行信息篩選出來
接着vi zk.properties這個文件,修改dataDir,將來zookeeper的信息都記錄在這個目錄下,即dataDir=/home/hadoop/zk/
4. 啟動zookeeper
要在該/home/hadoop/opt/kafka_2.11-1.1.0目錄下啟動
./bin/zookeeper-server-start.sh config/zk.properties
接着我們復制該窗口,jps一下,就會看到新開的服務QuorumPeerMain(仲裁的一個機制的東西),這個東西就是zookeeper的進程
#jps 用於查看當前服務器中的java進程,類似於ps -ef | grep java,不同之處是它是由jdk提供的,可以輸出JVM中運行的進程狀態信息,因此它也可以用於jvm的監控和調優
5. 啟動broker(kafka)
我們這個是單機模式:
進入該目錄/home/hadoop/opt/kafka_2.11-1.1.0/config,和上面一樣,將一個文件的數據重定向到另一個新目錄,將帶有#注釋的代碼去掉
cat server.properties | grep -v '#' >>kafka1.properties
然后啟動kafka,要在bin目錄下,和上面一樣
./bin/kafka-server-start.sh config/kafka1.properties
啟動了后,jps一下,就會發現啟動了一個名叫Kafka的進程,說明我們已經啟動成功了
6. 創建一個主題
這里相當於中央電視台創建了一個叫cctv1的節目
還是在/home/hadoop/opt/kafka_2.11-1.1.0目錄下啟動創建
sh ./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic cctv1 #創建到 zookeeper上地址是localhost:2181,cctv1是主題名
然后就可以用命令查看一下該主題是否已經創建,看到這個cctv1就說明創建成功了
sh ./bin/kafka-topics.sh --list --zookeeper localhost:2181
到這里就已經完成了kafka在zookeeper上創建了一個cctv1的主題,然后就需要一個生產者來制作節目,並往cctv1中灌入數據
7. 發布消息(生產者)
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic cctv1
這是一個kafka自帶的控制台的消息者,這里要注意的一點是端口號為9092,說明這個東西默認監控的端口號是9092,我們可以來看下這個端口
查看server.properties這個文件
會看到箭頭指向的地方有個注釋,如果不想用這個端口,可以把這句前面的#去掉,然后將端口號改為自己想監控的端口號
也可以來查看下這個端口號,發現正在監控
#Linux netstat 命令用於顯示網絡狀態。利用 netstat 指令可讓你得知整個 Linux 系統的網絡情況。
隨機輸入兩條數據,並沒有什么變化,因為這個數據borker(經理人)幫忙存着,但這個數據看不到,必須要有一個消費者幫忙消費才能看到
8. 啟動消費者
相當於訂閱了cctv1這個頻道
./bin/kafka-console-consumer.sh--bootstrap-server localhost:9092 --topic cctv1
啟動消費者后,並沒有發生什么變化,這時候我們就在生產者中再輸入幾條消息
接着就會看到消費者那邊出來了數據,但看到的數據只有剛剛輸入的
那之前輸入的數據怎么看?
輸入這個命令就行了
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic cctv1 --from-beginning
就是在啟動消費者時后面加了一個 --from-beginning,就是說明這個cctv1電視台成數字電視台了,可以點播,可以看之前所有的信息,--from-beginning表示從開頭開始看,其實它可以從任意一個偏移量開始看
隨后再來實驗一下,我們在生產者那里接着再輸入多條數據
隨后發現消費者也出來對應的數據
而我們剛剛啟動查詢所有的信息的那個服務里面也顯示出相應的信息
注意:
zookeeper只能啟動奇數,比如1台 、3台、7台等等,不能偶數台,偶數台的話假設有兩台,那么只有一台機器再運行,因為如果是偶數的話,選舉出來的管理者有可能兩個borker得到的票數相同,奇數的話就不會出現這個情況。
上面演示的是簡單的操作,我們也可以在kafka上寫如何放數據,如何讀數據,全部用代碼來實現。
參考:
https://blog.csdn.net/gscsd_t/java/article/details/80089269
https://blog.csdn.net/u011291072/article/details/80009928