日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Flink DataStream 编程入门

發布時間:2023/11/30 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flink DataStream 编程入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

流處理是 Flink 的核心,流處理的數據集用 DataStream 表示。數據流從可以從各種各樣的數據源中創建(消息隊列、Socket 和 文件等),經過 DataStream 的各種 transform 操作,最終輸出文件或者標準輸出。這個過程跟之前文章中介紹的 Flink 程序基本骨架一樣。本篇介紹 DataStream 相關的入門知識。

Flink 101

為了學習 Flink 的朋友能查看到每個例子的源碼,我創建了一個 GitHub 項目:github.com/duma-repo/a… 這里會存放每一篇文章比較重要的示例的源碼,目前支持 Java 和 Scala,仍在不斷完善中。代碼下載后可以在本地運行,也可以打包放在集群上運行。同時,歡迎各位將優質的資源提交到項目中。

簡單示例

import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.windowing.time.Time; import org.apache.flink.util.Collector;public class WindowWordCount {public static void main(String[] args) throws Exception {StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();DataStream<Tuple2<String, Integer>> dataStream = env.socketTextStream("localhost", 9999).flatMap(new Splitter()).keyBy(0).timeWindow(Time.seconds(5)).sum(1);dataStream.print();env.execute("Window WordCount");}public static class Splitter implements FlatMapFunction<String, Tuple2<String, Integer>> {@Overridepublic void flatMap(String sentence, Collector<Tuple2<String, Integer>> out) throws Exception {for (String word: sentence.split(" ")) {out.collect(new Tuple2<String, Integer>(word, 1)); //空格分割后,每個單詞轉換成 (word, 1) 二元組輸出}}}}復制代碼

這個例子跟之間介紹 WordCount 的例子類似,這里詳細介紹下涉及的 API 和含義

  • 數據源:socketTextStream 是從 socket 創建的數據流,可以使用 nc -l 9000 創建 socket 客戶端發送數據
  • transform:flatMap 將輸入的數據按照空格分割后,扁平化處理(flat即為扁平的意思);keyBy 會按照指定的 key 進行分組,這里就是將單詞作為 key;timeWindow 指定時間窗口,這里是 5s 處理一次;sum 是聚合函數,將分組好的單詞個數求和
  • 輸出:print 將處理完的數據輸出到標準輸出流中,可以在控制臺看到輸出的結果。調用 execute 方法提交 Job

Data Source

經過以上的介紹,我們知道常見的數據源有 socket、消息隊列和文件等。對于常見的數據源 Flink 已經定義好了讀取函數,接下來一一介紹。

基于文件

  • readTextFile(path):讀文本文件,默認是文件類型是 TextInputFormat,并且返回類型是 String
  • readFile(fileInputFormat, path):讀文件,需要指定輸入文件的格式
  • readFile(fileInputFormat, path, watchType, interval, typeInfo):以上兩個方法內部都會調用這個方法,參數說明:
    • fileInputFormat - 輸入文件的類型
    • path - 輸入文件路徑
    • watchType - 取值為 FileProcessingMode.PROCESS_CONTINUOUSLY 和 FileProcessingMode.PROCESS_ONCE
      • FileProcessingMode.PROCESS_CONTINUOUSLY - 當輸入路徑下有文件被修改,整個路徑下內容將會被重新處理
      • FileProcessingMode.PROCESS_ONCE - 只掃描一次,便退出。因此這種模式下輸入數據只讀取一次
    • interval - 依賴 watchType 參數,對于 FileProcessingMode.PROCESS_CONTINUOUSLY 每隔固定時間(單位:毫秒)檢測路徑下是否有新數據
    • typeInfo - 返回數據的類型

需要注意,在底層 Flink 將讀文件的過程分為兩個子任務 —— 文件監控和數據讀取(reader)。監控任務由 1 個 task 實現,而讀取的任務由多個 task 實現,數量與 Job 的并行度相同。監控任務的作用是掃描輸入路徑(周期性或者只掃描一次,取決于 watchType),當數據可以被處理時,會將數據分割成多個分片,將分片分配給下游的 reader 。一個分片只會被一個 reader 讀取,一個 reader 可以讀取多個分片。

基于 Socket

  • socketTextStream:從 socket 數據流中讀數據

基于 Collection

  • fromCollection(Collection):從 Java.util.Collection 類型的數據中創建輸入流,collection 中的所有元素類型必須相同
  • fromCollection(Iterator, Class):從 iterator (迭代器)中創建輸入流,Class 參數指定從 iterator 中的數據類型
  • fromElements(T ...):從給定的參數中創建輸入流, 所有參數類型必須相同
  • fromParallelCollection(SplittableIterator, Class):從 iterator 中創建并行的輸入流,Class 指定 iterator 中的數據類型
  • generateSequence(from, to):從 from 至 to 之間的數據序列創建并行的數據流

自定義

  • addSource:可以自定義輸入源,通過實現 SourceFunction 接口來自定義非并行的輸入流;也可以實現 ParallelSourceFunction 接口或集成 RichParallelSourceFunction 類來自定義并行輸入流,當然也可以定義好的數據源,如:Kafka,addSource(new FlinkKafkaConsumer08<>(...))

DataStream 的 transform

之前已經介紹了一些 transfrom 函數,如:map、flatMap 和 filter 等。同時還有窗口函數:window、timeWindow 等,聚合函數:sum、reduce 等。更多的 transform 函數以及使用將會單獨寫一篇文章介紹。

Data Sink

Data Sink 便是數據的輸出。同 Data Source 類似, Flink 也內置了一些輸出函數,如下:

  • writeAsText(path) / TextOutputFormat:將數據作為 String 類型輸出到指定文件
  • writeAsCsv(...) / CsvOutputFormat:將 Tuple 類型輸出到 ',' 分隔的 csv 類型的文件。行和列的分隔符可以通過參數配置,默認的為 '\n' 和 ','
  • print() / printToErr():將數據打印到標準輸出流或者標準錯誤流,可以指定打印的前綴。
  • writeUsingOutputFormat() / FileOutputFormat:輸出到 OutputFormat 類型指定的文件,支持對象到字節的轉換。
  • writeToSocket:根據 SerializationSchema 將數據輸出到 socket
  • addSink:自定義輸出函數,如:自定義將數據輸出到 Kafka

小結

本篇文章主要介紹了 Flink Streaming 編程的基本骨架。詳細介紹了 Streaming 內置的 Data Source 和 DataSink 。下篇將繼續介紹 Flink Streaming 編程涉及的基本概念。

代碼地址: github.com/duma-repo/a…

歡迎關注公眾號「渡碼」


轉載于:https://juejin.im/post/5d09814651882528fd530789

總結

以上是生活随笔為你收集整理的Flink DataStream 编程入门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。