大數據Spark實時處理--架構分析


  • Spark是一個實時處理框架
  • Spark提供了兩套實施解決方案:Spark Streaming(SS)、Structured Streaming(SSS)
  • 然后再結合其它框架:Kafka、HBase、Flume、Redis

 

  • 項目流程:架構分析、數據產生、數據采集、數據收集、數據實時交換、實時流處理、結果可視化、調優
  • 1)【項目啟動】架構分析
  • 2)【環境部署】基礎開發環境搭建
  • 2)【數據產生】
  • 3)【數據采集】構建日志服務器(偏重於日志產生及存儲)
  • 4)【數據收集】基於Flume構建分布式日志收集(偏重於數據從A地方到B地方的操作)
  • 5)【消息隊列】基於Kafka構建實時數據交換
  • 6)【實時流處理】Spark Streaming核心API
  • 7)【實時流處理】應用Spark Streaming實現數據分析及調優
  • 8)【實時流處理】Structured Streaming應用
  • 9)【實時流處理】應用Structured Streaming實現數據分析及調優
  • 10)【數據可視化】使用Echarts完成數據展示

 

  • 架構圖
  • 1)日志采集:自定義一個日志服務
  • 2)數據收集交換:使用Flume將日志服務數據收集過來,落在Kafka上
  • 3)實時處理:基於Spark Streaming(SS)、Structured Streaming(SSS)來對接Kafka的數據
  • 4)數據存儲:第3)步處理后的數據,Spark Streaming處理的數據存儲至HBase中,Structured Streaming處理的數據存儲至Redis
  • 5)查詢API:頁面的請求通過API,即使用Spring Boot、Spring Data來查詢HBase和Redis里的數據,並把數據放置可視化里。在可視化里是通過Echarts來展示。也會使用到React來封裝Echarts。
  • 6)整個項目的運行環境:產商雲主機、物理機、虛擬機

 

  • 更詳細的流程
  • 1)客戶端所產生的日志,通過Nginx協議端過來后,給它負載均衡落在LogServer上,其中LogServer是自定義開發的。
  • 2)然后,會使用兩層的Flume架構,第一層Flume用於收集LogServer上的數據,第二層Flume對接第一層並做聚合操作(這樣操作的原因,后續講解)
  • 3)其次,Flume收集的數據,對接到Kafka
  • 4)后面交給流處理引擎來處理,處理后的結果存儲到存儲層
  • 5)最后,使用API這層,將存儲的結果通過UI進行可視化展示

 

  • Spark和Kafka對接的offsets管理維護
  • 1)首先,在Kafka集群里,做分區。
  • 2)Kafka分區后,與Spark Streaming做對接
  • 3)基於DStream,Spark Streaming可以進行一些處理,處理后將結果存儲下來。
  • 4)處理的批次對應的offset是哪些呢?需要通過commit offsets存儲到HBase/Kafka/ZK/MySQL
  • 5)如果作業掛掉/出現異常,機器重啟,在DStream處理時,應該從已經存儲過的offsets的HBase/Kafka/ZK/MySQL,往后進行操作,這樣才能保證數據是准確的。

 

  • 展示效果
  • 1)當天每小時用戶訪問時長(當天零點開始,到某一個時間點的用戶訪問時長(連帶輪動))
  • 2)當天用戶時長的Top10
  • 3)用戶訪問區域的統計(以地圖方式展示),根據具體日期展示各省份訪問次數的Top10
  • 4)不同性別、年齡段訪問人數統計

 

  • 環境參數
  • 1)Spark:3*版本
  • 2)Hadoop生態:CDH(5.16.2)
  • 3)Kafka:2.5.0
  • 4)Redis:6.0.6
  • 5)JDK:1.8
  • 6)Scala:2.12
  • 7)Linux版本:CentOS 7
  • 8)Maven:3.6.3

 

  • 項目目的
  • 1)從總體到細節掌握大數據實時處理的解決方案
  • 2)各個框架各司其職,並做好各個框架之間的銜接
  • 3)基於第二點,做到框架的高可用。在實際生產中,不僅僅要跑通,還要考慮每個環節的高可用。假如一個環節出問題,不能影響整體的一個流程。

 

  • 技術選型
  • 0)基礎:Hadoop
  • 1)數據產生:SDK來完成,代碼的方式
  • 2)數據采集:SpringBoot來構建日志服務器
  • 3)數據收集:Flume
  • 4)數據交換/消息隊列:Kafka
  • 5)實時流處理:SS、SSS
  • 6)結果存儲:HBase、Redis
  • 7)可視化:Echarts、React

 

  • 項目架構V1版本
  • 1)用戶---(問題1/2)---->LogServer----(source)--->Flume----(sink)--->Kafka Clauster (Topic)(實時)(問題3)------->Spark------->DB------->API------->UI
  • 2)V1版本存在的問題1:實際上LogServer是由很多機器構成,這些機器有着不同的IP地址。不同用戶的操作數據,上報到LogServer中不同的機器上,還需要去關注LogServer中不同機器的IP地址嗎?當然不應再去關注LogServer相關信息。
  • 3)V1版本存在的問題2:每一個用戶的操作數據和LogServer中的機器,不可能一一對應,所以這里缺少負載均衡。所以用戶的操作數據通過負載均衡,讓數據比較均衡的落在LogServer中每個機器上。
  • 4)V1版本存在的問題3:離線處理及實時處理的數據源都是一樣的。Kafka是實時處理,當然也可以放入HDFS中進行離線處理。單層的Flume是存在隱患的,它沒有任何負載均衡和容錯性可言,一旦sink出問題,會影響整個流程的運轉。

 

  • 項目架構V2版本
  • 1)用戶------->Nginx Cluster------->LogServer----(source)--->Flume 1----(sink)--->Flume 2------->Kafka Clauster (Topic)(實時)------->Spark------->DB------->API------->UI
  • 2)Nginx Cluster來完成負載均衡
  • 3)Flume 2 進行聚合操作,相當於是容錯機制。如果第一套sink出問題了,采用第二套sink。做一個高可用的配置,使得第一個sink出問題,也能保障整個流程運轉正常。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM