谷歌开源的大数据处理项目 Apache Beam
Apache Beam 是什么?
Beam 是一个分布式数据处理框架,谷歌在今年初贡献出来的,是谷歌在大数据处理开源领域的又一个巨大贡献。
数据处理框架已经很多了,怎么又来一个,Beam有什么优势?
就是因为分布式数据处理技术现在太多了,让人目眩,所以Beam要解决这个问题。
大数据处理领域发展得红红火火,新技术不断,有个笑话:
一个程序员抱怨这个框架的API不好用,同事安慰说:别急,再等几分钟就有新框架出来了,应该会更好。
Hadoop MapReduce、Spark、Storm、Flink、Apex ……
每个技术都有自己的一套API,当新框架出来后,发现功能更强大了、性能更好了,想要切换到新框架,那么开发人员就要开始埋头苦学,然后把之前的业务逻辑重写一遍,这个过程低效而痛苦。
Beam的解决思路
1)定义一套统一的编程规范
Beam有一套自己的模型和API,支持多种开发语言。
开发人员选择自己喜欢的语言,按照Beam的规范实现数据处理逻辑。
2)支持各个分布式执行引擎
自动让Beam的代码可以运行在各大计算引擎上。
Beam的思路简单理解就是:
你们都按照我的规范写代码,然后告诉我你想在哪个框架上运行,我就能自动搞定,如果你什么时候想换个框架了,代码不用动,告诉我要换成谁就行了。
Beam 怎么用?
下面通过经典案例wordcount来了解下Beam的用法
- 创建数据处理管道Pipeline
指定计算引擎,例如使用 Spark
PipelineOptions options = PipelineOptionsFactory.create();
options.setRunner(SparkRunner.class);
Pipeline p = Pipeline.create(options);
- 读取数据,得到一个集合 PCollection
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
- 第十章:Shiro的Cache——深入浅出学Shiro细粒度权限开发框架
- Appboy基于MongoDB的数据密集型实践
- 微信企业号登录授权Java实现获取员工userid根据userid换openid
- 微信支付-微信红包Java版本
- Universe入门
- 分享一款值得分享的写作工具
- 微信二次开发Java自定义菜单事件实现
- 微信OAuth授权获取用户OpenId-JAVA(个人经验)
- 【手写文字识别】-JavaAPI示例代码
- 【Python3-API】情感倾向分析示例代码
- SpringMVC+Hibernate +MySql+ EasyUI实现CRUD(一)
- 【Python3-API】通用文字识别示例代码
- Python入门教程之安装MyEclipse插件和安装Python环境
- AutoFlowLayout-多功能流式布局与网格布局控件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MySQL 视图、过程、函数
- 基于Spring Boot + Dubbo的全链路日志追踪(二)
- 基于Spring Boot + Dubbo的全链路日志追踪(一)
- 使用C语言编写Python扩展包
- PlantUML基本使用(一)--时序图
- gRPC基本使用(一)--java与go之间的相互调用
- confd基本使用--Nginx配置自动化
- JVM自定义类加载器
- Java代理相关:JDK动态代理、CGLIB动态代理
- Tomcat CPU占用100%异常分析与处理
- Solr基本搭建及MySQL配置
- Tomcat, Jre 证书相关
- zookeeper集群搭建
- Maven Jar包制作与上传及基本使用
- 当你在`bind 0.0.0.0`的时候,你实际在做什么