1、前言
本章節使用的是Apache Kafka,版本:kafka_2.11-2.1.0.tgz
;但是實際工作中要考慮CDH環境,使用的是CDH官網的Kafka,所以這裏先簡單介紹下,如何集成到CDH中,請參考博客:
https://blog.csdn.net/greenplum_xiaofan/article/details/97677328
版本選擇:使用的是CDH版本的Kafka,在CDH官網上叫做CDK。
比如:
kafka_2.11-0.10.2-kafka-2.2.0.jar
kafka_2.11::表示scala-2.11版本
0.10.2: 指在apache上的 kafka版本
2.2.0: 這個纔是CDH官網上的CDK版本
CDK地址:
https://www.cloudera.com/documentation/kafka/latest/topics/kafka_packaging.html#concept_fzg_phl_br
Apache Kafka地址:
http://kafka.apache.org/
SparkStraming2.4.2版本官網推薦:apache kafka版本至少0.10.x及以上。
Kafka 0.8和0.10是個分水嶺,對比如下(來自Spark官網):
可以看出0.10版本,只有Direct DStream,不再支持Receiver DSstream;Offset維護在Kafka中。
2、Kafka基本概念
kafka是一個高吞吐的分佈式消息系統,一般充當消息中間件,一般是跟流式處理掛鉤的,比如SparkStreaming。
Kafka的三個角色:
- Broker:Kafka集羣中server節點,負責讀寫請求,存儲消息,管理分區,無主從關係,依賴zk協調
- Producer:生產者,負責生產消息,比如從Flume獲取數據
- Consumer:消費者,負責消費消息,比如被SparkStreaming、Flink消費
Kafka這三個角色和Flume的三個角色非常類似,但Flume啓動後只有一個進程,而Kafka每個角色都需要啓動,有三個進程。
Kafka其他重要概念:
- Topic:主題,消息的分類,支持一個topic多個消費者消費
- Partition:分區,一個Topic由一個或多個分區組;一般情況下多少個Kafka節點就設置多少分區數
- Replication:副本,一個分區數據複製多少份
- Consumer Group:消費者組,一個消費組可以包含一個或多個消費者,對於同一個Topic數據消費者組裏面的每個消費者消費部分數據,而且每個消費者消費的數據是不同的。
- Offset:偏移量,消費一個分區數據時數據所在的下標,從0開始
3、Kafka安裝
我們這裏採用的是單節點安裝,集羣安裝一樣的,舉一反三。
3.1 安裝Zookeeper
Kafka需要依賴Zookeeper,zookeeper-3.4.5-cdh5.7.0.tar.gz
下載地址(cdh版的)
http://archive.cloudera.com/cdh5/cdh/5/zookeeper-3.4.5-cdh5.7.0.tar.gz
#先瞅一眼文件目錄
[hadoop@vm01 ~]$ ll
total 12
drwxrwxr-x. 12 hadoop hadoop 4096 Aug 9 09:42 app
drwxrwxr-x. 6 hadoop hadoop 4096 Aug 8 16:59 data
drwxrwxr-x. 2 hadoop hadoop 32 Aug 1 13:26 lib
drwxrwxr-x. 3 hadoop hadoop 23 Jul 30 03:18 maven_repo
drwxrwxr-x. 3 hadoop hadoop 4096 Aug 9 07:41 software
drwxrwxr-x. 3 hadoop hadoop 24 Jul 30 03:18 source
#解壓
[hadoop@vm01 software]$ tar -zxvf zookeeper-3.4.5-cdh5.7.0.tar.gz -C ../app/
[hadoop@vm01 conf]$ cd ../app/zookeeper-3.4.5-cdh5.7.0
[hadoop@vm01 zookeeper-3.4.5-cdh5.7.0]$ mkdir data dataLog
#配置zoo.cfg
[hadoop@vm01 conf]$ cd conf
[hadoop@vm01 conf]$ cp zoo_sample.cfg zoo.cfg
[hadoop@vm01 conf]$ vi zoo.cfg
...
dataDir=/home/hadoop/app/zookeeper-3.4.5-cdh5.7.0/data
dataLogDir=/home/hadoop/app/zookeeper-3.4.5-cdh5.7.0/dataLog
server.1=vm01:2888:3888
#如果是集羣就添加節點在下一行,2888是zk之間的通信,3888是zk跟其他應用程序通信
#server.2=vm02:2888:3888
#server.3=vm03:2888:3888
#配置myid文件,上面的server.1 就是myid,不同節點myid是不同的
#zk集羣在剛開始啓動的時候,就是根據myid來選舉的
[hadoop@vm01 data]$ pwd
/home/hadoop/app/zookeeper-3.4.5-cdh5.7.0/data
[hadoop@vm01 data]$ echo "1" >myid
#配置環境變量
[hadoop@vm01 conf]$ vi ~/.bash_profile
export ZOOKEEPER_HOME=/home/hadoop/app/zookeeper-3.4.5-cdh5.7.0/
export PATH=$ZOOKEEPER_HOME/bin:$PATH
[hadoop@vm01 conf]$ source ~/.bash_profile
#啓動zk
[hadoop@vm01 bin]$ ./zkServer.sh start
JMX enabled by default
Using config: /home/hadoop/app/zookeeper-3.4.5-cdh5.7.0/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop@vm01 bin]$ ./zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/app/zookeeper-3.4.5-cdh5.7.0/bin/../conf/zoo.cfg
Mode: standalone
#因爲是單節點,就是這個模式
#如果是集羣,那麼是一個leader,多個flower。
#查看進程
[hadoop@vm01 bin]$ jps
36505 QuorumPeerMain
3.2 安裝Kafka
#解壓
[hadoop@vm01 software]$ tar -zxvf kafka_2.11-2.1.0.tgz -C ../app/
[hadoop@vm01 kafka_2.11-2.1.0]$ mkdir kafkaLog/
#配置server.properties
[hadoop@vm01 config]$ pwd
/home/hadoop/app/kafka_2.11-2.1.0/config
[hadoop@vm01 config]$ vi server.properties
broker.id=0
host.name=vm01
port=9092
listeners=PLAINTEXT://vm01:9092
log.dirs=/home/hadoop/app/kafka_2.11-2.1.0/kafkaLog
zookeeper.connect=vm01:2181/kafka #kafka元數據信息存到ZK的/kafka目錄下
#集羣是這樣子 zookeeper.connect=vm01:2181,vm02:2181,vm03:2181/kafka
#配置環境變量
[hadoop@vm01 config]$ vi ~/.bash_profile
export KAFKA_HOME=/home/hadoop/app/kafka_2.11-2.1.0
export PATH=$KAFKA_HOME/bin:$PATH
[hadoop@vm01 config]$ source ~/.bash_profile
3.3 Kafka啓動、測試
克隆兩個窗口,一共三個窗口,第一個啓動Kafka-Server,一直開啓,工作中把他放到後臺執行
第二個窗口,先創建Topic,然後模擬Producer生產者;第三個窗口,模擬Consumer消費者。
#第一個窗口 啓動server
[hadoop@vm01 bin]$ pwd
/home/hadoop/app/kafka_2.11-2.1.0/bin
[hadoop@vm01 bin]$ ./kafka-server-start.sh ../config/server.properties
#第二個窗口 producer
[hadoop@vm01 bin]$ ./kafka-topics.sh \
--create \
--zookeeper vm01:2181/kafka \
--partitions 1 \
--replication-factor 1 \
--topic ruozedatag6
#查看
[hadoop@vm01 bin]$ ./kafka-topics.sh --list --zookeeper vm01:2181/kafka
ruozedatag6
#啓動Producer
[hadoop@vm01 bin]$ ./kafka-console-producer.sh \
> --broker-list vm01:9092 \
> --topic ruozedatag6
>
#第三個窗口 啓動consumer
[hadoop@vm01 bin]$ ./kafka-console-consumer.sh \
> --bootstrap-server vm01:9092 \
> --topic ruozedatag6 \
> --from-beginning #這個代表重頭開始消費,比如再一次啓動消費端,會重頭開始讀取topic的數據
注意項:
- 對於消費者,kafka中有兩個設置的地方:對於老的消費者,由–zookeeper參數設置;對於新的消費者,由–bootstrap-server參數設置。
- 如果使用了–zookeeper參數,那麼consumer的信息將會存放在zk之中。
- 查看的方法是使用./zookeeper-client,然後 ls /consumers/[group_id]/offsets/[topic]/[broker_id-part_id],這個是查看某個group_id的某個topic的offset。
- 如果使用了–bootstrap-server參數,那麼consumer的信息將會存放在kafka之中。
#查看進程
[hadoop@vm01 bin]$ jps
38707 ConsoleConsumer
36854 Kafka
36505 QuorumPeerMain
38126 ConsoleProducer
生產端輸入 hadoop
消費端立馬就接受到信息