apache beam入门之程序入口——PipelineOption
原创
©著作权归作者所有:来自51CTO博客作者breakDawn的原创作品,请联系作者获取转载授权,否则将追究法律责任
前置章节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需要哪些输入参数,可在执行时输入

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