Apache Flink實戰(zhàn)(一) - 初識Flink

了解Flink是什么,F(xiàn)link應(yīng)用程序運行的多樣化,對比業(yè)界常用的流處理框架,F(xiàn)link的發(fā)展趨勢圆丹,F(xiàn)link生態(tài)圈,F(xiàn)link應(yīng)用場景及Flink如何進行高效的Flink學(xué)習(xí)躯喇。

0 相關(guān)源碼

1 前言

1.1 功能

1.2 用戶

  • 國際


  • 國內(nèi)


1.3 特點

◆ 結(jié)合Java辫封、Scala兩種語言
◆ 從基礎(chǔ)到實戰(zhàn)
◆ 系統(tǒng)學(xué)習(xí)Flink的核心知識
◆ 快速完成從入門到上手企業(yè)開發(fā)的能力提升

1.4 安排

◆ 初識Flink
◆ 編程模型及核心概念
◆ DataSet API編程
◆ DataStream API編程
◆ Flink Table&SQL
◆ Window和Time操作
◆ Flink Connectors
◆ Flink部署及作業(yè)提交
◆ Flink監(jiān)控及調(diào)優(yōu)

  • 使用Flink自定義數(shù)據(jù)源讀取配置數(shù)據(jù)
  • 使用Flink完成實時數(shù)據(jù)清洗
  • 使用Flink完成實時結(jié)果統(tǒng)計
  • 統(tǒng)計結(jié)果可視化展示(Kibana)

1.5 收獲

◆ 系統(tǒng)入門Flink開發(fā)
◆ 掌握應(yīng)用Java SE/Scala的Flink實現(xiàn)
◆理解Flink項目的開發(fā)流程
◆ 快速上手企業(yè)開發(fā)

1.6 環(huán)境

◆ Mac OS: 10.14.12
◆ Kafka: 1.1.1
◆ Hadoop : CDH ( 5.15.1)
◆ ES/Kibana : 6+
◆ FXIQ: IDEA
◆ Flink : 1.7

1.7 確保你已掌握

◆ 了解Linux常用基本命令的使用
◆ 熟悉Java SE或Scala的基本使用
◆ 熟悉Hadoop基礎(chǔ)應(yīng)用

1.8 學(xué)習(xí)方法推薦

◆認(rèn)真閱讀本教程!多思考、多動手!
◆合理利用網(wǎng)絡(luò)資源
◆善于提問:QQ群討論

2 教程大綱

◆ Flink概述
◆ Flink應(yīng)用場景
◆ Flink Layer
◆ Flink發(fā) 展趨勢
◆ Flink應(yīng)用程序運行方式多樣化
◆ 如何學(xué)習(xí)Flink
◆ Flink VS Storm VS Spark Streaming

Flink概述

Apache Flink是一個框架和分布式處理引擎,用于對無界和有界數(shù)據(jù)流進行狀態(tài)計算倦微。 Flink設(shè)計為在所有常見的集群環(huán)境中運行檀咙,以內(nèi)存速度和任何規(guī)模執(zhí)行計算。

在這里璃诀,我們解釋Flink架構(gòu)的重要方面。

架構(gòu)

處理無界和有界數(shù)據(jù)

任何類型的數(shù)據(jù)都是作為事件流產(chǎn)生的蔑匣。信用卡交易劣欢,傳感器測量,機器日志或網(wǎng)站或移動應(yīng)用程序上的用戶交互裁良,所有這些數(shù)據(jù)都作為流生成凿将。

數(shù)據(jù)可以作為無界或有界流處理。

  • 無界流有一個開始但沒有定義的結(jié)束价脾。它們不會在生成時終止并提供數(shù)據(jù)牧抵。必須連續(xù)處理無界流,即必須在攝取之后立即處理事件侨把。無法等待所有輸入數(shù)據(jù)到達犀变,因為輸入是無界的,并且在任何時間點都不會完成秋柄。處理無界數(shù)據(jù)通常要求以特定順序攝取事件获枝,例如事件發(fā)生的順序,以便能夠推斷結(jié)果完整性骇笔。

  • 有界流具有定義的開始和結(jié)束省店。可以在執(zhí)行任何計算之前通過攝取所有數(shù)據(jù)來處理有界流笨触。處理有界流不需要有序攝取懦傍,因為可以始終對有界數(shù)據(jù)集進行排序。有界流的處理也稱為批處理

  • Apache Flink擅長處理無界和有界數(shù)據(jù)集芦劣。精確控制時間和狀態(tài)使Flink的運行時能夠在無界流上運行任何類型的應(yīng)用程序粗俱。有界流由算法和數(shù)據(jù)結(jié)構(gòu)內(nèi)部處理,這些算法和數(shù)據(jù)結(jié)構(gòu)專為固定大小的數(shù)據(jù)集而設(shè)計虚吟,從而產(chǎn)生出色的性能源梭。

通過探索在Flink之上構(gòu)建的用例來說服自己。

利用內(nèi)存中性能

有狀態(tài)Flink應(yīng)用程序針對本地狀態(tài)訪問進行了優(yōu)化稍味。任務(wù)狀態(tài)始終保留在內(nèi)存中废麻,如果狀態(tài)大小超過可用內(nèi)存,則保存在訪問高效的磁盤上數(shù)據(jù)結(jié)構(gòu)中模庐。因此烛愧,任務(wù)通過訪問本地(通常是內(nèi)存中)狀態(tài)來執(zhí)行所有計算,從而產(chǎn)生非常低的處理延遲。 Flink通過定期和異步地將本地狀態(tài)檢查點到持久存儲來保證在出現(xiàn)故障時的一次狀態(tài)一致性怜姿。


應(yīng)用

Apache Flink是一個用于對無界和有界數(shù)據(jù)流進行有狀態(tài)計算的框架慎冤。 Flink在不同的抽象級別提供多個API,并為常見用例提供專用庫沧卢。

在這里蚁堤,我們介紹Flink易于使用和富有表現(xiàn)力的API和庫。

流媒體應(yīng)用程序的構(gòu)建塊

可以由流處理框架構(gòu)建和執(zhí)行的應(yīng)用程序類型由框架控制流但狭,狀態(tài)和時間的程度來定義披诗。在下文中,我們描述了流處理應(yīng)用程序的這些構(gòu)建塊立磁,并解釋了Flink處理它們的方法呈队。

顯然,流是流處理的一個基本方面唱歧。但是宪摧,流可以具有不同的特征,這些特征會影響流的處理方式颅崩。 Flink是一個多功能的處理框架几于,可以處理任何類型的流。

  • 有界和無界流:流可以是無界的或有界的沿后,即固定大小的數(shù)據(jù)集孩革。 Flink具有處理無界流的復(fù)雜功能,但也有專門的運營商來有效地處理有界流得运。
  • 實時和記錄的流:所有數(shù)據(jù)都作為流生成膝蜈。有兩種方法可以處理數(shù)據(jù)。在生成時實時處理它或?qū)⒘鞒志帽4娴酱鎯ο到y(tǒng)熔掺,例如文件系統(tǒng)或?qū)ο蟠鎯Ρゲ⒃谝院筇幚硭?Flink應(yīng)用程序可以處理記錄或?qū)崟r流。

狀態(tài)

每個非平凡的流應(yīng)用程序都是有狀態(tài)的置逻,即推沸,只有對各個事件應(yīng)用轉(zhuǎn)換的應(yīng)用程序不需要狀態(tài)。運行基本業(yè)務(wù)邏輯的任何應(yīng)用程序都需要記住事件或中間結(jié)果券坞,以便在以后的時間點訪問它們鬓催,例如在收到下一個事件時或在特定持續(xù)時間之后。


應(yīng)用狀態(tài)是Flink的一等公民恨锚。您可以通過查看Flink在狀態(tài)處理環(huán)境中提供的所有功能來查看宇驾。

  • 多狀態(tài)基元:Flink為不同的數(shù)據(jù)結(jié)構(gòu)提供狀態(tài)基元,例如原子值猴伶,列表或映射课舍。開發(fā)人員可以根據(jù)函數(shù)的訪問模式選擇最有效的狀態(tài)原語塌西。
  • 可插拔狀態(tài)后端:應(yīng)用程序狀態(tài)由可插拔狀態(tài)后端管理和檢查點。 Flink具有不同的狀態(tài)后端筝尾,可以在內(nèi)存或RocksDB中存儲狀態(tài)捡需,RocksDB是一種高效的嵌入式磁盤數(shù)據(jù)存儲。也可以插入自定義狀態(tài)后端筹淫。
  • 完全一次的狀態(tài)一致性:Flink的檢查點和恢復(fù)算法可確保在發(fā)生故障時應(yīng)用程序狀態(tài)的一致性站辉。因此,故障是透明處理的损姜,不會影響應(yīng)用程序的正確性饰剥。
  • 非常大的狀態(tài):由于其異步和增量檢查點算法,F(xiàn)link能夠維持幾兆兆字節(jié)的應(yīng)用程序狀態(tài)薛匪。
    可擴展的應(yīng)用程序:Flink通過將狀態(tài)重新分配給更多或更少的工作人員來支持有狀態(tài)應(yīng)用程序的擴展。

時間

時間是流應(yīng)用程序的另一個重要組成部分大多數(shù)事件流都具有固有的時間語義脓鹃,因為每個事件都是在特定時間點生成的逸尖。此外,許多常見的流計算基于時間瘸右,例如窗口聚合娇跟,會話化,模式檢測和基于時間的連接太颤。流處理的一個重要方面是應(yīng)用程序如何測量時間苞俘,即事件時間和處理時間的差異。

Flink提供了一組豐富的與時間相關(guān)的功能龄章。

  • 事件時間模式:使用事件時間語義處理流的應(yīng)用程序根據(jù)事件的時間戳計算結(jié)果吃谣。因此,無論是否處理記錄的或?qū)崟r的事件做裙,事件時間處理都允許準(zhǔn)確和一致的結(jié)果岗憋。
  • 水印支持:Flink使用水印來推斷事件時間應(yīng)用中的時間。水印也是一種靈活的機制锚贱,可以權(quán)衡結(jié)果的延遲和完整性仔戈。
  • 延遲數(shù)據(jù)處理:當(dāng)使用水印在事件 - 時間模式下處理流時,可能會在所有相關(guān)事件到達之前完成計算拧廊。這類事件被稱為遲發(fā)事件监徘。 Flink具有多個選項來處理延遲事件,例如通過側(cè)輸出重新路由它們以及更新以前完成的結(jié)果吧碾。
  • 處理時間模式:除了事件時間模式之外凰盔,F(xiàn)link還支持處理時間語義,該處理時間語義執(zhí)行由處理機器的掛鐘時間觸發(fā)的計算倦春。處理時間模式適用于具有嚴(yán)格的低延遲要求的某些應(yīng)用廊蜒,這些要求可以容忍近似結(jié)果趴拧。

4 Layered APIs

Flink提供三層API。 每個API在簡潔性和表達性之間提供不同的權(quán)衡山叮,并針對不同的用例著榴。


我們簡要介紹每個API,討論其應(yīng)用程序屁倔,并顯示代碼示例脑又。

ProcessFunctions

ProcessFunctions是Flink提供的最具表現(xiàn)力的功能接口。 Flink提供ProcessFunction來處理來自窗口中分組的一個或兩個輸入流或事件的單個事件锐借。 ProcessFunctions提供對時間和狀態(tài)的細(xì)粒度控制问麸。 ProcessFunction可以任意修改其狀態(tài)并注冊將在未來觸發(fā)回調(diào)函數(shù)的定時器。因此钞翔,ProcessFunctions可以根據(jù)許多有狀態(tài)事件驅(qū)動的應(yīng)用程序的需要實現(xiàn)復(fù)雜的每事件業(yè)務(wù)邏輯严卖。

以下示例顯示了一個KeyedProcessFunction,它對KeyedStream進行操作并匹配START和END事件布轿。收到START事件時哮笆,該函數(shù)會記住其狀態(tài)的時間戳,并在四小時內(nèi)注冊一個計時器汰扭。如果在計時器觸發(fā)之前收到END事件稠肘,則該函數(shù)計算END和START事件之間的持續(xù)時間,清除狀態(tài)并返回該值萝毛。否則项阴,計時器只會觸發(fā)并清除狀態(tài)。

/**
 * Matches keyed START and END events and computes the difference between 
 * both elements' timestamps. The first String field is the key attribute, 
 * the second String attribute marks START and END events.
 */
public static class StartEndDuration
    extends KeyedProcessFunction<String, Tuple2<String, String>, Tuple2<String, Long>> {

  private ValueState<Long> startTime;

  @Override
  public void open(Configuration conf) {
    // obtain state handle
    startTime = getRuntimeContext()
      .getState(new ValueStateDescriptor<Long>("startTime", Long.class));
  }

  /** Called for each processed event. */
  @Override
  public void processElement(
      Tuple2<String, String> in,
      Context ctx,
      Collector<Tuple2<String, Long>> out) throws Exception {

    switch (in.f1) {
      case "START":
        // set the start time if we receive a start event.
        startTime.update(ctx.timestamp());
        // register a timer in four hours from the start event.
        ctx.timerService()
          .registerEventTimeTimer(ctx.timestamp() + 4 * 60 * 60 * 1000);
        break;
      case "END":
        // emit the duration between start and end event
        Long sTime = startTime.value();
        if (sTime != null) {
          out.collect(Tuple2.of(in.f0, ctx.timestamp() - sTime));
          // clear the state
          startTime.clear();
        }
      default:
        // do nothing
    }
  }

  /** Called when a timer fires. */
  @Override
  public void onTimer(
      long timestamp,
      OnTimerContext ctx,
      Collector<Tuple2<String, Long>> out) {

    // Timeout interval exceeded. Cleaning up the state.
    startTime.clear();
  }
}

該示例說明了KeyedProcessFunction的表達能力笆包,但也強調(diào)了它是一個相當(dāng)冗長的接口环揽。

DataStream API

DataStream API為許多常見的流處理操作提供原語,例如窗口化庵佣,一次記錄轉(zhuǎn)換以及通過查詢外部數(shù)據(jù)存儲來豐富事件薯演。 DataStream API可用于Java和Scala,它基于函數(shù)秧了,例如map()跨扮,reduce()和aggregate()。 可以通過擴展接口或Java或Scala lambda函數(shù)來定義函數(shù)验毡。

以下示例顯示如何對點擊流進行會話并計算每個會話的點擊次數(shù)衡创。

// a stream of website clicks
DataStream<Click> clicks = ...

DataStream<Tuple2<String, Long>> result = clicks
  // project clicks to userId and add a 1 for counting
  .map(
    // define function by implementing the MapFunction interface.
    new MapFunction<Click, Tuple2<String, Long>>() {
      @Override
      public Tuple2<String, Long> map(Click click) {
        return Tuple2.of(click.userId, 1L);
      }
    })
  // key by userId (field 0)
  .keyBy(0)
  // define session window with 30 minute gap
  .window(EventTimeSessionWindows.withGap(Time.minutes(30L)))
  // count clicks per session. Define function as lambda function.
  .reduce((a, b) -> Tuple2.of(a.f0, a.f1 + b.f1));

SQL & Table API

Flink具有兩個關(guān)系A(chǔ)PI,Table API和SQL晶通。 這兩個API都是用于批處理和流處理的統(tǒng)一API璃氢,即,在無界的實時流或有界的記錄流上以相同的語義執(zhí)行查詢狮辽,并產(chǎn)生相同的結(jié)果一也。 Table API和SQL利用Apache Calcite進行解析巢寡,驗證和查詢優(yōu)化。 它們可以與DataStream和DataSet API無縫集成椰苟,并支持用戶定義的標(biāo)量抑月,聚合和表值函數(shù)。

Flink的關(guān)系A(chǔ)PI旨在簡化數(shù)據(jù)分析舆蝴,數(shù)據(jù)流水線和ETL應(yīng)用程序的定義谦絮。

以下示例顯示用于會話點擊流的SQL查詢,并計算每個會話的點擊次數(shù)洁仗。 這與DataStream API示例中的用例相同层皱。

SELECT userId, COUNT(*)
FROM clicks
GROUP BY SESSION(clicktime, INTERVAL '30' MINUTE), userId

Flink具有幾個用于常見數(shù)據(jù)處理用例的庫。這些庫通常嵌入在API中赠潦,而不是完全獨立的叫胖。因此,他們可以從API的所有功能中受益她奥,并與其他庫集成瓮增。

  • 復(fù)雜事件處理(CEP):模式檢測是事件流處理的一個非常常見的用例。 Flink的CEP庫提供了一個API來指定事件模式(想想正則表達式或狀態(tài)機)方淤。 CEP庫與Flink的DataStream API集成钉赁,以便在DataStream上評估模式蹄殃。 CEP庫的應(yīng)用包括網(wǎng)絡(luò)入侵檢測携茂,業(yè)務(wù)流程監(jiān)控和欺詐檢測。

  • DataSet API:DataSet API是Flink用于批處理應(yīng)用程序的核心API诅岩。 DataSet API的原語包括map讳苦,reduce,(外部)join吩谦,co-group和iterate鸳谜。所有操作都由算法和數(shù)據(jù)結(jié)構(gòu)支持,這些算法和數(shù)據(jù)結(jié)構(gòu)對內(nèi)存中的序列化數(shù)據(jù)進行操作式廷,并在數(shù)據(jù)大小超過內(nèi)存預(yù)算時溢出到磁盤咐扭。 Flink的DataSet API的數(shù)據(jù)處理算法受到傳統(tǒng)數(shù)據(jù)庫運算符的啟發(fā),例如混合散列連接或外部合并排序滑废。

  • Gelly:Gelly是一個可擴展的圖形處理和分析庫蝗肪。 Gelly在DataSet API之上實現(xiàn)并與之集成。因此蠕趁,它受益于其可擴展且強大的運營商薛闪。 Gelly具有內(nèi)置算法,例如標(biāo)簽傳播俺陋,三角形枚舉和頁面排名豁延,但也提供了一種Graph API昙篙,可以簡化自定義圖算法的實現(xiàn)。

5 運行多樣化

5.1 隨處部署應(yīng)用程序

Apache Flink是一個分布式系統(tǒng)诱咏,需要計算資源才能執(zhí)行應(yīng)用程序苔可。
Flink與所有常見的集群資源管理器(如Hadoop YARN,Apache Mesos和Kubernetes)集成胰苏,但也可以設(shè)置為作為獨立集群運行硕蛹。

Flink旨在很好地運作以前列出的每個資源管理器。
這是通過特定于資源管理器的部署模式實現(xiàn)的硕并,這些模式允許Flink以其慣用方式與每個資源管理器進行交互法焰。

部署Flink應(yīng)用程序時倔毙,F(xiàn)link會根據(jù)應(yīng)用程序配置的并行性自動識別所需資源,并從資源管理器請求它們陕赃。
如果發(fā)生故障,F(xiàn)link會通過請求新資源來替換發(fā)生故障的容器么库。提交或控制應(yīng)用程序的所有通信都通過REST調(diào)用。
這簡化了Flink在許多環(huán)境中的集成葡缰。

5.2 以任何規(guī)模運行應(yīng)用程序

Flink旨在以任何規(guī)模運行有狀態(tài)流應(yīng)用程序。
應(yīng)用程序并行化為數(shù)千個在集群中分布和同時執(zhí)行的任務(wù)泛释。因此温算,應(yīng)用程序可以利用幾乎無限量的CPU,主內(nèi)存注竿,磁盤和網(wǎng)絡(luò)IO。而且巩割,F(xiàn)link很容易保持非常大的應(yīng)用程序狀態(tài)。其異步和增量檢查點算法確保對處理延遲的影響最小喂分,同時保證一次性狀態(tài)一致性锦庸。

用戶報告了在其生產(chǎn)環(huán)境中運行的Flink應(yīng)用程序令人印象深刻的可擴展性數(shù)字,例如

  • 應(yīng)用程序每天處理數(shù)萬億個事件蒲祈,
  • 應(yīng)用程序維護多個TB的狀態(tài)
  • 運行在數(shù)千個核心上的應(yīng)用程序

6 業(yè)界流處理框架對比

7 Flink 使用案例

Apache Flink 功能強大甘萧,支持開發(fā)和運行多種不同種類的應(yīng)用程序萝嘁。它的主要特性包括:批流一體化、精密的狀態(tài)管理扬卷、事件時間支持以及精確一次的狀態(tài)一致性保障等牙言。
Flink 不僅可以運行在包括 YARN、 Mesos怪得、Kubernetes 在內(nèi)的多種資源管理框架上咱枉,還支持在裸機集群上獨立部署。
在啟用高可用選項的情況下徒恋,它不存在單點失效問題蚕断。事實證明,F(xiàn)link 已經(jīng)可以擴展到數(shù)千核心入挣,其狀態(tài)可以達到 TB 級別亿乳,且仍能保持高吞吐、低延遲的特性径筏。世界各地有很多要求嚴(yán)苛的流處理應(yīng)用都運行在 Flink 之上葛假。

接下來我們將介紹 Flink 常見的幾類應(yīng)用并給出相關(guān)實例鏈接。

  • [事件驅(qū)動型應(yīng)用]
  • [數(shù)據(jù)分析應(yīng)用]
  • [數(shù)據(jù)管道應(yīng)用]

7.1 事件驅(qū)動型應(yīng)用

7.1.1 什么是事件驅(qū)動型應(yīng)用滋恬?

事件驅(qū)動型應(yīng)用是一類具有狀態(tài)的應(yīng)用聊训,它從一個或多個事件流提取數(shù)據(jù),并根據(jù)到來的事件觸發(fā)計算恢氯、狀態(tài)更新或其他外部動作带斑。

事件驅(qū)動型應(yīng)用是在計算存儲分離的傳統(tǒng)應(yīng)用基礎(chǔ)上進化而來。在傳統(tǒng)架構(gòu)中酿雪,應(yīng)用需要讀寫遠程事務(wù)型數(shù)據(jù)庫侄刽。

相反,事件驅(qū)動型應(yīng)用是基于狀態(tài)化流處理來完成醋安。在該設(shè)計中墓毒,數(shù)據(jù)和計算不會分離所计,應(yīng)用只需訪問本地(內(nèi)存或磁盤)即可獲取數(shù)據(jù)。系統(tǒng)容錯性的實現(xiàn)依賴于定期向遠程持久化存儲寫入 checkpoint叭首。

  • 傳統(tǒng)應(yīng)用和事件驅(qū)動型應(yīng)用架構(gòu)的區(qū)別


7.1.2 事件驅(qū)動型應(yīng)用的優(yōu)勢焙格?

事件驅(qū)動型應(yīng)用無須查詢遠程數(shù)據(jù)庫眷唉,本地數(shù)據(jù)訪問使得它具有更高的吞吐和更低的延遲冬阳。而由于定期向遠程持久化存儲的 checkpoint 工作可以異步、增量式完成笆焰,因此對于正常事件處理的影響甚微嚷掠。事件驅(qū)動型應(yīng)用的優(yōu)勢不僅限于本地數(shù)據(jù)訪問不皆。傳統(tǒng)分層架構(gòu)下霹娄,通常多個應(yīng)用會共享同一個數(shù)據(jù)庫犬耻,因而任何對數(shù)據(jù)庫自身的更改(例如:由應(yīng)用更新或服務(wù)擴容導(dǎo)致數(shù)據(jù)布局發(fā)生改變)都需要謹(jǐn)慎協(xié)調(diào)执泰。反觀事件驅(qū)動型應(yīng)用术吝,由于只需考慮自身數(shù)據(jù)排苍,因此在更改數(shù)據(jù)表示或服務(wù)擴容時所需的協(xié)調(diào)工作將大大減少淘衙。

7.1.3 Flink 如何支持事件驅(qū)動型應(yīng)用?

事件驅(qū)動型應(yīng)用會受制于底層流處理系統(tǒng)對時間和狀態(tài)的把控能力西壮,F(xiàn)link 諸多優(yōu)秀特質(zhì)都是圍繞這些方面來設(shè)計的款青。
它提供了一系列豐富的狀態(tài)操作原語霍狰,允許以精確一次的一致性語義合并海量規(guī)模(TB 級別)的狀態(tài)數(shù)據(jù)蔗坯。
此外宾濒,F(xiàn)link 還支持事件時間和自由度極高的定制化窗口邏輯,而且它內(nèi)置的 ProcessFunction 支持細(xì)粒度時間控制橘忱,方便實現(xiàn)一些高級業(yè)務(wù)邏輯钝诚。
同時凝颇,F(xiàn)link 還擁有一個復(fù)雜事件處理(CEP)類庫拧略,可以用來檢測數(shù)據(jù)流中的模式垫蛆。

Flink 中針對事件驅(qū)動應(yīng)用的明星特性當(dāng)屬 savepoint月褥。Savepoint 是一個一致性的狀態(tài)映像瓢喉,它可以用來初始化任意狀態(tài)兼容的應(yīng)用栓票。在完成一次 savepoint 后走贪,即可放心對應(yīng)用升級或擴容,還可以啟動多個版本的應(yīng)用來完成 A/B 測試继找。

典型的事件驅(qū)動型應(yīng)用實例

數(shù)據(jù)分析應(yīng)用

什么是數(shù)據(jù)分析應(yīng)用婴渡?

數(shù)據(jù)分析任務(wù)需要從原始數(shù)據(jù)中提取有價值的信息和指標(biāo)边臼。傳統(tǒng)的分析方式通常是利用批查詢柠并,或?qū)⑹录涗浵聛聿⒒诖擞邢迶?shù)據(jù)集構(gòu)建應(yīng)用來完成臼予。為了得到最新數(shù)據(jù)的分析結(jié)果瘟栖,必須先將它們加入分析數(shù)據(jù)集并重新執(zhí)行查詢或運行應(yīng)用半哟,隨后將結(jié)果寫入存儲系統(tǒng)或生成報告签餐。

借助一些先進的流處理引擎氯檐,還可以實時地進行數(shù)據(jù)分析冠摄。和傳統(tǒng)模式下讀取有限數(shù)據(jù)集不同河泳,流式查詢或應(yīng)用會接入實時事件流,并隨著事件消費持續(xù)產(chǎn)生和更新結(jié)果薄霜。這些結(jié)果數(shù)據(jù)可能會寫入外部數(shù)據(jù)庫系統(tǒng)或以內(nèi)部狀態(tài)的形式維護惰瓜。儀表展示應(yīng)用可以相應(yīng)地從外部數(shù)據(jù)庫讀取數(shù)據(jù)或直接查詢應(yīng)用的內(nèi)部狀態(tài)崎坊。

如下圖所示奈揍,Apache Flink 同時支持流式及批量分析應(yīng)用打月。

流式分析應(yīng)用的優(yōu)勢奏篙?

和批量分析相比拥刻,由于流式分析省掉了周期性的數(shù)據(jù)導(dǎo)入和查詢過程兵迅,因此從事件中獲取指標(biāo)的延遲更低酌毡。不僅如此话原,批量查詢必須處理那些由定期導(dǎo)入和輸入有界性導(dǎo)致的人工數(shù)據(jù)邊界繁仁,而流式查詢則無須考慮該問題黄虱。

另一方面捻浦,流式分析會簡化應(yīng)用抽象。批量查詢的流水線通常由多個獨立部件組成昧识,需要周期性地調(diào)度提取數(shù)據(jù)和執(zhí)行查詢滞诺。如此復(fù)雜的流水線操作起來并不容易环疼,一旦某個組件出錯將會影響流水線的后續(xù)步驟炫隶。而流式分析應(yīng)用整體運行在 Flink 之類的高端流處理系統(tǒng)之上伪阶,涵蓋了從數(shù)據(jù)接入到連續(xù)結(jié)果計算的所有步驟,因此可以依賴底層引擎提供的故障恢復(fù)機制斟湃。

Flink 如何支持?jǐn)?shù)據(jù)分析類應(yīng)用凝赛?

Flink 為持續(xù)流式分析和批量分析都提供了良好的支持墓猎。具體而言毙沾,它內(nèi)置了一個符合 ANSI 標(biāo)準(zhǔn)的 SQL 接口左胞,將批举户、流查詢的語義統(tǒng)一起來敛摘。無論是在記錄事件的靜態(tài)數(shù)據(jù)集上還是實時事件流上兄淫,相同 SQL 查詢都會得到一致的結(jié)果。同時 Flink 還支持豐富的用戶自定義函數(shù)慨丐,允許在 SQL 中執(zhí)行定制化代碼房揭。如果還需進一步定制邏輯,可以利用 Flink DataStream API 和 DataSet API 進行更低層次的控制恬砂。此外泻骤,F(xiàn)link 的 Gelly 庫為基于批量數(shù)據(jù)集的大規(guī)模高性能圖分析提供了算法和構(gòu)建模塊支持狱掂。

典型的數(shù)據(jù)分析應(yīng)用實例

數(shù)據(jù)管道應(yīng)用

什么是數(shù)據(jù)管道趋惨?

提取-轉(zhuǎn)換-加載(ETL)是一種在存儲系統(tǒng)之間進行數(shù)據(jù)轉(zhuǎn)換和遷移的常用方法器虾。ETL 作業(yè)通常會周期性地觸發(fā)曾撤,將數(shù)據(jù)從事務(wù)型數(shù)據(jù)庫拷貝到分析型數(shù)據(jù)庫或數(shù)據(jù)倉庫晕粪。

數(shù)據(jù)管道和 ETL 作業(yè)的用途相似,都可以轉(zhuǎn)換装悲、豐富數(shù)據(jù)尚氛,并將其從某個存儲系統(tǒng)移動到另一個阅嘶。但數(shù)據(jù)管道是以持續(xù)流模式運行讯柔,而非周期性觸發(fā)魂迄。因此它支持從一個不斷生成數(shù)據(jù)的源頭讀取記錄,并將它們以低延遲移動到終點熊昌。例如:數(shù)據(jù)管道可以用來監(jiān)控文件系統(tǒng)目錄中的新文件,并將其數(shù)據(jù)寫入事件日志灭美;另一個應(yīng)用可能會將事件流物化到數(shù)據(jù)庫或增量構(gòu)建和優(yōu)化查詢索引冲粤。

下圖描述了周期性 ETL 作業(yè)和持續(xù)數(shù)據(jù)管道的差異页眯。

image

數(shù)據(jù)管道的優(yōu)勢?

和周期性 ETL 作業(yè)相比襟铭,持續(xù)數(shù)據(jù)管道可以明顯降低將數(shù)據(jù)移動到目的端的延遲寒砖。此外哩都,由于它能夠持續(xù)消費和發(fā)送數(shù)據(jù),因此用途更廣咐汞,支持用例更多化撕。

Flink 如何支持?jǐn)?shù)據(jù)管道應(yīng)用植阴?

很多常見的數(shù)據(jù)轉(zhuǎn)換和增強操作可以利用 Flink 的 SQL 接口(或 Table API)及用戶自定義函數(shù)解決掠手。如果數(shù)據(jù)管道有更高級的需求惨撇,可以選擇更通用的 DataStream API 來實現(xiàn)府寒。Flink 為多種數(shù)據(jù)存儲系統(tǒng)(如:Kafka、Kinesis剖淀、Elasticsearch纵隔、JDBC數(shù)據(jù)庫系統(tǒng)等)內(nèi)置了連接器捌刮。同時它還提供了文件系統(tǒng)的連續(xù)型數(shù)據(jù)源及數(shù)據(jù)匯绅作,可用來監(jiān)控目錄變化和以時間分區(qū)的方式寫入文件。

典型的數(shù)據(jù)管道應(yīng)用實例

8 Flink發(fā)展趨勢

X 聯(lián)系我

  • 公眾號


  • Q群


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末眯杏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子茫经,更是在濱河造成了極大的恐慌科平,老刑警劉巖瞪慧,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弃酌,死亡現(xiàn)場離奇詭異妓湘,居然都是意外死亡榜贴,警方通過查閱死者的電腦和手機妹田,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霜浴,“玉大人蓝纲,你說我怎么就攤上這事∮浪浚” “怎么了类溢?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵露懒,是天一觀的道長懈词。 經(jīng)常有香客問我坎弯,道長抠忘,這世上最難降的妖魔是什么外永? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任囚灼,我火速辦了婚禮祭衩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蝎抽。我一直安慰自己樟结,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布层坠。 她就那樣靜靜地躺著破花,像睡著了一般座每。 火紅的嫁衣襯著肌膚如雪摘悴。 梳的紋絲不亂的頭發(fā)上蹂喻,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天孵运,我揣著相機與錄音蔓彩,去河邊找鬼。 笑死旷赖,一個胖子當(dāng)著我的面吹牛等孵,可吹牛的內(nèi)容都是我干的逞壁。 我是一名探鬼主播腌闯,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼姿骏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蘸泻?” 一聲冷哼從身側(cè)響起悦施,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤抡诞,失蹤者是張志新(化名)和其女友劉穎昼汗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛙吏,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年馁龟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片却音。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡阿纤,死狀恐怖欠拾,靈堂內(nèi)的尸體忽然破棺而出藐窄,到底是詐尸還是另有隱情荆忍,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布叽唱,位于F島的核電站棺亭,受9級特大地震影響侦铜,放射性物質(zhì)發(fā)生泄漏钉稍。R本人自食惡果不足惜棺耍,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一俊卤、第九天 我趴在偏房一處隱蔽的房頂上張望消恍。 院中可真熱鬧狠怨,春花似錦佣赖、人聲如沸记盒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晚胡。三九已至,卻和暖如春估盘,著一層夾襖步出監(jiān)牢的瞬間瓷患,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工遣妥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留擅编,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓箫踩,卻偏偏與公主長得像爱态,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子境钟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容