apache beam入門之程序入口——PipelineOption

前置章節apache beam入門寶典之初次使用

從第一章裏我們看到最開始需要生成1個PipelineOption,然後才能生成1個Pipeline, 而這個所謂的option用處是將可以將程序輸入的args數組轉成1個PipelineOption對象, 然後就能直接從裏面進行get和set操作了,不需要自己再去編寫輸入參數轉化相關的實體類。

簡單應用例子

我們直接先以例子入手,先自定義1個MyTestOption類

public interface MyTestOption extends PipelineOptions {
String getMyName();
void setMyName(String myName);
}

getMyName和setMyName2個接口定義之後,其實就是定義了1個myName的arg輸入參數(即get和set後面的那個單詞,第一個字母小寫)。

接着編寫如下代碼

public static void main(String[] args) {
MyTestOption myTestOption = PipelineOptionsFactory
// 讀入args數組,不一定來自main函數入口
.fromArgs(args)
// withValidation指需要對args裏的所有參數做校驗,如果有不存在Option裏的參數鍵值就會拋異常
.withValidation()
// withoutStrictParsing指不需要做校驗,可以有不存在Option裏的參數輸入
//.withoutStrictParsing()
// 通過as進行最後的生成操作
.as(MyTestOption.class);

String myName = myTestOption.getMyName();
System.out.println("myName=" + myName);
myTestOption.setMyName("helloWorld");
System.out.println("myName=" + myTestOption.getMyName());
}

然後啓動程序時,加入–myName=lsx的輸入參數(不要忘記2個橫槓)

在這裏插入圖片描述
則最後輸出如下:
在這裏插入圖片描述

關鍵用途1:可以貫穿整個計算過程,不需要自己再編寫各計算過程的傳入實體

當然,光在main裏去調用這個get和set,用處並不大,很多時候我們並不一定要通過輸入參數args的方式去獲取1個VO對象。
PipelineOption的關鍵用處在於可以貫穿整個數據集計算過程中。
以下面這個DoFn轉換類爲例,我們可以在DoFn中,通過從context去取出Option,來獲取需要的參數,而不需要給ReplaceMyNameFn定義新的私有成員進行參數傳遞。

/**
* 替換名字的轉換過程
*/
public static class ReplaceMyNameFn extends DoFn<String, String> {
@ProcessElement
public void processElement(ProcessContext context) {
String inputElement = context.element();

// 從MytestOption中獲取需要的元素
MyTestOption myTestOption = context.getPipelineOptions().as(MyTestOption.class);
String myName = myTestOption.getMyName();

// 替換字符串
String outputElement = inputElement.replace(myName, "xxx");
context.output(outputElement);
}
}

關鍵用途2: 計算引擎關聯

我們演示時,用的都是DirectRunner(可以理解爲本地單機計算引擎)。
如果我們想要用spark進行計算呢? 那麼就需要給程序的輸入參數里加上 --runner=SparkRunner (不加的時候都默認爲DirectRunner), 那麼計算時才能轉成spark引擎進行計算。 通過PipelienOption源碼,我們確實可以看到定義了setRunner和getRunner這2個接口
在這裏插入圖片描述

關鍵用途3: 用接口替代VO類,方便進行各種合併組裝

在我曾開發的beam工程中,會因爲任務類型的不同, 要生成不同的TaskOption, 但是TaskOption中又有一些Option是可以共用的,此時通過extend一些共有的接口,就可以實現參數複用,避免重複定義一些原有參數。

public interface CleanTaskOption extend BasicTaskOption, ReadOption{...}
public interface QualityTaskOption extend BasicTaskOption, ReadOption{...}

pipelineOption的一些常用註解

public interface MyTestOption extends PipelineOptions {
@Default.String("lsx")
@Description("this is name.")
String getMyName();
void setMyName(String myName);
}

默認值Default.類型, 當args數組中未包含該參數時,使用該默認值
描述Description, 當不清楚對應Option需要那些參數時,可以通過輸入–help=對應Option全類名進行查看,例如我要查看MyTestOption需要哪些輸入參數,可在執行時輸入
在這裏插入圖片描述

則會輸出其定義的參數以及其父接口的參數描述

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章