目錄:apache beam 個人使用經驗總結目錄和入門指導(Java)
當我們通過option新建的pipeline後,需要進行一系列組裝過程,最後再通過pipeline.run()啓動計算。
Pipeline pipeline = Pipeline.create(option);
/**
*組裝計算過程
*/
pipeline.run();
因此編寫beam程序時最核心的部分就是組裝計算過程,其中包含1對1轉換、聚合等操作。
1對1轉換(類似於map操作)
該部分通過apply函數進行裝飾器模式組裝, 並提供了三種方式:
apply(MapElements.via(SimpleFunction對象))
該方法用於簡單的轉化操作,不需要提供額外的輸入參數。例子如下:
PCollection<String> pcMid = pcStart.apply(MapElements.via(new SimpleFunction<String, String>() {
@Override
public String apply(String input) {
return input.toLowerCase();
}
}));
可見該方法對我們而言,只要定義輸入參數和return元素是如何變化的即可,不需要關注其他的東西。
apply(ParoDo.of(DoFn對象))
該方式提供了1個context來獲取此刻的輸入元素,並通過context進行output。 該方式能夠從context獲取其他信息,例如option等,但編寫較麻煩,定義processElement時需要帶上ProcessElement註解。
PCollection<String> pcMid = pcStart.apply(ParDo.of(new DoFn<String ,String>(){
@ProcessElement
public void processElement(ProcessContext context) {
// 從管道中取出的1個元素
String inputStr = context.element();
// 轉成大寫
String outputStr = inputStr.toLowerCase();
// 輸出結果
context.output(outputStr);
}
}));
apply(PTransform對象)
該方式其實是對數據集PCollection的操作, 真正對元素的轉化還要依賴於上面2種方法
PCollection<String> pcMid = pcStart.apply(new PTransform<PCollection<String>, PCollection<String>>() {
@Override
public PCollection<String> expand(PCollection<String> input) {
return input.apply(ParDo.of(new StrToLowerCaseFn()));
}
});
注意事項:
1.使用自定義的DoFn類或者SimpleFunction類進行數據轉化時,如果該類中定義了成員變量,則注意該成員必須是可序列化的(實現了Serializable接口), 否則執行時會報序列化錯誤
2.不要在DoFn或SimpleFunction的轉化函數中,通過1個輸入元素,去生成過多的輸出元素,這個過多指的是超出jvm限定內存的數量,因爲對於單個input元素,output時實際上是存儲到1個outputMap中,直到全部output完,纔會進行下一步的處理
3.不要對輸入的數據做修改,如果對輸入的數據做修改,運行時會報錯