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

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

0 相關(guān)源碼

1 前言

1.1 功能

1.2 用戶

  • 國(guó)際


  • 國(guó)內(nèi)


1.3 特點(diǎn)

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

1.4 安排

◆ 初識(shí)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í)時(shí)數(shù)據(jù)清洗
  • 使用Flink完成實(shí)時(shí)結(jié)果統(tǒng)計(jì)
  • 統(tǒng)計(jì)結(jié)果可視化展示(Kibana)

1.5 收獲

◆ 系統(tǒng)入門(mén)Flink開(kāi)發(fā)
◆ 掌握應(yīng)用Java SE/Scala的Flink實(shí)現(xiàn)
◆理解Flink項(xiàng)目的開(kāi)發(fā)流程
◆ 快速上手企業(yè)開(kāi)發(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)真閱讀本教程!多思考、多動(dòng)手!
◆合理利用網(wǎng)絡(luò)資源
◆善于提問(wèn):QQ群討論

2 教程大綱

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

Flink概述

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

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

架構(gòu)

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

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

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

  • 無(wú)界流有一個(gè)開(kāi)始但沒(méi)有定義的結(jié)束。它們不會(huì)在生成時(shí)終止并提供數(shù)據(jù)。必須連續(xù)處理無(wú)界流,即必須在攝取之后立即處理事件。無(wú)法等待所有輸入數(shù)據(jù)到達(dá),因?yàn)檩斎胧菬o(wú)界的,并且在任何時(shí)間點(diǎn)都不會(huì)完成。處理無(wú)界數(shù)據(jù)通常要求以特定順序攝取事件,例如事件發(fā)生的順序,以便能夠推斷結(jié)果完整性。

  • 有界流具有定義的開(kāi)始和結(jié)束??梢栽趫?zhí)行任何計(jì)算之前通過(guò)攝取所有數(shù)據(jù)來(lái)處理有界流。處理有界流不需要有序攝取,因?yàn)榭梢允冀K對(duì)有界數(shù)據(jù)集進(jìn)行排序。有界流的處理也稱(chēng)為批處理

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

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

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

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


應(yīng)用

Apache Flink是一個(gè)用于對(duì)無(wú)界和有界數(shù)據(jù)流進(jìn)行有狀態(tài)計(jì)算的框架。 Flink在不同的抽象級(jí)別提供多個(gè)API,并為常見(jiàn)用例提供專(zhuān)用庫(kù)。

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

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

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

顯然,流是流處理的一個(gè)基本方面。但是,流可以具有不同的特征,這些特征會(huì)影響流的處理方式。 Flink是一個(gè)多功能的處理框架,可以處理任何類(lèi)型的流。

  • 有界和無(wú)界流:流可以是無(wú)界的或有界的,即固定大小的數(shù)據(jù)集。 Flink具有處理無(wú)界流的復(fù)雜功能,但也有專(zhuān)門(mén)的運(yùn)營(yíng)商來(lái)有效地處理有界流。
  • 實(shí)時(shí)和記錄的流:所有數(shù)據(jù)都作為流生成。有兩種方法可以處理數(shù)據(jù)。在生成時(shí)實(shí)時(shí)處理它或?qū)⒘鞒志帽4娴酱鎯?chǔ)系統(tǒng),例如文件系統(tǒng)或?qū)ο蟠鎯?chǔ),并在以后處理它。 Flink應(yīng)用程序可以處理記錄或?qū)崟r(shí)流。

狀態(tài)

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


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

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

時(shí)間

時(shí)間是流應(yīng)用程序的另一個(gè)重要組成部分大多數(shù)事件流都具有固有的時(shí)間語(yǔ)義,因?yàn)槊總€(gè)事件都是在特定時(shí)間點(diǎn)生成的。此外,許多常見(jiàn)的流計(jì)算基于時(shí)間,例如窗口聚合,會(huì)話化,模式檢測(cè)和基于時(shí)間的連接。流處理的一個(gè)重要方面是應(yīng)用程序如何測(cè)量時(shí)間,即事件時(shí)間和處理時(shí)間的差異。

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

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

4 Layered APIs

Flink提供三層API。 每個(gè)API在簡(jiǎn)潔性和表達(dá)性之間提供不同的權(quán)衡,并針對(duì)不同的用例。


我們簡(jiǎn)要介紹每個(gè)API,討論其應(yīng)用程序,并顯示代碼示例。

ProcessFunctions

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

以下示例顯示了一個(gè)KeyedProcessFunction,它對(duì)KeyedStream進(jìn)行操作并匹配START和END事件。收到START事件時(shí),該函數(shù)會(huì)記住其狀態(tài)的時(shí)間戳,并在四小時(shí)內(nèi)注冊(cè)一個(gè)計(jì)時(shí)器。如果在計(jì)時(shí)器觸發(fā)之前收到END事件,則該函數(shù)計(jì)算END和START事件之間的持續(xù)時(shí)間,清除狀態(tài)并返回該值。否則,計(jì)時(shí)器只會(huì)觸發(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();
  }
}

該示例說(shuō)明了KeyedProcessFunction的表達(dá)能力,但也強(qiáng)調(diào)了它是一個(gè)相當(dāng)冗長(zhǎng)的接口。

DataStream API

DataStream API為許多常見(jiàn)的流處理操作提供原語(yǔ),例如窗口化,一次記錄轉(zhuǎn)換以及通過(guò)查詢外部數(shù)據(jù)存儲(chǔ)來(lái)豐富事件。 DataStream API可用于Java和Scala,它基于函數(shù),例如map(),reduce()和aggregate()。 可以通過(guò)擴(kuò)展接口或Java或Scala lambda函數(shù)來(lái)定義函數(shù)。

以下示例顯示如何對(duì)點(diǎn)擊流進(jìn)行會(huì)話并計(jì)算每個(gè)會(huì)話的點(diǎn)擊次數(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具有兩個(gè)關(guān)系A(chǔ)PI,Table API和SQL。 這兩個(gè)API都是用于批處理和流處理的統(tǒng)一API,即,在無(wú)界的實(shí)時(shí)流或有界的記錄流上以相同的語(yǔ)義執(zhí)行查詢,并產(chǎn)生相同的結(jié)果。 Table API和SQL利用Apache Calcite進(jìn)行解析,驗(yàn)證和查詢優(yōu)化。 它們可以與DataStream和DataSet API無(wú)縫集成,并支持用戶定義的標(biāo)量,聚合和表值函數(shù)。

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

以下示例顯示用于會(huì)話點(diǎn)擊流的SQL查詢,并計(jì)算每個(gè)會(huì)話的點(diǎn)擊次數(shù)。 這與DataStream API示例中的用例相同。

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

庫(kù)

Flink具有幾個(gè)用于常見(jiàn)數(shù)據(jù)處理用例的庫(kù)。這些庫(kù)通常嵌入在API中,而不是完全獨(dú)立的。因此,他們可以從API的所有功能中受益,并與其他庫(kù)集成。

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

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

  • Gelly:Gelly是一個(gè)可擴(kuò)展的圖形處理和分析庫(kù)。 Gelly在DataSet API之上實(shí)現(xiàn)并與之集成。因此,它受益于其可擴(kuò)展且強(qiáng)大的運(yùn)營(yíng)商。 Gelly具有內(nèi)置算法,例如標(biāo)簽傳播,三角形枚舉和頁(yè)面排名,但也提供了一種Graph API,可以簡(jiǎn)化自定義圖算法的實(shí)現(xiàn)。

5 運(yùn)行多樣化

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

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

Flink旨在很好地運(yùn)作以前列出的每個(gè)資源管理器。
這是通過(guò)特定于資源管理器的部署模式實(shí)現(xiàn)的,這些模式允許Flink以其慣用方式與每個(gè)資源管理器進(jìn)行交互。

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

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

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

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

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

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

7 Flink 使用案例

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

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

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

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

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

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

事件驅(qū)動(dòng)型應(yīng)用是在計(jì)算存儲(chǔ)分離的傳統(tǒng)應(yīng)用基礎(chǔ)上進(jìn)化而來(lái)。在傳統(tǒng)架構(gòu)中,應(yīng)用需要讀寫(xiě)遠(yuǎn)程事務(wù)型數(shù)據(jù)庫(kù)。

相反,事件驅(qū)動(dòng)型應(yīng)用是基于狀態(tài)化流處理來(lái)完成。在該設(shè)計(jì)中,數(shù)據(jù)和計(jì)算不會(huì)分離,應(yīng)用只需訪問(wèn)本地(內(nèi)存或磁盤(pán))即可獲取數(shù)據(jù)。系統(tǒng)容錯(cuò)性的實(shí)現(xiàn)依賴(lài)于定期向遠(yuǎn)程持久化存儲(chǔ)寫(xiě)入 checkpoint。

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


7.1.2 事件驅(qū)動(dòng)型應(yīng)用的優(yōu)勢(shì)?

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

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

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

Flink 中針對(duì)事件驅(qū)動(dòng)應(yīng)用的明星特性當(dāng)屬 savepoint。Savepoint 是一個(gè)一致性的狀態(tài)映像,它可以用來(lái)初始化任意狀態(tài)兼容的應(yīng)用。在完成一次 savepoint 后,即可放心對(duì)應(yīng)用升級(jí)或擴(kuò)容,還可以啟動(dòng)多個(gè)版本的應(yīng)用來(lái)完成 A/B 測(cè)試。

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

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

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

數(shù)據(jù)分析任務(wù)需要從原始數(shù)據(jù)中提取有價(jià)值的信息和指標(biāo)。傳統(tǒng)的分析方式通常是利用批查詢,或?qū)⑹录涗浵聛?lái)并基于此有限數(shù)據(jù)集構(gòu)建應(yīng)用來(lái)完成。為了得到最新數(shù)據(jù)的分析結(jié)果,必須先將它們加入分析數(shù)據(jù)集并重新執(zhí)行查詢或運(yùn)行應(yīng)用,隨后將結(jié)果寫(xiě)入存儲(chǔ)系統(tǒng)或生成報(bào)告。

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

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

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

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

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

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

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

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

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

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

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

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

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

image

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

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

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

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

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

8 Flink發(fā)展趨勢(shì)

X 聯(lián)系我

  • 公眾號(hào)


  • Q群


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 架構(gòu) Apache Flink是一個(gè)框架和分布式處理引擎,用于對(duì)無(wú)界和有界數(shù)據(jù)流進(jìn)行有狀態(tài)計(jì)算。Flink設(shè)計(jì)為在...
    盜夢(mèng)者_(dá)56f2閱讀 38,038評(píng)論 0 6
  • 本文是先介紹 Flink,再說(shuō) Flink的過(guò)去和現(xiàn)在 一、Flink介紹 Flink是一款分布式的計(jì)算引擎,它可...
    生活的探路者閱讀 1,400評(píng)論 0 22
  • 每天手機(jī)占居了我們很多時(shí)間,我身邊很多人(包括我自己)每天都會(huì)看很多來(lái)自各種app或者朋友圈的文章、精彩段落或者別...
    major_arthur閱讀 613評(píng)論 0 0
  • 2016.11.12 光棍節(jié)的第二天,星期六,學(xué)校補(bǔ)課。 自從開(kāi)學(xué)分班后,我就認(rèn)識(shí)了更多的人,隔壁班的,隔樓班的,...
    罷欲閱讀 479評(píng)論 0 0
  • 大家好,我蘿卜和大家聊天,看著手機(jī)還有百分之20的電,想著每天寫(xiě)百字文章 練練手 討論一下這個(gè)簡(jiǎn)書(shū)的平臺(tái) 說(shuō)...
    蘿卜小哥閱讀 127評(píng)論 1 2

友情鏈接更多精彩內(nèi)容