Flink基礎(chǔ)
flink的安裝:
如果為單機環(huán)境炬转,直接從flink官網(wǎng)下載最新的flink包解壓即可。
下載地址:https://flink.apache.org/downloads.html
flink可以存儲中間結(jié)果驻啤、savepoints等信息荐吵,而存儲的介質(zhì)可以選擇hadoop先煎,所以這里下載<Apache Flink 1.7.1 with Hadoop? 2.8>
下載后,解壓遥倦,然后執(zhí)行bin下的start-cluster.sh即可啟動
啟動成功后占锯,可以在瀏覽器中輸入:http://localhost:8081就可以看到flink的管理控制臺,如下:
另外,如果只是單純希望調(diào)試運行flink的job(使用main方法啟動)疑俭,其實可以不用安裝flink環(huán)境婿失,flink支持在IDE中直接以項目依賴包的形式運行,只是僅限于調(diào)試哩照。
flink中所有job都是通過taskmanager來執(zhí)行的懒浮,是否能立即執(zhí)行识藤,需要看有沒有可用的slot痴昧。
一個job的生命周期是: CREATED -->【 SCHEDULED 】-->DEPLOYING --> RUNNING --> FINISHED
SCHEDULED 狀態(tài)為可選
創(chuàng)建flink-java項目:
mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-quickstart-java \
-DarchetypeVersion=1.7.0 \
-DgroupId=wiki-edits \
-DartifactId=wiki-edits \
-Dversion=0.1 \
-Dpackage=wikiedits \
-DinteractiveMode=false
Flink中的核心概念--入門版(更多的是DataStream API)
(僅根據(jù)目前接觸到的一些核心概念做記錄)
- DataStream: 數(shù)據(jù)流冠王,flink中所有數(shù)據(jù)都以流的方式展現(xiàn)。
- StreamExecutionEnvironment: 流執(zhí)行的環(huán)境豪娜,目前看到的很多例子都是通過創(chuàng)建這個對象來串聯(lián)整體處理流程的哟楷。一般通過
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
這種方式來創(chuàng)建對象吓蘑。
DataSource:數(shù)據(jù)源,通過env.addSource()來設(shè)置溃蔫。一般可以從db琳猫、kafka等地方獲取數(shù)據(jù)作為源。所有dataSource均需要繼承 RichSourceFunction 這個抽象類统刮,實現(xiàn)其中的open账千、close、run鞭衩、cancel等方法娃善。
-
Sink:沉淀、使下沉坯台,在這里指將處理之后的數(shù)據(jù)存儲起來的地方瘫寝,一般可以放在redis稠炬、db酸纲、kafka等中瑟匆,通過 dataSource.addSink()來設(shè)置,可以同時設(shè)置多個sink疾嗅。如下:
dataStreamSource.addSink(new UrlMysqlSink()); dataStreamSource.addSink(new PrintSinkFunction<>());
其中PrintSinkFunction是直接輸出到控制臺冕象,urlMysqlSink則是一個自定義的mysql sink。
自定義Sink需要繼承 RichSinkFunction 這個抽象類论悴,并實現(xiàn)其中的open墓律、invoke方法。
-
Transformation:各種轉(zhuǎn)換察纯,輸入一個或多個Stream针肥,輸出一個或者多個Stream慰枕,常用的transformation如下:
map:轉(zhuǎn)換,類似于java8中stream的map乡洼,輸入一個流匕坯,轉(zhuǎn)換輸出另外一個流
-
flatmap:與map類似拔稳,但是flat的意思是展開,也就是結(jié)果只有一層术奖,不會有嵌套集合
flatmap中需要實現(xiàn)以下方法,可以看到輸出的是collector佣耐,也就是只有一層集合唧龄,而不是嵌套既棺。
void flatMap(T var1, Collector<O> var2) throws Exception;
reduce:返回單個的結(jié)果值,并且 reduce 操作每處理一個元素總是創(chuàng)建一個新值丸冕∨种颍可以用來實現(xiàn)average、sum众旗、max答捕、min、count等功能艘款。
keyby:類似于sql中的group by沃琅,根據(jù)某個字段做分組操作,分組后才可以做更多后續(xù)的操作晌柬。返回的是一個KeyedStream<Object, Type-key> 的流郭脂,后面的是key類型展鸡。
filter:過濾器,其中需要實現(xiàn)的FilterFunction方法返回的是true/false涤久,true代表數(shù)據(jù)會包含在返回數(shù)據(jù)中,false則當前數(shù)據(jù)會被過濾掉考抄。
-
window:用來對一個無限的流設(shè)置一個有限的集合蔗彤,在有界的數(shù)據(jù)集上進行操作的一種機制幕与。window 又可以分為基于時間(Time-based)的 window 以及基于數(shù)量(Count-based)的 window。
tumbling time windows(翻滾時間窗口) -- 不會有窗口重疊潮饱,也就是一個元素只能出現(xiàn)在一個窗口中
-
sliding time windows(滑動時間窗口)--會有窗口重疊诫给,也就是一個元素可以出現(xiàn)在多個窗口中
data.keyBy(1) .timeWindow(Time.minutes(1)) //tumbling time window 每分鐘統(tǒng)計一次數(shù)量和 .sum(1); data.keyBy(1) .timeWindow(Time.minutes(1), Time.seconds(30)) //sliding time window 每隔 30s 統(tǒng)計過去一分鐘的數(shù)量和 .sum(1);
timeWindow: 如上所說,根據(jù)時間來聚合流數(shù)據(jù)凫碌。例如:一分鐘的 tumbling time window 收集一分鐘的元素盛险,并在一分鐘過后對窗口中的所有元素應用于一個函數(shù)勋又。
windowAll:
-
Aggregations:累積、聚合
- min/minBy:
- max/maxBy:
- sum:
union:
window join:
split:
select:
project: