Flink編程<一> 概念, Setup

首先需要編程應(yīng)用的四層抽象:

最底下的一層對用戶是不可見的, 通過ProcessFunction集成到DataStream API. 我們的編程對象也都是DataStream API(bounded/unbounded streams) 和?DataSet API(bounded data sets)


FLink的應(yīng)用主要包括stream 和 transformation, 當(dāng)然DataSet也是被當(dāng)成Stream. 概念上講, stream指的是一條不會結(jié)束的數(shù)據(jù)記錄, transformation所指的操作是把一個或者多個stream作為輸入, 生成一個或者多個stream.?

所謂的Stream dataflows也是包括streams和transformation操作. 每個dataflow開始于一到多個source, 結(jié)束于一到多個sink. 這個過程可以類似的用DAG圖來表示, 不過確實(shí)通過一些迭代結(jié)構(gòu)允許生成環(huán), 但這種局部特例也可以忽略.

如下圖是一個典型的dataflow:

文字來描述的典型步驟的話是:

? ? 1 Obtain anexecution environment,

? ? 2 Load/create the initial data,

? ? 3 Specify transformations on this data,

? ? 4 Specify where to put the results of your computations,

? ? 5 Trigger the program execution

預(yù)定義的Connectors:

data sources: files, directories, sockets, 以及 collections和iterators的輸入數(shù)據(jù)

data sinks: files, stdout, stderr, sockets

目前所支持的與第三方對接的Connectors, 與flink打包在一起的包括:

Apache Kafka(source/sink)
Apache Cassandra(sink)
Amazon Kinesis Streams(source/sink)
Elasticsearch(sink)
Hadoop FileSystem(sink)
RabbitMQ(source/sink)
Apache NiFi(source/sink)
Twitter Streaming API(source)

通過Apache Bahir發(fā)布的streaming connectors:

Apache ActiveMQ(source/sink)
Apache Flume(sink)
Redis(sink)
Akka(sink)
Netty(source)


常用的Transformations:

https://ci.apache.org/projects/flink/flink-docs-release-1.4/dev/stream/operators/index.html

1 Map, DataStream --> DataStream????
? ? 一對一操作, 輸入一個元素生成一個元素, 比如每個元素*2
? ? dataStream.map{x => x*2}

2 FlatMap, DataStream --> DataStream
? ? 一對多操作, 輸入一個元素, 生成0到多個元素, 比如字符串分詞, 生成詞數(shù)組????
? ? dataStream.flatMap{ w => w.split(" ")}

3 Filter, DataStream --> DataStream
? ? 通過一個bool function對元素進(jìn)行過濾, 保留為true的元素. 比如過濾為0的元素
? ? datastream.fliter{_ != 0}

4 KeyBy, DataStream --> KeyedStream??
? ? 通過hash partitioning的方法將一個stream變成一組不想交的patitions, 每個patitions包含的元素具有相同的key. 返回類型為keyedStream, 一組partitions
? ? ? dataStream.keyBy("someKey")
? ? ? ? ? ? case class WordWithCount(someKey: String, count: Long)????
? ? ? dataStream.keyBy(0) // Key by the first element of tuple

5 Reduce, KeyedStream --> DataStream
? ? Rolling reduce on a keyed data stream, 標(biāo)準(zhǔn)的reduce, 降維過程,?????
? ? keyedStream.reduce {_+_}

6 Fold, KeyedStream --> DataStream
滾動折疊, 合并當(dāng)前元素和上一個被折疊的值, 輸入值和返回值可以不一樣, 還沒有場景用到, 原文: A "rolling" fold on a keyed data stream with an initial value. Combines the current element with the last folded value and emits the new value.A fold function that, when applied on the sequence (1,2,3,4,5), emits the sequence "start-1", "start-1-2", "start-1-2-3", ...
????valresult:DataStream[String] = keyedStream.fold("start")((str,i)=>{str+"-"+i})

7 Aggregations, KeyedStream --> DataStream?
滾動聚合, 很簡單, 一個需要注意的, min返回最小值, minBy返回?fù)碛凶钚≈档脑? 可以是多個
????keyedStream.sum(0), keyedStream.sum("key")
????keyedStream.min(0), keyedStream.min("key")
????keyedStream.max(0), keyedStream.max("key")
????keyedStream.minBy(0), keyedStream.minBy("key")
????keyedStream.maxBy(0), keyedStream.maxBy("key")

8 Window, KeyedStream --> AllWindowedStream
窗口可以被定義在已經(jīng)被分區(qū)的 KeyedStreams 上。窗口會對數(shù)據(jù)的每一個 key 根據(jù)一些特征(例如,在最近 5 秒中內(nèi)到達(dá)的數(shù)據(jù))進(jìn)行分組。查閱窗口了解關(guān)于窗口的完整描述赐俗。
? ??dataStream.keyBy(0).window(TumblingEventTimeWindows.of(Time.seconds(5)));// Last 5 seconds of data

9 WindowAll, DataStream --> AllWindowedStream
窗口可以被定義在 DataStream 上十绑。窗口會對所有數(shù)據(jù)流事件根據(jù)一些特征(例如糊闽,在最近 5 秒中內(nèi)到達(dá)的數(shù)據(jù))進(jìn)行分組娜谊。查閱窗口了解關(guān)于窗口的完整描述。
警告:這在許多案例中這是一種非并行的轉(zhuǎn)換诅蝶。所有的記錄都會被聚集到一個執(zhí)行 WindowAll 操作的 task 中,這是非常影響性能的募壕。????????
? ??dataStream.windowAll(TumblingEventTimeWindows.of(Time.seconds(5)));// Last 5 seconds of data

10 Window Apply: WindowedStream --> DataStream, AllWindowedStream --> DataStream
應(yīng)用一個一般的函數(shù)到窗口上调炬,窗口中的數(shù)據(jù)會作為一個整體被計(jì)算。下面的函數(shù)手工地計(jì)算了一個窗口中的元素總和舱馅。

注意:如果你正在使用一個 WindowAll 的轉(zhuǎn)換缰泡,你需要用 AllWindowFunction 來替換。
windowedStream.apply{WindowFunction}
// applying an AllWindowFunction on non-keyed window streamallWindowedStream.apply{AllWindowFunction}

11 Window Reduce, WindowedStream --> DataStream
應(yīng)用一個reduce函數(shù)到窗口上, 返回reduce的值

12 Window Fold, WindowedStream --> DataStream
應(yīng)用一個 fold 函數(shù)到窗口上代嗤,然后返回折疊后的值棘钞。 在窗口上將序列 (1,2,3,4,5) 轉(zhuǎn)換成 "start-1", "start-1-2", "start-1-2-3", ... 的一個 fold 函數(shù)長這個樣子:
valresult:DataStream[String]=windowedStream.fold("start",(str,i)=>{str+"-"+i})

13 Aggregations on windows, WindowedStream -> DataStream
聚合一個窗口中的內(nèi)容, min 與 minBy 的區(qū)別是 min 返回了最小值,而 minBy 返回了在這個字段上是最小值的所有元素(max 和 maxBy 也是同樣的)

14 Union, DataStream* --> DataStream
Union 兩個或多個數(shù)據(jù)流干毅,生成一個新的包含了來自所有流的所有數(shù)據(jù)的數(shù)據(jù)流宜猜。注意:如果你將一個數(shù)據(jù)流與其自身進(jìn)行了合并,在結(jié)果流中對于每個元素你都會拿到兩份硝逢。
dataStream.union(otherStream1,otherStream2,...)

15 Window Join, DataStream , DataStream --> DataStream
grades.join(salaries).
where(_.name).equalTo(_.name).
window(TumblingEventTimeWindows.of(Time.milliseconds(windowSize))).
apply { (g,s) =>Person(g.name,g.grade,s.salary) }

16 Window CoGroup:? DataStream, DataStream --> DataStream
在一個給定的 key 和窗口上 co-group 兩個數(shù)據(jù)流dataStream.coGroup(otherStream)
.where(0).equalTo(1)
.window(TumblingEventTimeWindows.of(Time.seconds(3)))
.apply(newCoGroupFunction(){...});

17 Connect: DataStream, DataStream --> ConnectedStreams
"連接"兩個數(shù)據(jù)流并保持原先的類型, Connect 可以讓兩條流之間共享狀態(tài).? ?
someStream:DataStream[Int]=...
otherStream:DataStream[String]=...
valconnectedStreams=someStream.connect(otherStream)

18 CoMap, CoFlatMap: ConnectedStreams --> DataStream
在一個 ConnectedStreams 上做類似 map 和 flatMap 的操作
connectedStreams.map(
(_:Int)=>true
,(_:String)=>false)
connectedStreams.flatMap((_:Int)=>true, (_:String)=>false)

19 Split & Select: DataStream --> SplitStream & SplitStream --> DataStream
根據(jù)規(guī)則把一個stream切分成多個Stream, 并且選擇.


針對基于元組的數(shù)據(jù)流, 可以只選取部分其中部分的字段.
val in:DataStream[(Int,Double,String)] = // [...]
val out = in.project(2,0)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末姨拥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子趴捅,更是在濱河造成了極大的恐慌垫毙,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拱绑,死亡現(xiàn)場離奇詭異综芥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)猎拨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門膀藐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屠阻,“玉大人,你說我怎么就攤上這事额各」酰” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵虾啦,是天一觀的道長麻诀。 經(jīng)常有香客問我,道長傲醉,這世上最難降的妖魔是什么蝇闭? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮硬毕,結(jié)果婚禮上呻引,老公的妹妹穿的比我還像新娘。我一直安慰自己吐咳,他們只是感情好逻悠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著韭脊,像睡著了一般童谒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沪羔,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天惠啄,我揣著相機(jī)與錄音,去河邊找鬼任内。 笑死撵渡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的死嗦。 我是一名探鬼主播趋距,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼越除!你這毒婦竟也來了节腐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤摘盆,失蹤者是張志新(化名)和其女友劉穎翼雀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孩擂,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狼渊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狈邑。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡城须,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出米苹,到底是詐尸還是另有隱情糕伐,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布蘸嘶,位于F島的核電站良瞧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏训唱。R本人自食惡果不足惜莺褒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雪情。 院中可真熱鬧,春花似錦你辣、人聲如沸巡通。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宴凉。三九已至,卻和暖如春表悬,著一層夾襖步出監(jiān)牢的瞬間弥锄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工蟆沫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留籽暇,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓饭庞,卻偏偏與公主長得像戒悠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子舟山,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容