十分钟了解分布式计算:Google Dataflow
介绍
Google Cloud Dataflow是一种构建、管理和优化复杂数据处理流水线的方法,集成了许多内部技术,如用于数据高效并行化处理的Flume和具有良好容错机制流处理的MillWheel。Dataflow当前的API还只有Java版本(其实Flume本身是提供Java/C++/Python多种接口的,MillWheel也提供Java/C++的API)。
相比原生的map-reduce模型,Dataflow有几个优点:
可以构建复杂的pipeline,在这不妨引用Google云平台的产品营销总监Brian Goldfarb的话
Cloud Dataflow可以用于处理批量数据和流数据两种。在一个世界性事件(比如演讲当中的世界杯事件)中,实时分析上百万twitter数据。在流水线的一个部阶段责读取tweet,下一个阶段负责抽取标签。另一个阶段对tweet分类(基于情感,正面负面或者其他方面)。下一个阶段过滤关键词等等。相比之下,Map/Reduce这个用来处理大数据的较早模型,处理这种实时数据已经力不从心,而且也很难应用到这种很长很复杂的数据流水线上。
不需手工配置和管理MapReduce集群。自动进行代码优化和资源调度,使得开发者的主要精力可以放在业务逻辑本身

支持从Batch到Streaming模式的无缝切换:
假设我们要根据用户在twitter上产生的内容,来实现一个hashtags自动补全的功能Example: Auto completing hashtags Prefix Suggestions ar #argentina, #arugularocks, #argylesocks arg #argentina, #argylesocks, #argonauts arge #argentina, #argentum, #argentine 
代码几乎和数据流一一对应,和单机程序的编写方式差别不大

Dataflow将数据抽象为一个PCollections (“parallel collections”),PCollection可以是一个内存中的集合,从Cloud Storage读进来,从BigQuerytable中查询得到,从Pub/Sub以流的方式读入,或者从用户代码中计算得到。
为了对PCollection进行处理,Dataflow提供了许多PTransforms (“parallel transforms”),例如ParDo (“parallel do”) 对于PCollection中每一个元素分别进行指定操作(类似MapReduce中的Map和Reduce函数,或者SQL中的WHERE),GroupByKey对一个key-value pairs的PCollection进行处理,将相同key的pairs group到一起(类似MapReduce中的Shuffle步骤,或者SQL中的GROUP BY和JOIN)。
此外,用户还可以将这些基本操作组合起来定义新的transformations。Dataflow本身也提供了一些常用的组合transformations,如Count, Top, and Mean。
这是一个经典的批处理的例子

转化为streaming做法只需改动数据源。如果我们现在希望模型提供的是最新的热词,考虑数据的时效性,只需额外添加一行设置数据window的操作,比如说60min以前的数据我们就不要了

Dashboard:
还可以在developer console中了解流水线中每个环节执行的情况,每个流程框基本对应着一行代码

生态系统:
BigQuery作为存储系统是Dataflow的一个补充,经过Dataflow清洗和处理过的数据,可以在BigQuery中存下来,同时Dataflow也可以读取BigQuery以进行表连接等操作。如果想在Dataflow上使用一些开源资源(比如说Spark中的机器学习库),也是很方便的

为了配合Dataflow,Google Cloud Platform还为开发者提供了一系列工具,包括云保存,云调试,云追踪和云监控。
比较
- Cascading/Twitter Scalding:
1) 传统Map-reduce只能处理单一的流,而Dataflow可以构建整个pipeline,自动优化和调度,Dataflow乍一听感觉非常像Hadoop上的Cascading(Java)/Scalding(Scala)。
2) 它们的编程模型很像,Dataflow也可以很方便做本地测试,可以传一个模拟集合,在上面去迭代计算结果,这一点是传统Map-reduce望尘莫及的。 - Twitter Summingbird:
而将批处理和流处理无缝连接的思想又听起来很像把Scalding和Strom无缝连接起来的twitter summingbird(Scala). - Spark:
1) Spark也有可以构建复杂的pipeline做一代码优化和任务调度的好处,但目前还需要程序员来配置资源分配。
2) Spark在设计分布式数据集API时,模拟了Scala集合的操作API,使得额外的语法学习成本比Dataflow要低。
3) 不过Dataflow似乎并没有提内存计算的事儿,而这一点可以说是Spark最本质的特征。不过它支持将Spark作为Open Source工具,连入Cloud框架作为补充。
4) 分布式计算中除了Batch和Streaming,Graph也是一个重要的问题,Spark在这方面有GraphX,Dataflow在未来也会将处理Graph处理(Pregel)这块整合进去。
参考
本文的内容主要基于官方资料
Sneak peek: Google Cloud Dataflow, a Cloud-native data processing service
Google I/O 2014 - The dawn of "Fast Data"(国内用户下载)
链接
Google Announces Cloud Dataflow Beta at Google I/O
Google Launches Cloud Dataflow, A Managed Data Processing Service
Mapreduce successor google cloud dataflow is a game changer for hadoop thunder
论文
FlumeJava: Easy, Efficient Data-Parallel Pipelines,PLDI,2010
转载请注明出处:
十分钟了解分布式计算:Google Dataflow
十分钟了解分布式计算:Google Dataflow的更多相关文章
- 十分钟了解分布式计算:GraphX
GraphX原型论文 GraphX是Spark中用于图(e.g., Web-Graphs and Social Networks)和图并行计算(e.g., PageRank and Collabora ...
- 十分钟了解分布式计算:Spark
Spark是一个通用的分布式内存计算框架,本文主要研讨Spark的核心数据结构RDD的设计思路,及其在内存上的容错.内容基于论文 Zaharia, Matei, et al. "Resili ...
- 十分钟了解分布式计算:Petuum
Petuum是一个机器学习专用分布式计算框架,本文介绍其架构,并基于文章 More Effective Distributed ML via a Stale Synchronous Parallel ...
- 十分钟了解分布式计算:GraphLab
GraphLab是一个面向大规模机器学习/图计算的分布式内存计算框架,由CMU在2009年开始的一个C++项目,这里的内容是基于论文 Low, Yucheng, et al. "Distri ...
- Google Dataflow
十分钟了解分布式计算:Google Dataflow 介绍 Google Cloud Dataflow是一种构建.管理和优化复杂数据处理流水线的方法,集成了许多内部技术,如用于数据高效并行化处理的Fl ...
- 花十分钟,让你变成AI产品经理
花十分钟,让你变成AI产品经理 https://www.jianshu.com/p/eba6a1ca98a4 先说一下你阅读本文可以得到什么.你能得到AI的理论知识框架:你能学习到如何成为一个AI产品 ...
- 后端技术杂谈11:十分钟理解Kubernetes核心概念
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 本文转自 https://github.com/h2pl/Java-Tutorial 喜欢的 ...
- 通过Amazon AWS 十分钟搭建私人主机 自由的不要不要的
首先承认有点标题党了,当时自己搞的时候可不止十分钟,好吧,我承认是坑太多了,所以特意开了一篇博文,就是要准备尝试的和我一样的菜鸟们,可以真正的十分钟搞定. 当然高手可能用不上十分钟. 首先,就是 ...
- 基于 Laravel-Admin 在十分钟内搭建起功能齐全的后台模板
http://laravelacademy.org/post/6468.html 1.简介 为 Laravel 提供后台模板的项目越来越多,学院君已陆续为大家介绍过Laravel Angular Ad ...
随机推荐
- mac 解决eclipse OutOfMemoryError
1.找到eclipse.ini文件 找到你的eclipse图标右击————>显示包内容-->contents -->macos -->eclipse.ini 2.修改内容 -s ...
- php基础_函数和类
①函数 1.函数名不区分大小写,变量名区分大小写. 2.require()和include() 区别:函数加载失败后,require给出一个致命错误,include只是一个警告. ②类 1.构造方法 ...
- 高手总结的“恋爱法”学习Linux系统,效果更好。
如果你恋爱了,那你一定非常喜欢她.了解她,知道她喜欢吃什么玩什么,知道她需要什么,在她生气的时候可以哄她开心,一切尽在你的手指中.那你想学好Linux吗?喜欢Linux吗?你懂她吗?你有喜欢Linux ...
- EasyUI表单内容整理
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- Bootstrap <基础三十二>模态框(Modal)插件
模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用 ...
- TRACERT命令
这半个月 服务器从联通线路换到移动线路 导致基层用联通和电信线路的用户 上不去收费软件 tracert 120.194.42.142:8090 发现路由器 解析地址绕过很多条街后 出现丢包现象 联系 ...
- C# UdpClient使用Receive和BeginReceive接收消息时的不同写法
使用Receive(同步阻塞方式), 注意使用同步方法时,需要使用线程来开始方法,不然会使UI界面卡死 IPEndPoint RemoteIpEndPoint = ); UdpClient udpCl ...
- 【转帖】Python在大数据分析及机器学习中的兵器谱
Flask:Python系的轻量级Web框架. 1. 网页爬虫工具集 Scrapy 推荐大牛pluskid早年的一篇文章:<Scrapy 轻松定制网络爬虫> Beautiful Soup ...
- 在MyEclipse显示struts2源码和doc文档及自动完成功能
分类: struts2 2010-01-07 16:34 1498人阅读 评论(1) 收藏 举报 myeclipsestruts文档xmlfileurl 在MyEclipse显示struts2源码和d ...
- 课程笔记:——Javascript 中的预解释1
1.预解释(变量提升):在当前作用域下,JS代码执行之前,浏览器首先会把所有带var和function关键字的进行提前的声明或者定义var num = 12;声明(declare): var num; ...