Beam 是一个分布式数据处理框架,谷歌在今年初贡献出来的,是谷歌在大数据处理开源领域的又一个巨大贡献。
就是因为分布式数据处理技术现在太多了,让人目眩,所以Beam要解决这个问题。
大数据处理领域发展得红红火火,新技术不断,有个笑话:
一个程序员抱怨这个框架的API不好用,同事安慰说:别急,再等几分钟就有新框架出来了,应该会更好。
Hadoop MapReduce、Spark、Storm、Flink、Apex ……
每个技术都有自己的一套API,当新框架出来后,发现功能更强大了、性能更好了,想要切换到新框架,那么开发人员就要开始埋头苦学,然后把之前的业务逻辑重写一遍,这个过程低效而痛苦。
1)定义一套统一的编程规范
Beam有一套自己的模型和API,支持多种开发语言。
开发人员选择自己喜欢的语言,按照Beam的规范实现数据处理逻辑。
2)支持各个分布式执行引擎
自动让Beam的代码可以运行在各大计算引擎上。
Beam的思路简单理解就是:
你们都按照我的规范写代码,然后告诉我你想在哪个框架上运行,我就能自动搞定,如果你什么时候想换个框架了,代码不用动,告诉我要换成谁就行了。
下面通过经典案例wordcount来了解下Beam的用法
指定计算引擎,例如使用 Spark
PipelineOptions options = PipelineOptionsFactory.create();
options.setRunner(SparkRunner.class);
Pipeline p = Pipeline.create(options);
p.apply(TextIO.Read.from("gs://apache-beam-samples/shakespeare/*"))
.apply("ExtractWords", ParDo.of(new DoFn<String, String>() {
@ProcessElement
public void processElement(ProcessContext c) {
for (String word : c.element().split("[^a-zA-Z']+")) {
if (!word.isEmpty()) {
c.output(word);
}
}
}
}))
.apply(Count.<String>perElement())
.apply("FormatResults", MapElements.via(new SimpleFunction<KV<String, Long>, String>() {
@Override
public String apply(KV<String, Long> input) {
return input.getKey() + ": " + input.getValue();
}
}))
.apply(TextIO.Write.to("gs://YOUR_OUTPUT_BUCKET/AND_OUTPUT_PREFIX"));
p.run();
这样就开发完成了,可以看到Beam的开发思路还是很好理解的:
创建一个数据处理的管道,指定从哪儿取数据、一系列的数据处理逻辑、结果输出到哪儿、使用什么计算引擎,然后启动就可以了。
Beam 目前还在孵化阶段,现在支持的开发语言是Java,Python版正在开发,现在支持的计算引擎有 Apex、Spark、Flink、Dataflow,以后会支持更多的开发语言与计算框架。
Beam 的出发点很好,可以一次编码,多引擎平滑迁移,但他的目标有点大,想做成大数据处理的标准,有点难度,希望能 Beam 能顺利发展起来,值得关注。
项目地址
http://beam.apache.org