0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于圖遍歷的Flink任務(wù)畫布模式下零代碼開(kāi)發(fā)實(shí)現(xiàn)方案

京東云 ? 來(lái)源:京東物流 吳云濤 ? 作者:京東物流 吳云濤 ? 2024-11-05 10:35 ? 次閱讀

作者:京東物流 吳云濤

前言

提交一個(gè)DataSteam 的 Flink應(yīng)用,需要經(jīng)過(guò) StreamGraph、JobGraph、ExecutionGraph 三個(gè)階段的轉(zhuǎn)換生成可成執(zhí)行的有向無(wú)環(huán)圖(DAG),并在 Flink 集群上運(yùn)行。而提交一個(gè) Flink SQL 應(yīng)用,其執(zhí)行流程也類似,只是多了一步使用 flink-table-planer 模塊從SQL轉(zhuǎn)換成 StreamGraph 的過(guò)程。以下是利用Flink的 StreamGraph 通過(guò)低代碼的方式,來(lái)實(shí)現(xiàn)StreamGraph的生成,并最終實(shí)現(xiàn) Flink 程序零代碼開(kāi)發(fā)的解決方案。

一、Flink 相關(guān)概念

在Flink程序中,每個(gè)算子被稱作Operator,通過(guò)各個(gè)算子的處理最終得到期望的加工后數(shù)據(jù)。比如下面這段程序中,增加了Source, Fiter, Map, Sink 4個(gè)算子。

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream dataStream = env.addSource(new FlinkKafkaConsumer("topic"));

DataStream filteredStream = dataStream.filter(new FilterFunction() {
    @Override
    public boolean filter(Object value) throws Exception {return true;}
});

DataStream mapedStream = filteredStream.map(new MapFunction() {
    @Override
    public Object map(Object value) throws Exception {return value;}
});

mapedStream.addSink(new DiscardingSink());
env.execute("test-job");

StreamGraph

Flink的邏輯執(zhí)行圖,描述了整個(gè)流處理任務(wù)的流程和數(shù)據(jù)流轉(zhuǎn)遞規(guī)則,包括了數(shù)據(jù)源(Source)、轉(zhuǎn)換算子(Transform)、數(shù)據(jù)目的端(Sink)等元素,以及它們之間的依賴關(guān)系和傳輸規(guī)則。StreamGraph是通過(guò)Flink的API或者DSL來(lái)構(gòu)建的向無(wú)環(huán)圖(DAG),它與JobGraph之間是一一對(duì)應(yīng)的關(guān)系。StreamGraph中的頂點(diǎn)稱為streamNode,是用來(lái)表示Operator算子的類,包含了算子uid、并行度,是否共享slot(SlotSharingGroup)等信息。邊稱作streamEdge。通過(guò)StreamingJobGraphGenerator類生成JobGraph。

wKgZoWcphHWAQFJAAAC415z1P0g850.png

JobGraph

StreamGraph 經(jīng)過(guò) flink-optimizer 模塊優(yōu)化后生成 JobGraph。生成 JobGraph 時(shí),會(huì)將多個(gè)滿足條件的算子chain 鏈接到一起作為一個(gè)頂點(diǎn)(JobVertex), 在運(yùn)行時(shí)對(duì)應(yīng)1個(gè) Task。Task 是 Flink 程序的基本執(zhí)行單元,任務(wù)調(diào)度時(shí)將Task分配到TaskManager上執(zhí)行。

wKgaoWcphHaAKW72AACaIFmRfRo762.png

ExecutionGraph

物理執(zhí)行圖是由JobGraph轉(zhuǎn)換而來(lái),描述了整個(gè)流處理任務(wù)的物理執(zhí)行細(xì)節(jié),包括了任務(wù)的調(diào)度、任務(wù)的執(zhí)行順序、任務(wù)之間的數(shù)據(jù)傳輸、任務(wù)的狀態(tài)管理等。Task會(huì)在步驟中拆分為多個(gè)SubTask。對(duì)應(yīng)Task中的每個(gè)并行度。

wKgZoWcphHeAAbXGAAEbheQco6M795.png

Physical Graph

PhysicalGraph是在執(zhí)行時(shí)的ExecutionGraph。ExecutionGraph中的每一個(gè)頂點(diǎn)ExecutionJobVertex都對(duì)應(yīng)一個(gè)或多個(gè)頂點(diǎn)ExecutionVertex,它們是物理執(zhí)行圖中的節(jié)點(diǎn)。

二、畫布模式實(shí)現(xiàn)思路

實(shí)現(xiàn)流程

首先,我們采用畫布模式(拖拉拽方式)來(lái)實(shí)現(xiàn)Flink程序的組裝,將極大程度上方便我們復(fù)用部分加工的算子,最終實(shí)現(xiàn)零代碼的Flink應(yīng)用開(kāi)發(fā)。我們通過(guò)繪圖的方式,直接將內(nèi)置的算子繪制在圖標(biāo)上。如下所示:

wKgaoWcphHiAIu3nAACUlYmDjpU408.png

構(gòu)建有向無(wú)環(huán)圖(DAG),并持久化。通過(guò)拖拉拽的方式(畫布模式)構(gòu)建你的Flink應(yīng)用,后端的持久化存儲(chǔ)采用鄰接表方式。我們?cè)?mysql 關(guān)系數(shù)據(jù)庫(kù)中將 Node(算子:Source、Sink、中間加工邏輯算子)存儲(chǔ)到 flink_node 表中;將邊存到一張 flink_realation 表中。

重新組將Flink作業(yè)
要組裝以上畫布模式的Flink應(yīng)用,首先需要初始化好 StreamExecutionEnvironment 相關(guān)參數(shù),其次將上述表中的 flink_node 和flink_edge 轉(zhuǎn)化為DataStream,并將轉(zhuǎn)化出的 DataStream 合理地拼接成一個(gè) DataStream API Flink 應(yīng)用程序。
在將flink_node、flink_edge轉(zhuǎn)為為DataStream時(shí)選擇何種遍歷算法來(lái)組裝呢?我們知道有向無(wú)環(huán)圖的遍歷最常用的有:深度優(yōu)先遍歷(DFS)和廣度優(yōu)先遍歷(BFS)。這里我們采用了BFS算法+層序遍歷的方式,BFS便于在組裝的過(guò)程中將已visit到的node節(jié)點(diǎn)拼裝到其parent 的節(jié)點(diǎn)上。

總結(jié)

在實(shí)際的實(shí)現(xiàn)過(guò)程中,遇到的問(wèn)題往往比以上復(fù)雜很多。比如需要將更多的信息存儲(chǔ)在node節(jié)點(diǎn)和edge邊上。node上需要存儲(chǔ)并行度、算子處理前后的表schema等;edge需要存儲(chǔ)keyby的字段、上下游之間的數(shù)據(jù)shuffle的方式等等。此外在內(nèi)置的算子無(wú)法滿足用戶需求時(shí),還需要考慮如何友好的支持自定義算子(UDF)的嵌入等問(wèn)題。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 開(kāi)發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    363

    瀏覽量

    40785
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4717

    瀏覽量

    68199
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    隔空科技聯(lián)合涂鴉智能推出微波雷達(dá)感應(yīng)燈代碼實(shí)現(xiàn)方案

    隔空科技推出的5.8G微波雷達(dá)感應(yīng)系列芯片方案,具有高集成、高性能、抗干擾能力強(qiáng)、低功耗、高性價(jià)比等優(yōu)勢(shì),同時(shí)得益于接入涂鴉智能的代碼實(shí)現(xiàn)方案
    發(fā)表于 10-15 15:11 ?3283次閱讀
    隔空科技聯(lián)合涂鴉智能推出微波雷達(dá)感應(yīng)燈<b class='flag-5'>零</b><b class='flag-5'>代碼</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>方案</b>

    RA-RTT體驗(yàn)代碼點(diǎn)亮LED燈

    很榮幸能參加RA-RTT瑞薩開(kāi)發(fā)板試用活動(dòng)。目的介紹如何代碼體驗(yàn)點(diǎn)亮LED燈。開(kāi)發(fā)板RA2L1開(kāi)發(fā)板實(shí)現(xiàn)步聚1、打開(kāi)RT-Thread S
    發(fā)表于 02-22 15:13

    CC430代碼

    CC430代碼分享,有需要的朋友可以下來(lái)參考
    發(fā)表于 05-25 10:26 ?20次下載

    什么是代碼應(yīng)用開(kāi)發(fā)平臺(tái)?它有哪些功能模塊

    無(wú)需編寫代碼就能夠完成應(yīng)用程序的開(kāi)發(fā),所以非技術(shù)人員也可以在代碼開(kāi)發(fā)平臺(tái)上完成應(yīng)用程序的開(kāi)發(fā)。
    發(fā)表于 04-08 11:53 ?1597次閱讀

    實(shí)現(xiàn)代碼開(kāi)發(fā)還需要多長(zhǎng)時(shí)間

    代碼開(kāi)發(fā)平臺(tái),想要通過(guò)代碼開(kāi)發(fā)平臺(tái)來(lái)擺脫對(duì)SaaS公司的依賴。下面一起來(lái)了解一
    發(fā)表于 05-09 11:38 ?745次閱讀

    代碼開(kāi)發(fā)平臺(tái)工作原理

    ,通過(guò)代碼開(kāi)發(fā)平臺(tái)就可以無(wú)需編寫任何代碼就可以完成應(yīng)用程序的開(kāi)發(fā)。下面一起來(lái)了解一相關(guān)知識(shí)吧
    發(fā)表于 05-09 15:00 ?1937次閱讀

    什么是代碼開(kāi)發(fā)

    代碼開(kāi)發(fā)平臺(tái),無(wú)需編寫代碼就能夠完成應(yīng)用程序的開(kāi)發(fā)。下面一起來(lái)了解一相關(guān)的知識(shí)吧! 什么是
    發(fā)表于 05-09 15:54 ?2648次閱讀

    代碼與低代碼快速開(kāi)發(fā)平臺(tái)有什么區(qū)別

    現(xiàn)在市場(chǎng)上出現(xiàn)了很多的代碼和低代碼開(kāi)發(fā)平臺(tái),這兩者都是快速開(kāi)發(fā)工具,都可以提高應(yīng)用程序的開(kāi)發(fā)
    發(fā)表于 05-09 16:08 ?1282次閱讀

    代碼開(kāi)發(fā)平臺(tái)能夠給企業(yè)帶來(lái)哪些好處

    平臺(tái),無(wú)需編寫任何代碼就能夠完成應(yīng)用程序的開(kāi)發(fā),業(yè)務(wù)人員自己就能完成應(yīng)用程序的開(kāi)發(fā)工作。你知道代碼開(kāi)發(fā)
    發(fā)表于 05-09 16:15 ?800次閱讀

    淺談代碼開(kāi)發(fā)的價(jià)值在哪里

    來(lái)了解一相關(guān)的知識(shí)吧! 代碼開(kāi)發(fā)的價(jià)值在哪里: 從Softeware 到No Softeware由美國(guó)企業(yè)主導(dǎo),由No Softeware 到No Code這一步很有可能由中國(guó)企業(yè)
    發(fā)表于 05-13 15:03 ?734次閱讀

    代碼平臺(tái)和低代碼平臺(tái)分別適合開(kāi)發(fā)哪些應(yīng)用程序

    代碼平臺(tái)和低代碼平臺(tái)都是現(xiàn)在比較火的快速開(kāi)發(fā)平臺(tái),它們的目的都是為了提高應(yīng)用程序的開(kāi)發(fā)速度,很多人可能都會(huì)問(wèn)他們之間有什么區(qū)別,應(yīng)該如何選
    發(fā)表于 05-13 17:09 ?940次閱讀

    代碼開(kāi)發(fā)平臺(tái)為什么會(huì)受到企業(yè)管理者的歡迎

    隨著應(yīng)用程序開(kāi)發(fā)進(jìn)程的不斷推進(jìn),越來(lái)越多的企業(yè)通過(guò)使用管理軟件提高了內(nèi)部管理的效率,尤其是代碼開(kāi)發(fā)平臺(tái)的出現(xiàn)使企業(yè)管理者也可以體驗(yàn)一應(yīng)用
    發(fā)表于 05-14 11:15 ?783次閱讀

    玩轉(zhuǎn)5元MCU,合宙Air32代碼實(shí)現(xiàn)USB轉(zhuǎn)串口

    難以掌握。今天我們將帶領(lǐng)大家實(shí)現(xiàn),代碼做到使用Air32F103實(shí)現(xiàn)USB轉(zhuǎn)串口——波特率最高支持4.5M,而且Win10可以免驅(qū)使用;一顆Air32F103最
    的頭像 發(fā)表于 12-19 16:00 ?3276次閱讀
    玩轉(zhuǎn)5元MCU,合宙Air32<b class='flag-5'>零</b><b class='flag-5'>代碼</b><b class='flag-5'>實(shí)現(xiàn)</b>USB轉(zhuǎn)串口

    代碼如何實(shí)現(xiàn)造數(shù)據(jù)

    項(xiàng)目開(kāi)發(fā)過(guò)程中,總會(huì)遇到一些需要測(cè)試數(shù)據(jù)的場(chǎng)景,但是造數(shù)據(jù)特別是造大量的數(shù)據(jù)這個(gè)事情,有時(shí)候也是要費(fèi)一番功夫的,今天給大家?guī)?lái)一款造數(shù)據(jù)神器,讓你代碼實(shí)現(xiàn)造數(shù)據(jù)。 這個(gè)神器就是我們?nèi)?/div>
    的頭像 發(fā)表于 09-25 11:23 ?493次閱讀
    <b class='flag-5'>零</b><b class='flag-5'>代碼</b>如何<b class='flag-5'>實(shí)現(xiàn)</b>造數(shù)據(jù)

    RA-RTT體驗(yàn)代碼點(diǎn)亮LED燈

    介紹如何代碼體驗(yàn)點(diǎn)亮LED燈。
    發(fā)表于 10-12 12:43 ?392次閱讀
    RA-RTT體驗(yàn)<b class='flag-5'>零</b><b class='flag-5'>代碼</b>點(diǎn)亮LED燈