2021年大数据Spark(四十二):SparkStreaming的Kafka快速回顾与整合说明
?
目錄
Kafka快速回顧
?消息隊列:
?發布/訂閱模式:
Kafka 重要概念:
常用命令
整合說明
兩種方式
兩個版本API
在實際項目中,無論使用Storm還是SparkStreaming與Flink,主要從Kafka實時消費數據進行處理分析,流式數據實時處理技術架構大致如下:
?
技術棧: Flume/SDK/Kafka Producer API ?-> KafKa ?—> ?SparkStreaming/Flink/Storm(Hadoop YARN) -> Redis ?-> UI
1)、阿里工具Canal:監控MySQL數據庫binlog文件,將數據同步發送到Kafka Topic中https://github.com/alibaba/canalhttps://github.com/alibaba/canal/wiki/QuickStart2)、Maxwell:實時讀取MySQL二進制日志binlog,并生成 JSON 格式的消息,作為生產者發送給 Kafka,Kinesis、RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平臺的應用程序。http://maxwells-daemon.io/https://github.com/zendesk/maxwell
擴展:Kafka 相關常見面試題:
1)、Kafka 集群大小(規模),Topic分區函數名及集群配置?2)、Topic中數據如何管理?數據刪除策略是什么?3)、如何消費Kafka數據?4)、發送數據Kafka Topic中時,如何保證數據發送成功?
?
Apache Kafka: 最原始功能【消息隊列】,緩沖數據,具有發布訂閱功能(類似微信公眾號)。
Kafka快速回顧
Kafka 是一個分布式的基于發布/訂閱模式的消息隊列(Message Queue),主要應用與大數據實時處理領域。
?消息隊列:
Kafka 本質上是一個 MQ(Message Queue),使用消息隊列的好處?(面試會問)
- 解耦:允許我們獨立的擴展或修改隊列兩邊的處理過程;
- 可恢復性:即使一個處理消息的進程掛掉,加入隊列中的消息仍可以在系統恢復后被處理;
- 緩沖:有助于解決生產消息和消費消息的處理速度不一致的情況;
- 靈活性&峰值處理能力:不會因為突發的超負荷的請求而完全崩潰,消息隊列能夠使關鍵組件頂住突發的訪問壓力;
- 異步通信:消息隊列允許用戶把消息放入隊列但不立即處理它;
?發布/訂閱模式:
?
?
一對多,生產者將消息發布到 Topic 中,有多個消費者訂閱該主題,發布到 Topic 的消息會被所有訂閱者消費,被消費的數據不會立即從 Topic 清除。
Kafka 框架架構圖如下所示:
?
Kafka 存儲的消息來自任意多被稱為 Producer 生產者的進程,數據從而可以被發布到不同的 Topic 主題下的不同 Partition 分區。在一個分區內,這些消息被索引并連同時間戳存儲在一起。其它被稱為 Consumer 消費者的進程可以從分區訂閱消息。Kafka 運行在一個由一臺或多臺服務器組成的集群上,并且分區可以跨集群結點分布。
Kafka 重要概念:
?1)、Producer: 消息生產者,向 Kafka Broker 發消息的客戶端;
?2)、Consumer:消息消費者,從 Kafka Broker 取消息的客戶端;
?3)、Consumer Group:消費者組(CG),消費者組內每個消費者負責消費不同分區的數據,提高消費能力。一個分區只能由組內一個消費者消費,消費者組之間互不影響。所有的消費者都屬于某個消費者組,即消費者組是邏輯上的一個訂閱者;
?4)、Broker:一臺 Kafka 機器就是一個 Broker。一個集群由多個 Broker 組成。一個 Broker 可以容納多個 Topic;
?5)、Topic:可以理解為一個隊列,Topic 將消息分類,生產者和消費者面向的是同一個 Topic;
?6)、Partition:為了實現擴展性,提高并發能力,一個非常大的 Topic 可以分布到多個 Broker (即服務器)上,一個 Topic 可以分為多個 Partition,每個 Partition 是一個 有序的隊列;
?7)、Replica:副本,為實現備份的功能,保證集群中的某個節點發生故障時,該節點上的 Partition 數據不丟失,且 Kafka 仍然能夠繼續工作,Kafka 提供了副本機制,一個 Topic 的每個分區都有若干個副本,一個 Leader 和若干個 Follower;
?8)、Leader:每個分區多個副本的“主”副本,生產者發送數據的對象,以及消費者消費數據的對象,都是 Leader;
?9)、Follower:每個分區多個副本的“從”副本,實時從 Leader 中同步數據,保持和 Leader 數據的同步。Leader 發生故障時,某個 Follower 還會成為新的 Leader;
?10)、Offset:消費者消費的位置信息,監控數據消費到什么位置,當消費者掛掉再重新恢復的時候,可以從消費位置繼續消費;
?11)、Zookeeper:Kafka 集群能夠正常工作,需要依賴于 Zookeeper,Zookeeper 幫助 Kafka 存儲和管理集群信息;
?
常用命令
#啟動kafka/export/server/kafka/bin/kafka-server-start.sh -daemon /export/server/kafka/config/server.properties #停止kafka/export/server/kafka/bin/kafka-server-stop.sh #查看topic信息/export/server/kafka/bin/kafka-topics.sh --list --zookeeper node1:2181#創建topic/export/server/kafka/bin/kafka-topics.sh --create --zookeeper node1:2181 --replication-factor 1?--partitions 3 --topic test#查看某個topic信息/export/server/kafka/bin/kafka-topics.sh --describe --zookeeper node1:2181 --topic test#刪除topic/export/server/kafka/bin/kafka-topics.sh --zookeeper node1:2181 --delete --topic test#啟動生產者--控制臺的生產者--一般用于測試/export/server/kafka/bin/kafka-console-producer.sh --broker-list node1:9092 --topic spark_kafka# 啟動消費者--控制臺的消費者/export/server/kafka/bin/kafka-console-consumer.sh --bootstrap-server node1:9092 --topic spark_kafka --from-beginning
?
整合說明
兩種方式
Receiver-based Approach:
1.KafkaUtils.createDstream基于接收器方式,消費Kafka數據,已淘汰,企業中不再使用;
2.Receiver作為常駐的Task運行在Executor等待數據,但是一個Receiver效率低,需要開啟多個,再手動合并數據(union),再進行處理,很麻煩;
3.Receiver那臺機器掛了,可能會丟失數據,所以需要開啟WAL(預寫日志)保證數據安全,那么效率又會降低;
4.Receiver方式是通過zookeeper來連接kafka隊列,調用Kafka高階API,offset存儲在zookeeper,由Receiver維護;
5.Spark在消費的時候為了保證數據不丟也會在Checkpoint中存一份offset,可能會出現數據不一致;
?
Direct Approach (No Receivers):
1.KafkaUtils.createDirectStream直連方式,Streaming中每批次的每個job直接調用Simple Consumer API獲取對應Topic數據,此種方式使用最多,面試時被問的最多;
2.Direct方式是直接連接kafka分區來獲取數據,從每個分區直接讀取數據大大提高并行能力
3.Direct方式調用Kafka低階API(底層API),offset自己存儲和維護,默認由Spark維護在checkpoint中,消除了與zk不一致的情況 ;
4.當然也可以自己手動維護,把offset存在MySQL/Redis中;
?
?
?
兩個版本API
Spark Streaming與Kafka集成,有兩套API,原因在于Kafka Consumer API有兩套,文檔:
http://spark.apache.org/docs/2.4.5/streaming-kafka-integration.html
?
1. Kafka 0.8.x版本 -早已淘汰
- 底層使用老的KafkaAPI:Old Kafka Consumer?API
- 支持Receiver(已淘汰)和Direct模式:
2.Kafka 0.10.x版本-開發中使用
- 底層使用新的KafkaAPI: New Kafka Consumer API
- 只支持Direct模式
?
?
?
?
?
總結
以上是生活随笔為你收集整理的2021年大数据Spark(四十二):SparkStreaming的Kafka快速回顾与整合说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年大数据Spark(四十一):S
- 下一篇: 2021年大数据Spark(四十三):S