官术网_书友最值得收藏!

3.1 環(huán)境對象

StreamExecutionEnvironment是Flink應(yīng)用開發(fā)時的概念,表示流計算作業(yè)的執(zhí)行環(huán)境,是作業(yè)開發(fā)的入口、數(shù)據(jù)源接口、生成和轉(zhuǎn)換DataStream的接口、數(shù)據(jù)Sink的接口、作業(yè)配置接口、作業(yè)啟動執(zhí)行的入口。

Environment是運行時作業(yè)級別的概念,從StreamExecutionEnvironment中的配置信息衍生而來。進入到Flink作業(yè)執(zhí)行的時刻,作業(yè)需要的是相關(guān)的配置信息,如作業(yè)的名稱、并行度、作業(yè)編號Job ID、監(jiān)控的Metric、容錯的配置信息、IO等,用StreamExecutionRuntime對象就不合適了,很多API是不需要的,所以在Flink中抽象出了Environment作為運行時刻的上下文信息。

RuntimeContext是運行時Task實例級別的概念。Environment本身仍然是比較粗粒度作業(yè)級別的配置,對于每一個Task而言,其本身有更細節(jié)的配置信息,所以Flink又抽象了RuntimeContext,每一個Task實例有自己的RuntimeContext,RuntimeContext的信息實際上是StreamExecutionEnvironment中配置信息和算子級別信息的綜合。

3種環(huán)境對象之間的關(guān)系如圖3-1所示。

圖3-1 3種環(huán)境對象的關(guān)系

對于開發(fā)者而言,StreamExecutionEnvironment在作業(yè)開發(fā)的Main函數(shù)中使用,RuntimeContext在UDF開發(fā)中使用,Environment則起到銜接StreamExecutionEnvironment和RuntimeContext的作用。

3.1.1 執(zhí)行環(huán)境

執(zhí)行環(huán)境是Flink作業(yè)開發(fā)、執(zhí)行的入口,當前版本Flink的批流在API并沒有統(tǒng)一,所以有流計算(StreamExecutionEnvironment)和批處理(ExecutionEnvironment)兩套執(zhí)行環(huán)境。在本書中,主要介紹流計算應(yīng)用執(zhí)行環(huán)境。

流計算執(zhí)行環(huán)境體系如圖3-2所示。

圖3-2 StreamExcecutionEnvironment類體系

StreamExecutionEnvironment是Flink流計算應(yīng)用的執(zhí)行環(huán)境,是Flink作業(yè)開發(fā)和啟動執(zhí)行的入口,開發(fā)者對StreamExecutionEnvironment的實現(xiàn)是無感知的。

1. LocalStreamEnvironment

本地執(zhí)行環(huán)境,在單個JVM中使用多線程模擬Flink集群。

一般用作本地開發(fā)、調(diào)試。使用Idea之類的IDE工具,可以比較方便地在代碼中設(shè)置斷點調(diào)試和單元測試。如果測試沒有問題,就可以提交到真正的生產(chǎn)集群。

其基本的工作流程如下。

1)執(zhí)行Flink作業(yè)的Main函數(shù)生成Streamgraph,轉(zhuǎn)化為JobGraph。

2)設(shè)置任務(wù)運行的配置信息。

3)根據(jù)配置信息啟動對應(yīng)的LocalFlinkMiniCluster。

4)根據(jù)配置信息和miniCluster生成對應(yīng)的MiniClusterClient。

5)通過MiniClusterClient提交JobGraph到MiniCluster。

2. RemoteStreamEnvironment

在大規(guī)模數(shù)據(jù)中心中部署的Flink生成集群的執(zhí)行環(huán)境。

當將作業(yè)發(fā)布到Flink集群的時候,使用RemoteStreamEnvironment。

其基本的工作流程如下:

1)執(zhí)行Flink作業(yè)的Main函數(shù)生成Streamgraph,轉(zhuǎn)化為JobGraph。

2)設(shè)置任務(wù)運行的配置信息。

3)提交JobGraph到遠程的Flink集群。

3. StreamContextEnvironment

在Cli命令行或者單元測試時候會被使用,執(zhí)行步驟同上。

4. StreamPlanEnvironment

在Flink Web UI管理界面中可視化展現(xiàn)Job的時候,專門用來生成執(zhí)行計劃(實際上就是StreamGraph),如圖3-3所示。

圖3-3 Flink執(zhí)行計劃

5. ScalaShellStreamEnvironment

這是Scala Shell執(zhí)行環(huán)境,可以在命令行中交互式開發(fā)Flink作業(yè)。

其基本工作流程如下。

1)校驗部署模式,目前Scala Shell僅支持attached模式。

2)上傳每個作業(yè)需要的Jar文件。

其余步驟與RemoteStreamEnvironment類似。

3.1.2 運行時環(huán)境

運行時環(huán)境在Flink中叫作Environment,是Flink運行時的概念,該接口定義了在運行時刻Task所需要的所有配置信息,包括在靜態(tài)配置和調(diào)度器調(diào)度之后生成的動態(tài)配置信息。

Environment類體系如圖3-4所示。

圖3-4 Environment類體系

其有兩個實現(xiàn)類RuntimeEnvironment和SavepointEnvironment。

1. RuntimeEnvironment

在Task開始執(zhí)行時進行初始化,把Task運行相關(guān)的信息都封裝到該對象中,其中不光包含了配置信息,運行時的各種服務(wù)也會被包裝到其中,如代碼清單3-1所示。

代碼清單3-1 Task初始化RuntimeEnvironment

2. SavepointEnvironment

SavepointEnvironment是Environment的最小化實現(xiàn),在狀態(tài)處理器的API中使用。Flink1.9版本引入的狀態(tài)處理器(State Processor)API真正改變了這一現(xiàn)狀,實現(xiàn)了對應(yīng)用程序狀態(tài)的操作。該功能借助DataSet API擴展了輸入和輸出格式以讀寫保存點或檢查點數(shù)據(jù)。由于DataSet和Table API的互通性,用戶甚至可以使用關(guān)系表API或SQL查詢來分析和處理狀態(tài)數(shù)據(jù)。

3.1.3 運行時上下文

RuntimeContext是Function運行時的上下文,封裝了Function運行時可能需要的所有信息,讓Function在運行時能夠獲取到作業(yè)級別的信息,如并行度相關(guān)信息、Task名稱、執(zhí)行配置信息(ExecutionConfig)、State等。

Function的每個實例都有一個RuntimeContext對象,在RichFunction中通過getRunctionContext()可以訪問該對象。

RuntimeContext的類體系如圖3-5所示。

不同的使用場景中有不同的RuntimeContext,具體如下。

1)StreamingRuntimeContext:在流計算UDF中使用的上下文,用來訪問作業(yè)信息、狀態(tài)等。

2)DistributedRuntimeUDFContext:由運行時UDF所在的批處理算子創(chuàng)建,在DataSet批處理中使用。

3)RuntimeUDFContext:在批處理應(yīng)用的UDF中使用。

4)SavepointRuntimeContext:Flink1.9版本引入了一個很重要的狀態(tài)處理API,這個框架支持對檢查點和保存點進行操作,包括讀取、變更、寫入等。

圖3-5 RuntimeContext類體系

5)CepRuntimeContext:CEP復(fù)雜事件處理中使用的上下文。

另外,在一些場景中不需要將RuntimeContext中的信息完全暴露,只需要其中某一部分信息,或者需要使用RuntimeContext之外的一些其他信息,這兩種情況下,需要對RuntimeContext再進行一次封裝。

主站蜘蛛池模板: 丹凤县| 应城市| 石城县| 双峰县| 鄂伦春自治旗| 金坛市| 博乐市| 库伦旗| 衢州市| 临朐县| 泸州市| 定州市| 平泉县| 阿城市| 韶山市| 菏泽市| 潮州市| 登封市| 洛川县| 九江县| 静安区| 南和县| 黔西县| 札达县| 西昌市| 罗田县| 故城县| 桓仁| 万盛区| 奉新县| 铜陵市| 襄汾县| 威远县| 公主岭市| 兰溪市| 城步| 玉环县| 台山市| 临漳县| 隆回县| 东兰县|