在Spark上運行apache beam

目錄: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已被改變
在這裏插入圖片描述

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