beam入門寶典之初次使用
咱們不多廢話,先直接來如何簡單使用beam框架。
這裏我不使用常見的wordCount做例子,而是一個大寫轉小寫的例子,語言選用java語言
這個例子裏我們會初步學到:
- 如何建立管道
- 如何手動生成數據
- 如何轉換
- 如何查看輸出
首先我們要新建1個maven工程,然後在pom.xml中加入如下依賴:
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-runners-direct-java</artifactId>
<version>${beam.version}</version>
</dependency>
beam.version版本選擇beam官網上最新,筆者編寫此文時使用的版本是2.13.0
接着我們新建1個HowToCreateAndShowData類,然後開始例子
建立管道
任何beam程序,都需要先建立1個管道選項option,再建立1個初始管道
// 建立選項
PipelineOptions pipelineOptions = PipelineOptionsFactory.create();
// 建立管道
Pipeline pipeline = Pipeline.create(pipelineOptions);
關於選項option和pipeline的更多用法,後面的章節會繼續介紹
手動生成數據
我們有了pipeline之後,就要往裏面塞入數據
beam裏提供了手動輸入數據的方式,如下:
// 生成初始的輸入數據
// 相當於往管道里塞入了3個自己寫的字符串元素
PCollection<String> pcStart = pipeline.apply(
Create.of(
"HELLO!",
"THIS IS BEAM DEMO!",
"HAPPY STUDY!"));
我們調用pipeline的apply方法來輸入1個Create對象,裏面的元素就是我們的輸入元素
並且返回1個PCollection的對象,我們稱之爲數據集。
<String>指的是數據集中數據的類型
如何轉換
要實現轉換,需要先編寫1個DoFn的子類,並實現processElement方法,代碼和講解如下:
// 把字符串轉成小寫的轉換方法類
// DoFn<String,String>中的第一個String是輸入的類型,第二個String是輸出的類型
static class StrToLowerCaseFn extends DoFn<String, String> {
/**
* processElement,過程元素處理方法,類似於spark、mr中的map操作
* 必須加上@ProcessElement註解,並實現processElement方法
* @param context
*/
@ProcessElement
public void processElement(ProcessContext context) {
// 從管道中取出的1個元素
String inputStr = context.element();
// 轉成大寫
String outputStr = inputStr.toLowerCase();
// 輸出結果
context.output(outputStr);
}
}
接着將這個計算方法,用數據集.apply(ParDo.of(計算類))的方式組裝到剛纔的pcStart中
// 組裝小寫轉換
PCollection<String> pcMid =
pcStart.apply(ParDo.of(new StrToLowerCaseFn()));
如何輸出
輸出的話,我們可以按照上面的方法再編寫1個DoFn子類,用於將數據集中輸入的元素打印到控制檯
// 打印結果方法類
// 因爲不需要再往下輸出,所以
static class PrintStrFn extends DoFn<String, Void> {
/**
* processElement,過程元素處理方法,類似於spark、mr中的map操作
* 必須加上@ProcessElement註解,並實現processElement方法
* @param context
*/
@ProcessElement
public void processElement(ProcessContext context) {
// 從管道中取出的1個元素
String inputStr = context.element();
// 輸出
System.out.println(inputStr);
}
}
然後組裝
// 組裝輸出操作
pcMid.apply(ParDo.of(new PrintStrFn()));
運行
剛纔的3次apply結束後,其實轉換都還沒有開始,僅僅只是組裝計算拓撲的1個流程。
真正開始計算需要調用下面的代碼:
// 運行結果
pipeline.run().waitUntilFinish();
執行main方法,輸出如下結果:
image.png
完整代碼
/**
* The howToCreateAndShowData
*
* */
public class HowToCreateAndShowData {
public static void main(String[] args) {
PipelineOptions pipelineOptions = PipelineOptionsFactory.create();
Pipeline pipeline = Pipeline.create(pipelineOptions);
// 生成初始的輸入數據
// 相當於往管道里塞入了3個自己寫的字符串元素
PCollection<String> pcStart = pipeline.apply(
Create.of(
"HELLO!",
"THIS IS BEAM DEMO!",
"HAPPY STUDY!"));
// 組裝小寫轉換
PCollection<String> pcMid = pcStart.apply(ParDo.of(new StrToLowerCaseFn()));
// 組裝輸出操作
pcMid.apply(ParDo.of(new PrintStrFn()));
// 運行結果
pipeline.run().waitUntilFinish();
}
// 把字符串轉成小寫的轉換方法類
// DoFn<String,String>中的第一個String是輸入的類型,第二個String是輸出的類型
static class StrToLowerCaseFn extends DoFn<String, String> {
/**
* processElement,過程元素處理方法,類似於spark、mr中的map操作
* 必須加上@ProcessElement註解,並實現processElement方法
*
* @param context
*/
@ProcessElement
public void processElement(ProcessContext context) {
// 從管道中取出的1個元素
String inputStr = context.element();
// 轉成大寫
String outputStr = inputStr.toLowerCase();
// 輸出結果
context.output(outputStr);
}
}
// 打印結果方法類
// 因爲不需要再往下輸出,所以
static class PrintStrFn extends DoFn<String, Void> {
/**
* processElement,過程元素處理方法,類似於spark、mr中的map操作
* 必須加上@ProcessElement註解,並實現processElement方法
*
* @param context
*/
@ProcessElement
public void processElement(ProcessContext context) {
// 從管道中取出的1個元素
String inputStr = context.element();
// 輸出
System.out.println(inputStr);
}
}
}