目錄:apache beam 個人使用經驗總結目錄和入門指導(Java)
爲了方便,以下面這個名字替換的程序做簡單例子:
/**
* The ReplaceMyName
* 把Create數組裏的myName替換成xxx
* @since 2019/12/17
*/
public class OutpuMyName {
public static void main(String[] args) {
MyTestOption myTestOption = PipelineOptionsFactory
// 讀入args數組
.fromArgs(args)
// withValidation指需要對args裏的所有參數做校驗,如果有不存在Option裏的參數鍵值就會拋異常
.withValidation()
// 通過as進行最後的生成操作
.as(MyTestOption.class);
Pipeline pipeline = Pipeline.create(myTestOption);
pipeline.apply(Create.of("lsx ah", "lsx sf", "lsx is me"))
.apply(ParDo.of(new ReplaceMyNameFn()))
.apply(ParDo.of(new PrintStrFn()));
pipeline.run().waitUntilFinish();
}
/**
* 替換名字的轉換過程
*/
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);
}
}
該例子會將Create.of輸入的字符串裏 進行替換, 把輸入參數裏的名字替換成xxx。
打包
在spark上提交時需要打成jar包, 打包的話pom文件可以參考如下,注意spark-runner包必須添加:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>lsx.beam</groupId>
<artifactId>beam-demo</artifactId>
<version>0.0.1</version>
<properties>
<beam.version>2.13.0</beam.version>
</properties>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-runners-direct-java</artifactId>
<version>${beam.version}</version>
</dependency>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-runners-spark</artifactId>
<version>${beam.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
<!--<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"/>-->
</transformers>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
打成jar包後, 就可以用spark-launcher或者spark-submit客戶端進行提交了。
提交
這裏我用spark-submit客戶部腳本進行提交,命令行如下:
/opt/All_Client/Spark2x/spark/bin/spark-submit --class lsx.beam.demo.OutpuMyName --master local /opt/application_test/beam-demo-0.0.1.jar --runner=SparkRunner --myName=lsx
–class 後面跟的是你需要執行的main主類
master我這裏選擇local模式, 否則無法在控制檯看到system.out的輸出(如果不用local模式,system.out可能輸出在任何節點,以至於無法在client端看到)。
在jar包路徑之後, 跟的就是beam的args輸入參數了。 注意如果args要提供給option進行初始化,必須爲–key=value的形式。
執行後可看到 如下結果(只有local模式才能看到控制檯打印):
如何定義存儲級別
beam-sparkRunner中, 默認存儲級別爲MEMORY_ONLY(即始終用內存存數據), 如果需要修改存儲級別,需要讓你的pipelineOption繼承自SparkContextOptions
public interface MyTestOption extends SparkContextOptions
接着就可以通過setStorageLevel進行存儲級別設置
myTestOption.setStorageLevel("MEMORY_AND_DISK_SER");
如何設置提交應用名
以yarn模式提交,並且當執行pipeline.run()時, 就會往yarn上提交任務。
如果希望修改提交時的應用名,則可以讓option繼承SparkContextOptions或者ApplicationNameOptions
然後執行
myTestOption.setAppName("beam_test_application");
可看到yarnUI或者sparkUI上看到的appName已被改變