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需要哪些输入参数,可在执行时输入
在这里插入图片描述

则会输出其定义的参数以及其父接口的参数描述

在这里插入图片描述

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