1. 程式人生 > >大資料技術棧淺述

大資料技術棧淺述

最近在做企業安全建設,企業安全建設中最常見的一項就是做監控,監控的種類多種多樣,但是底層的技術棧卻基本是一致的————大資料技術,下面我記錄一下我最近學習到的一些大資料技術,下文只是描述個脈絡而已。 大資料的技術棧,以及對應的上下依賴圖如下: ![](https://img2020.cnblogs.com/blog/1552062/202007/1552062-20200730125451059-1273633870.png) 看完這個圖,是不是覺得和之前學習過的網路協議、框架都非常相識,無非就是把裡面的名詞替換了一下而已。我感覺軟體產品的設計思路都是要分模組化、解耦合,你看TCP/IP協議層,每層都各司其職,每層裡面的每個功能也是按照這個總體思路繼續向下設計。解耦合的好處很多,建議自行百度。 我個人覺得,裡面比較有難度的就是Flink那塊,因為對資料的分析、計算處理都是在這一塊中完成的,Flink也可以用storm替換,不過效能沒有flink好。 當將計算結果儲存到ES之後,就可以做很多事了,比如做自動告警功能了。
# 資料來源 資料來源可以是任何資料,不過現在採集最多的應該就是日誌類資料
# Filebeat 採集器是最容易理解的,主要是用來彙總日誌然後轉發的,採集器的技術方案也有很多,這裡舉例filebeat。 Filebeat主要由兩個元件構成:`prospector(探測器)`和`harvester(收集器)`,這兩類元件一起協作完成Filebeat的工作。 Filebeat的工作流程如下: 當開啟Filebeat程式的時候,它會啟動一個或多個探測器去檢測指定的日誌目錄或檔案,對於探測器找出的每一個日誌檔案,Filebeat會啟動收集程序,每一個收集程序讀取一個日誌檔案的內容,然後將這些日誌資料傳送到後臺處理程式,後臺處理程式會集合這些事件,最後傳送集合的資料到output指定的目的地。 Filebeat在有資料來源的機器安裝好之後,要做的就是寫一下配置, 主要配置讀取檔案的路徑,以及輸出流的位置以及相應的效能引數等,以Kafka訊息中介軟體作為緩衝,所有的日誌收集器都向Kafka輸送日誌流。 定義日誌資訊輸出格式: ```go //存放日誌的資料夾名稱 logs
//日誌檔名稱 collector //日誌格式 //[%d{yyyy-MM-dd'T'HH:mm:ss.SSSZZ}] 日誌輸入時間,東八區 //[%level{length=5}] 日誌級別,debug、info、warn、error //[%thread-%tid] 當前執行緒資訊 //[%logger] 當前日誌資訊所屬類全路徑 //[%X{hostName}] 當前節點主機名。需要通過MDC來自定義。 //[%X{ip}] 當前節點ip。需要通過MDC來自定義。 //[%X{applicationName}] 當前應用程式名。需要通過MDC來自定義。 //[%F,%L,%C,%M] %F:當前日誌資訊所屬的檔案(類)名,%L:日誌資訊在所屬檔案中的行號,%C:當前日誌所屬檔案的全類名,%M:當前日誌所屬的方法名 //[%m] 日誌詳情 //%ex 異常資訊 //%n 換行 [%d{yyyy-MM-dd'T'HH:mm:ss.SSSZZ}] [%level{length=5}] [%thread-%tid] [%logger] [%X{hostName}] [%X{ip}] [%X{applicationName}] [%F,%L,%C,%M] [%m] ## '%ex'%n
``` Filebeat配置參考資訊: ```go paths: - /usr/local/logs/error-collector.log document_type: "error-log" multiline: # pattern: '^\s*(\d{4}|\d{2})\-(\d{2}|[a-zA-Z]{3})\-(\d{2}|\d{4})' # 指定匹配的表示式(匹配以 2017-11-15 08:04:23:889 時間格式開頭的字串) pattern: '^\[' # 指定匹配的表示式(匹配以 "{ 開頭的字串) negate: true # 是否匹配到 match: after # 合併到上一行的末尾 max_lines: 2000 # 最大的行數 timeout: 2s # 如果在規定時間沒有新的日誌事件就不等待後面的日誌 fields: logbiz: collector logtopic: error-log-collector ## 按服務劃分用作kafka topic evn: dev output.kafka: enabled: true hosts: ["192.168.204.139:9092"] topic: '%{[fields.logtopic]}' partition.hash: reachable_only: true compression: gzip max_message_bytes: 1000000 required_acks: 1 logging.to_files: true ```
# Kafka Apache kafka是訊息中介軟體的一種,功能是高吞吐量的分散式釋出訂閱訊息系統 Kafka特點: kafka中的訊息不是kafka主動去拉去的,而必須有生產者往kafka寫訊息。 kafka是不會主動往消費者釋出訊息的,而必須有消費者主動從kafka拉取訊息。 kafka名詞解釋: kafka的幾個名詞需要知道一下,比如topic、producer、consumer、broker,下面用最俗的方式解釋 - producer:生產者,就是它來生產“雞蛋”的。 - consumer:消費者,生出的“雞蛋”它來消費。 - topic:你把它理解為標籤,生產者每生產出來一個雞蛋就貼上一個標籤(topic),消費者可不是誰生產的“雞蛋”都吃的,這樣不同的生產者生產出來的“雞蛋”,消費者就可以選擇性的“吃”了。 - broker:相當於菜市場的小販,小販從生產者手裡收購了雞蛋,然後一直儲存在商店中,等待消費者來購買。他在中間作雞蛋的儲存、轉發、接受顧客問價(請求)和回答(響應)等功能。 一個單獨的Kafka Server就是一個Broker。在一般的生產環境中,一個Broker獨佔一臺物理伺服器。Broker的主要工作就是接收生產者發過來的訊息,分配offset,之後儲存到磁碟中。同時,接收消費者、其他Broker的請求,根據請求型別進行相應處理並返回響應。 kafka的單節點基本操作: 生產者 ``` # 建立一個主題(標籤),Hello-Kafka bin/kafka-console-producer.sh --broker-list localhost:9092 --topic Hello-Kafka # 生產者將等待來自stdin的輸入併發布到Kafka叢集。 預設情況下,每個新行都作為新訊息釋出,然後在 config / producer.properties 檔案中指定預設生產者屬性。 # 在終端中鍵入幾行訊息 egg1 egg2 ``` 消費者 ``` # 與生產者類似,在 config / consumer.proper-ties 檔案中指定了預設使用者屬性。 開啟一個新終端並鍵入以下訊息訊息語法。 bin/kafka-console-consumer.sh --zookeeper localhost:2181 —topic Hello-Kafka --from-beginning # 自動出現 egg1 egg2 ```
# Flink Flink核心是一個流式的資料流執行引擎,其針對資料流的分散式計算提供了資料分佈、資料通訊以及容錯機制等功。 簡單的說就是,Flink可以對資料流進行轉換、計算、聚合等功能。如果你採集的資料需要做告警功能,那麼就需要用Flink或者storm,如果只是將採集的資料進行儲存,然後展示,那麼就不需要用到Flink這種技術。 比如在企業安全建設中,做監控平臺就需要有告警功能,採集到的監控資料會直接往 kafka 裡塞,然後告警這邊需要從 kafka topic 裡面實時讀取到監控資料,並將讀取到的監控資料做一些 轉換、計算、聚合等操作,然後將計算後的結果與告警規則的閾值進行比較,然後做出相應的告警措施(釘釘群、郵件、簡訊、電話等)。畫了個簡單的圖如下: ![](https://img2020.cnblogs.com/blog/1552062/202007/1552062-20200730120233999-30371294.png) flink處理靜態sql的代理流程: ![](https://img2020.cnblogs.com/blog/1552062/202007/1552062-20200730120444732-1919098247.png) 這個sql只能是寫死在程式碼裡面,如果是想要動態的修改sql,那麼就要重啟flink服務才能生效。 但是有個需求,就像下圖這樣,sql語句來之外部,因為需要讓安全人員來描述規則,他們跟進安全態勢來修改,並且需要常常更新規則來挖掘出最新安全事件, ![](https://img2020.cnblogs.com/blog/1552062/202007/1552062-20200730123646254-1926770521.png) 那麼就出現一個問題了,像上面的flink只能處理靜態sql,想動態處理怎麼辦? 使用 flink-siddhi 來處理動態sql: SIDDHI 是一款功能強大的open source CEP(Complex Event Processing)引擎引擎,具有自己的DSL,豐富的模式匹配功能和可擴充套件性, 使用Siddhi 引擎的好處就是,裡面的sql語句可以任意修改,修改sql後,也不需要重啟flink服務。 siddhi引擎我最近也是剛開始學習,這裡就不過多筆墨了,後面會出siddhi的專項文章。
# ES ES太常見了,以後有空在補充吧。
# Kibana Kibana也很常見,以後有空在補充吧。希望讀者給個評論或者推薦,讓我有動力更新完。
# 參考 https://www.cnblogs.com/monument/p/12944718.html https://www.jianshu.com/p/a8b66f586fd4 http://kafka.apachecn.org/ https://www.w3cschool.cn/apache_kafka/apache_kafka_introduction.html https://blog.csdn.net/leanaoo/article/details/84310604 https://ci.apache.org/projects/flink/flink-docs-release-1.4/ https://www.cnblogs.com/fxjwind/p/5048583.html https://baijiahao.baidu.com/s?id=1623279487849430246&wfr=spider&for=pc