Flink簡介
Apache Flink是一個框架和分布式處理引擎,用于對無界和有界資料流進行有狀態計算,核心是一個分布式、高性能、高可用、實時性的流式計算框架
Flink起源于Stratosphere專案, 2014年4月Stratosphere的代碼被復制并捐贈給了Apache軟體基金會, 2014年12月,Flink一躍成為Apache軟體基金會的頂級專案,
Spark和Flink都是分布式計算引擎,但是,Spark 和 Flink 一開始都擁有著同一個夢想,他們都希望能夠用同一個技術把流處理和批處理統一起來,但他們走了完全不一樣的兩條路前者是以批處理的技術為根本,并嘗試在批處理之上支持流計算;后者則認為流計算技術是最基本的,在流計算的基礎之上支持批處理,正因為這種架構上的不同,今后二者在能做的事情上會有一些細微的區別,比如在低延遲場景,Spark 基于微批處理的方式需要同步會有額外開銷,因此無法在延遲上做到極致,在大資料處理的低延遲場景,Flink 已經有非常大的優勢,
Spark和Flink的主要差別就在于計算模型不同,Spark采用了微批處理模型,而Flink采用了基于運算子的連續流模型,因此,對Apache Spark和Apache Flink的選擇實際上變成了計算模型的選擇,而這種選擇需要在延遲、吞吐量和可靠性等多個方面進行權衡,
- 批處理的特點是有界、持久、大量,非常適合需要訪問全套記錄才能完成的計算作業,一般用于需要長時間運行的離線統計,在Spark的世界觀中,一切都是由批次組成的,離線資料是一個大批次,而實時資料是由一個一個無限的小批次組成的,
- 流處理的特點是無界、實時, 無需針對整個資料集執行操作,而是對通過系統傳輸的每個資料項執行操作,一般用于延遲小的實時統計,在Flink的世界觀中,一切都是由流組成的,離線資料是有界限的流,實時資料是一個沒有界限的流,
- 無界資料流:無界資料流有開始但是沒有結束,必須在獲取流資料后立即處理,對于無界資料流我們無法等待所有資料都到達,因為輸入是無界的,并且在任何時間點都不會完成,處理無界資料通常要求以特定順序(例如事件發生的順序)獲取資料,以便能夠推斷結果完整性,
- 有界資料流:有界資料流有明確定義的開始和結束,可以在執行任何計算之前通過獲取指定范圍內所有資料來處理有界流,處理有界流不需要有序獲取,因為可以對在指定范圍內的有界資料集進行排序后再處理,有界流的處理也稱為批處理,
一、優勢:
- 目前唯一同時支持高吞吐、低延遲、高性能的分布式流式資料處理框架
- 支持事件事件概念
- 支持有狀態計算,保持了事件原本產生的時序性,避免網路傳輸帶來的影響
- 支持高度靈活的視窗操作,Flink將視窗分為Time、Count、Session以及Data-driven等型別的視窗操作,可以靈活的處罰條件定制化來達到對復雜的流傳輸模式的支持,
- 基于輕量級分布式快照實作容錯,大型計算任務的流程拆解成小的計算程序,task分布到并行節點上處理,基于分布式快照技術的Checkpoints,將執行程序中的狀態資訊進行持久化存盤,可以自動恢復出現例外的任務,
- 基于JVM實作獨立的記憶體管理
二、應用場景
- 實時智能推薦
- 復雜事件處理
- 實時欺詐檢測
- 實時數倉與ETL
- 流資料分析
- 實時報表分析
Flink開發總結為四大步驟
一、環境Environment
1. 批處理環境:
? ExecutionEnvironment
2. 流式資料處理環境:
StreamExecutionEnvironment 有界流 $ 無界流
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//在當前測驗環境下,如果沒有設定并行度,會默認采用系統CPU的虛擬核數(4)
env.setParallelism(1);
//執行
env.execute();
二、Souce(資料源)
流資料源:
//生產環境使用的比較多,有專門的資料源物件Properties
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", 127.0.0.1:9092);
properties.setProperty("group.id", "consumer-group");
properties.setProperty("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
properties.setProperty("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
properties.setProperty("auto.offset.reset", "latest");
//生產環境中,一般用flink消費Kafka中的資料,完成實時資料計算
FlinkKafkaConsumer<Tuple2<String, String>> consumer = new FlinkKafkaConsumer<>(
"kafkaTopic",
new new SimpleStringSchema(),
properties
);
//將Kafka資料源系結到flink中
DataStream stream = env.addSource(consumer);
//列印輸出控制臺
stream.print();
三、Transform(轉換算子 => 封裝邏輯的方法)
Flink中可以將一個資料流轉換為其他的資料流,轉換程序中,資料流的型別也會發生變化,那么到底Flink支持什么樣的資料型別呢,其實我們常用的資料型別,Flink都是支持的,比如:Long, String, Integer, Int, 元組,樣例類,List, Map等,
四、Sink
Sink有下沉的意思,在Flink中所謂的Sink其實可以表示為將資料存盤起來的意思,也可以將范圍擴大,表示將處理完的資料發送到指定的存盤系統的輸出操作
之前我們一直在使用的print方法其實就是一種Sink
咱們可以將處理完的資料發送到Kafka訊息佇列中
-
添加Kafka依賴關系
<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka_${scala.binary.version}</artifactId> <version>${flink.version}</version> </dependency> -
主函式中添加sink:
FlinkKafkaProducer sink = new FlinkKafkaProducer<>("zpytest1", new SimpleStringSchema(), properties);
stream.addSink(sink);
- 通過kafka消費者控制臺查看:
bin/kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic flink-test
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/356929.html
標籤:其他
上一篇:Ubuntu 安裝配置SSH(ssh: connect to host localhost port 22: Connection refused問題的解決)
下一篇:RabbitMQ的死信佇列
