Flink 簡介

Flink 概述

  1. flink 是什麼
    官網:https://flink.apache.org/

          Apache Flink 是一個開源的分佈式,高性能,高可用,準確的流處理框架。支持實時流處理和批處理。

          Apache Flink 是一個框架和分佈式處理引擎,用於在無界和有界數據流上進行有狀態的計算。Flink 被設計用於在所有常見的集羣環境中運行,以內存形式和任何規模執行計算。

    在這裏插入圖片描述
    數據源:

    1. Clicks:點擊流
    2. Logs:日誌,實時發現錯誤信息
    3. IOT:物聯網 如小米手環
    4. Transactions:交易數據 下單,付款

    輸出位置:

    1. Application:應用 比如郵件的 api,短信的 api
    2. Event Log:消息隊列 爲下一個 flink的輸入
    3. DataBase:數據庫

    資源調度:

    K8s,yarn,Mesos

    存儲:

    HDFS,S3,NFS

  2. 有界和無界數據(Unbounded and Bounded data)
    無界數據

          無界流有一個開始,但沒有定義的結束。它們不會在生成數據時終止並提供數據。必須連續處理無邊界流,即,事件在被攝入後必須立即處理。等待所有輸入數據到達是不可能的,因爲輸入是無界的,並且不會在任何時間點完成。處理無界數據通常需要以特定的順序接收事件,例如事件發生的順序,以便能夠推斷出結果的完整性。

    有界數據

          有一個定義好的開始和結束。在執行任何計算之前,可以通過攝取所有數據來處理有界流。處理有界流不需要有序攝取,因爲有界數據集總是可以排序的。有界流的處理也稱爲批處理

  3. 批處理和流處理(Batch and Streaming)
    批處理

          數據的批處理,可以理解爲一系列相關聯的任務順序(或並行)一個接一個的執行,批處理關注事件時間。

    輸入:是一段時間內以及存收集保存好的數據。
    輸出:可以作爲下一批處理的輸入
    批處理架構應用: 日誌分析、計費程序、數據倉庫定時分析

    流處理

          數據的流處理可以理解爲系統需要接受並處理一系列不斷變化的數據。如:會員權益營銷系統

          流處理的輸入數據是無邊界數據,流處理視業務場景關注事件世間還是處理時間。

    流處理架構應用:實時監控、實時商業智能、終端銷售系統。

Flink 接口的層級(FlinkLayer API)

在這裏插入圖片描述

  1. 狀態事件驅動的 api
    在這裏插入圖片描述

          Processfunction 是 Flink 提供的最富表現力的函數接口。Flink 提供 processfunction 來處理來自一個或兩個輸入流等時間。Process 函數提供了對時間和狀態的細粒度控制。ProcessFunction 可以任意修改它的狀態並註冊定時器,從而在將來觸發回調函數。因此,ProcessFunction 可以根據許多有狀態事件驅動的應用程序的需要實現每個時間的複雜業務邏輯。

  2. 流或批處理的 api
    在這裏插入圖片描述

          DataStream API 爲許多常見的流處理操作提供基本類型,比如窗口化、一次記錄轉換和通過查詢外部數據存儲來豐富事件。DataStream API 可用於 Java 和 Scala ,它基於 map()、reduce()、和 aggregate()等函數。函數可以通過擴展接口或作爲 Java 或者 Scala lanbda 函數來定義。

  3. 高級別的 api(sql 或 table)
    在這裏插入圖片描述

          Flink 有兩個關係 API,表 API 和 SQL 。這兩個 api 都是用於批處理和流處理的統一 api ,即,查詢在無界或有界數據、並進行相應執行,併產生相同的結果。表 API 和 SQL 利用 Apache sql 解析器進行解析、驗證和查詢優化。他們可以與 DataStream 和 DataSet 無縫集成,並支持用戶定義的變量、聚合和表值函數。

    總結:

          三種 api 各有優缺點,現在用的最多是第二種 api,sql 和 table 的還不太成熟,有些還不能實現。

Flink 運行程序多樣化

  部署應用程序在任何地方

      Apache Flink 是一個分佈式系統,需要計算資源才能執行應用程序。Flink 集成了所有常見的集羣資源管理器,如 Hadoop yarn、Apache Mesos 和 Kubernetes,同樣也可以設置爲作爲獨立集羣運行。

      Flink 被設計爲能夠很好地工作於前面列出的每個資源管理器。這是通過特定於資源管理器的部署模式實現的,該模式允許 Flink 以其慣用的方式與每個資源管理器交互。

      在部署 Flink 應用程序時,Flink 根據應用程序配置的並行性自動標識所需的資源,並從資源管理器中請求他們。如果發生故障,Flink 通過請求新的資源來替換失敗的容器。所有提交或控制應用程序的通信都是通過 REST 調用進行的。這簡化了 Flink 集成的難度。

  以任何規模運行應用程序

      Flink 設計用於在任何規模上運行狀態流應用程序。應用程序可能被並行化爲數千個任務,這些任務分佈在集羣中並同時執行。因此,一個應用程序可以利用幾乎無限數量的 cpu、主內存、磁盤和網絡 IO 。此外,Flink 很容易維護非常大的應用程序狀態。它的異步和增量檢查點算法保證一次狀態一致性的同時,確保對處理延遲的影響最小。用戶報告了在他們的生產環境中運行的 Flink 應用程序令人印象深刻的可伸縮數字,例如每天處理數萬億事件的應用程序,維護多個 tb 級狀態的應用程序,以及在數千個內核上的應用程序。

Flink VS Storm VS SparkStreaming

  SparkStreaming

      Spark 已經成爲批處理中 hadoop 的真正繼承者,也是第一個完全支持 Lambda 架構的框架。受到各大企業歡迎,並被廣泛採用。2.0 版本之後,spark 除了 Structured Streaming 之外,還配備了許多優秀的功能,如定製內存管理(與 flink 類似)tungsten、watermarks、event time processing 支持等。結構化流也更抽象,並且可以選擇在微批處理之間切換 2.3.0 版本中的連續流模式。連續流有望像 Storm 和 Flink 那樣提供低延遲,但它仍處於初始階段,需要在操作中進行測試。

      優點:

      支持 Lambda 架構;高吞吐量,適用於不需要低延遲的應用場景;由於微批次性質,默認情況下容錯;簡單易用的高級 API ;社區活躍,且積極的改進;數據處理有且只有一次。

      缺點:

      不是真正的流處理,不適合低延遲要求;要調整的參數太多,很難做到最好;在許多高級功能落後於 Flink;

      備註:

      Watermarks:可以把它理解爲一個水位線,這個 Watermarks 在不斷的變化,一旦 Watermarks 大於了某個 window 的end_time,就會觸發此 window 的計算,Watermarks 就是用來觸發 window 計算的。

  Storm:

      Storm 是最老的流處理框架,技術成熟可靠。社區也很活躍。阿里還開發了 jstorm,對storm 進行了拓展完善,後續 jstorm 也融入到 storm 中,對於 storm 也是一個質的提升。比較適用與基於事件的一些簡單用例場景,極低的延遲,真正的流處理,成熟和高吞吐量,非常適合非複雜的流處理用例。

      缺點:

      不支持狀態管理,沒有事件時間處理,聚合,窗口,會話,水印等高級功能,至少保證一次。

  flink:

      和 Spark 一樣,Flink 也支持 lambda 架構。但是這種方法和實現與 Spark 的方法和實現完全不同。雖然 Spark 實際上是 Spark-Streaming 作爲微批處理和 Spark Batch 特殊情況的批處理,但 Flink 本質上是一個真正的流引擎,將批處理作爲帶有限數據的流的特殊情況。雖然兩個框架中的 API 從開發人員的角度來看都很相似,但它們在實現中沒有任何相似之處。在 Flink 中,map,filter,reduce 等各個函數實現爲長時間運行的運算符(類似於 Storm 中的 Bolt),Flink看起來更像是 Storm 的真正繼承者,就像 Spark 成功批量使用 hadoop 一樣。

      優點:

      開源流處理領域的創新領導者;第一個真正的流處理框架,具有 Event Time Pricessing,Watermarks 等所有高級功能;低延遲,高吞吐量,可根據要求進行配置;自動調整,需要調整的參數較少,調優方便;數據處理有且只有一次,得到想阿里巴巴等大公司的廣泛接受。

      缺點:

      社區沒有 Spark 那麼大,但是正在快速增長;目前還沒有采用 Flink Batch,僅適用於流處理。

      總結:

      所以 sparkstreaming 不是真正的流處理框架,storm 和 flink 是真正的流處理框架,flink 相比較 storm 而言是可以處理批處理的,但是 storm 是不支持批處理的。

Flink 的應用場景

事件驅動

  典型的事件驅動的場景如下:

  1. 欺詐檢測(Fraud detection)如 短信獲取
  2. 異常檢測((Anomaly detection)
  3. 基於規則的警告(Rule-based alerting)
  4. 業務流程監控(Business process monitoring)
  5. Web 應用程序(社交網絡)如 互相關注,互相@

數據分析

      Data Analytics Applications 包含 Batch analytics (批處理分析) 和 Streaming anlytics (流處理分析)。

      Streaming analytics 可以理解爲連續性查詢:比如實時展示雙十一天貓銷售 GMV,用戶下單數據需要實時寫入消息隊列,Flink 應用源源不斷的讀取數據做實時計算,然後不斷的將數據更新至 Databases 或者 K-VStore,最後做大屏實時展示。

數據管道 ETL

      Data Pipeline Applications 包含 Periodis(週期性)RTL 和 Data Pipeline(管道)。

      Periodic ETL:比如每天凌晨週期性的啓動一個 Flink RTL Job 讀取傳統數據庫中的數據,然後做 ETL ,最後寫入數據庫和文件系統。

      Data Pipeline:比如啓動一個 Flink 實時應用,數據源(比如數據庫、kafka)中的數據不斷通過Flink Data Pipeline 流入或者追加到數據倉庫(數據庫或者文件系統),或者 kafka 消息隊列。

在這裏插入圖片描述
                         Periodic (週期性)ETL和Data Pipeline(管道)在這裏插入圖片描述
                                           具體的應用分析

Flink 部署

standalone 模式

  1. tar -zxvf flink-1.7.0-bin-hadoop27-scala_2.11.tgz 解壓安裝包
  2. 修改 flink/conf/flink-conf.yaml 文件
    jobmanager.rpc.address: hostname
  3. 修改 /conf/slave 文件
    添加集羣中其他虛擬機的 hostname
  4. 分發到另外幾臺
    scp -r /opt/flink hostname:/opt/
  5. 在主節點啓動

    start-cluster.sh

  6. 頁面訪問
    hostname:8081
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章