1. kafka簡介
Kafka是一個分佈式的消息隊列系統(Message Queue)。官網:https://kafka.apache.org/
kafka集羣有多個Broker服務器組成,每個類型的消息被定義爲topic。同一topic內部的消息按照一定的key和算法被分區(partition)存儲在不同的Broker上。消息生產者producer和消費者consumer可以在多個Broker上生產/消費topic。
1.1 概念理解:
Topics and Logs:
Topic即爲每條發佈到Kafka集羣的消息都有一個類別,topic在Kafka中可以由多個消費者訂閱、消費。每個topic包含一個或多個partition(分區),partition數量可以在創建topic時指定,每個分區日誌中記錄了該分區的數據以及索引信息。如下圖:
**Kafka只保證一個分區內的消息有序,不能保證一個主題的不同分區之間的消息有序。**如果你想要保證所有的消息都絕對有序可以只爲一個主題分配一個分區。
分區會給每個消息記錄分配一個順序ID號(偏移量), 能夠唯一地標識該分區中的每個記錄。Kafka集羣保留所有發佈的記錄,不管這個記錄有沒有被消費過,Kafka提供相應策略通過配置從而對舊數據處理。
實際上,每個消費者唯一保存的元數據信息就是消費者當前消費日誌的位移位置。位移位置是由消費者控制,即、消費者可以通過修改偏移量讀取任何位置的數據。
Distribution – 分佈式
Producers – 生產者:指定topic來發送消息到Kafka Broker
Consumers – 消費者:根據topic消費相應的消息
1.2 kafka集羣部署
修改配置文件:kafka目下下的config/server.properties
1.修改編號,加上對應zookeeper對應節點地址和端口
核心配置參數說明:
broker.id: broker集羣中唯一標識id,0、1、2、3依次增長(broker即Kafka集羣中的一臺服務器)
當前Kafka集羣共三臺節點,分別爲:node1、node2、node3。對應的broker.id分別爲0、1、2。zookeeper.connect: zk集羣地址列表(用來聯繫其它節點)。
2.分發到其他節點上,並修改對應的broker編號
將當前node1服務器上的Kafka目錄同步到其他node2、node3服務器上:
scp -r /opt/kafka/ node2:/opt
scp -r /opt/kafka/ node3:/opt
修改node2、node3上Kafka配置文件中的broker.id(分別在node2、3服務器上執行以下命令修改broker.id)
sed -i -e ‘s/broker.id=./broker.id=1/’ /opt/kafka/config/server.properties
sed -i -e 's/broker.id=./broker.id=2/’ /opt/kafka/config/server.properties
或者去配置文件通過vim修改。
1.3 啓動Kafka集羣
A、啓動Zookeeper集羣。
B、啓動Kafka集羣。
分別在三臺服務器上執行以下命令啓動:
bin/kafka-server-start.sh config/server.properties
如果沒配環境變量,要去對應的目錄下執行。
啓動後是:
測試:
kafka-topics.sh --help查看幫助手冊)
創建topic(test):
bin/kafka-topics.sh --zookeeper hadoop01:2181, hadoop02:2181, hadoop03:2181 --create --replication-factor 2 --partitions 3 --topic test
參數說明:
–replication-factor:指定每個分區的複製因子個數,默認1個
–partitions:指定當前創建的kafka分區數量,默認爲1個
–topic:指定新建topic的名稱)
查看topic列表:
bin/kafka-topics.sh --zookeeper hadoop01:2181, hadoop02:2181, hadoop03:2181 --list
查看“test”topic描述:
bin/kafka-topics.sh --zookeeper hadoop01:2181, hadoop02:2181, hadoop03:2181 --describe --topic test
創建生產者:
bin/kafka-console-producer.sh --broker-list hadoop01:9092, hadoop02:9092, hadoop03:9092 --topic test
創建後就在等待輸入,鍵盤輸入什麼就生產什麼數據。
創建消費者:
bin/kafka-console-consumer.sh --zookeeper hadoop01:2181, hadoop02:2181, hadoop03:2181 --from-beginning --topic test
beginning表示從頭開始消費;輸出結果在分區內是有序的,不同分區是無法保證的,所以三個一組是一個分區有序,整體無序。但是,如果生產者和消費者都啓動後,只要生產者產生一個,則消費者一定會消費一個,一定是順序輸出的。
注:kafka是一個消息存儲和消費的容器,而storm是一個實時處理機制,如果兩個融合,則storm的spout即爲kafka的消費者即可。
查看幫助手冊:
bin/kafka-console-consumer.sh help
2. Flume安裝
1 ftp 上傳linux: apache-flume-1.6.0-bin.tar.gz
2 解壓到 /opt/sxt目錄下
3 進入conf/ 目錄,直接把flume-env.sh.template 文件改爲flume-env.sh
4 修改flume-env.sh 文件中的export_java ,變爲 export JAVA_HOME=/home/hadoop/app/jdk1.8.0_112
#可以使用pwd快速定位jdk的位置
5 配置flume環境變量在profile中
6. 在./conf/ 目錄下創建(新建): fk.conf
##在fk.conf 中將下列複製粘貼過去。
#輸入源 輸出 管道
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source ## 連接協議 flume運行節點 運行端口號
a1.sources.r1.type = avro
a1.sources.r1.bind = node06
a1.sources.r1.port = 41414
# Describe the sink ##記得改主機和端口號
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.topic = testflume
a1.sinks.k1.brokerList = node06:9092,node07:9092,node08:9092
a1.sinks.k1.requiredAcks = 1
a1.sinks.k1.batchSize = 20
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000000
a1.channels.c1.transactionCapacity = 10000
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
7.啓動: 先啓動zookeeper(zkServer.sh start),再啓動flume:
bin/flume-ng agent -n a1 -c conf -f conf/fk.conf -Dflume.root.logger=DEBUG,console
##以代理模式啓動,讀取配置文件爲fk.conf ,錯誤信息使用debug模式,在控制檯輸出。