Flink入門介紹和安裝部署、第一個Flink程序WC

1、Flink介紹

1.1 Flink是什麼

Apache官網:
https://flink.apache.org/

Apache Flink® - Stateful Computations over Data Streams 數據流上的有狀態計算
Apache Flink是一個框架和分佈式處理引擎,用於在無界和有界數據流上進行有狀態計算。Flink被設計用於在所有常見的集羣環境中運行,以內存中的速度和任何規模執行計算。
無界:數據流源源不斷的,有開頭,沒有結束
有界:其實就相當於一個批處理,有開頭,有結束
在這裏插入圖片描述
在這裏插入圖片描述
和Spark一樣也支持批處理和流處理
Spark的實時處理:其實是一個小的迷你Batch,Stream是他的特例
Flink的實時處理:剛好和Spark想法,Flink是實時Stream的,Batch是Stream的特例

所有流式用例:
事件驅動的應用程序
流和批分析
數據管道和ETL

保證正確性:
只有一次狀態的一致性
事件時間處理
複雜的後期數據處理

APIs:
SQL on Stream & Batch Data
DataStream API & DataSet API
ProcessFunction (Time & State)

1.2 Flink部署在什麼地方

Flink集成了所有常見的集羣資源管理器,如Hadoop紗線、Apache Mesos和Kubernetes,但也可以設置爲作爲獨立集羣運行。Flink集成了所有常見的集羣資源管理器,如Hadoop YARN、Apache Mesos和Kubernetes,也可以設置爲stand-alone運行。

1.3 Flink編程模型

在這裏插入圖片描述

  • 最低級別抽象只提供有狀態流。它通過Process函數嵌入到DataStream API中。它允許用戶自由處理來自一個或多個流的事件,並使用一致的容錯狀態。此外,用戶可以註冊事件時間和處理時間回調,允許程序實現複雜的計算。
  • 實際上,大多數應用程序不需要上面描述的低層抽象,而是根據核心API (DataStream API(有界/無界流)和DataSet API(有界數據集)進行編程。這些連貫api爲數據處理提供了常見的構建塊,比如用戶指定的各種形式的transformations, joins, aggregations, windows, state等。在這些api中處理的數據類型用各自的編程語言表示爲類。
  • 表API是一個以表爲中心的聲明性DSL,表可以(在表示流時)動態地更改表。表API遵循(擴展的)關係模型:表有一個附加的模式(類似於關係數據庫中的表),而API提供了類似的操作,如select、project、join、group-by、aggregate等。表API程序聲明性地定義應該執行什麼邏輯操作,而不是確切地指定操作代碼的外觀。雖然表API可以通過各種類型的用戶定義函數進行擴展,但是它比核心API更缺乏表現力,但是使用起來更簡潔(編寫的代碼更少)。此外,表API程序還需要經過一個在執行之前應用優化規則的優化器。
    可以在表和DataStream/DataSet之間無縫轉換,允許程序混合表API和DataStream和DataSet API。
  • Flink提供的最高級抽象是SQL。這種抽象在語義和表達性上都類似於表API,但將程序表示爲SQL查詢表達式。SQL抽象與表API緊密交互,SQL查詢可以在表API中定義的表上執行。

1.4 程序和數據流

Flink程序的基本構建塊是流和轉換
在這裏插入圖片描述
Spark:input–>transformation–>action–>output
Flink:source–>transformation–>transformation–>sink

Parallel Dataflows並行數據流
在這裏插入圖片描述

Windows窗口
在這裏插入圖片描述

Time時間
在這裏插入圖片描述
Event Time:是創建事件的時間。
Ingestion time:是事件在進入Flink數據流的時間。
Processing Time:是每個執行的時間。

2、Flink搭建

選擇和hadoop對應的版本,我這裏是hadoop2.6的
在這裏插入圖片描述

3、Maven依賴,寫第一個Flink程序WC

IDEA的pom.xml

<flink.version>1.6.4</flink.version>
<scala.binary.version>2.11</scala.binary.version>

  <dependencies>
    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-scala_${scala.binary.version}</artifactId>
      <version>${flink.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-streaming-scala_${scala.binary.version}</artifactId>
      <version>${flink.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-clients_${scala.binary.version}</artifactId>
      <version>${flink.version}</version>
    </dependency>
package com.ruozedata.flink

import  org.apache.flink.api.scala._
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.streaming.api.windowing.time.Time

object FlinkSocketWCApp {
  def main(args: Array[String]): Unit = {
    //create ENV
    val env=StreamExecutionEnvironment.getExecutionEnvironment

    //source
    val lines=env.socketTextStream("192.168.137.130",9999)

    //transformation
    val results=lines.flatMap(x=>x.split(","))
      .map(x=>WC(x,1))
      .keyBy("word")
      .timeWindow(Time.seconds(4),Time.seconds(2))
      .sum("count")

    //sink
    results.print().setParallelism(1)

    //stop
    env.execute("FlinkSocketWCApp")

  }

  case class WC(word:String,count:Long)

}

開啓nc

[hadoop@vm01 software]$ nc -lk 9999
a,a,a,a
b,b,b,b
c,c,c,c

開啓Flink程序
在這裏插入圖片描述

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