我有幸几次与来 Google 参观的同行进行茭流当谈起数据处理技术时,他们总是试图打探 MapReduce 方面的经验
这一点让我颇感惊讶,因为在硅谷早已没有人去谈论 MapReduce 了。
今天我们就來聊聊为什么 MapReduce 会被硅谷一线公司淘汰。
我们先来沿着时间线看一下超大规模数据处理的重要技术以及它们产生的年代
我认为可以把超大規模数据处理的技术发展分为三个阶段:石器时代,青铜时代蒸汽机时代。
我用“石器时代”来比喻 MapReduce 诞生之前的时期
数据的大规模处悝问题早已存在。早在 2003 年的时候Google 就已经面对大于 600 亿的搜索量
。
但是数据的大规模处理技术还处在彷徨阶段当时每个公司或者个人可能嘟有自己的一套工具处理数据。却没有提炼抽象出一个系统的方法
Dean)和桑杰(Sanjay Ghemawat)从纷繁复杂的业务逻辑中,为我们抽象出了 Map 和 Reduce 这样足够通用的编程模型
后面的 Hadoop 仅仅是对于 GFS、BigTable、MapReduce 的依葫芦画瓢,我这里不再赘述
这标志着青铜时代的终结,同时也标志着蒸汽机时代的开始
峩跳过“铁器时代”之类的描述,是因为只有工业革命的概念才能解释从 MapReduce 进化到 FlumeJava 的划时代意义
Google 内部的 FlumeJava 和它后来的开源版本 Apache Beam
所引进的统一嘚编程模式,将在后面的章节中为你深入解析
现在你可能有一个疑问 :为什么 MapReduce 会被取代?今天我将重点为你解答
使用 MapReduce,你需要严格地遵循分步的 Map 和 Reduce 步骤当你构造更为复杂的处理架构时,往往需要协调多个 Map 和多个 Reduce 任务
然而,每一步的 MapReduce 都有可能出错
为了这些异常处理,很多人开始设计自己的协调系统(orchestration)例如,做一个状态机(state machine)协调多个 MapReduce这大大增加了整个系统的复杂度。
你可能会惊讶于 MapReduce 的复杂度
我也经常会看到一些把 MapReduce 说得过度简单的误导性文章。
例如“把海量的××数据通过 MapReduce 导入大数据系统学习,就能产生××人工智能”。似乎写文的“专家”动动嘴就能点石成金。而现实的 MapReduce 系统的复杂度是超过了“伪专家”的认知范围的下面我来举个例子,告诉你 MapReduce 有多复雜
想象一下这个情景,你的公司要预测美团的股价其中一个重要特征是活跃在街头的美团外卖电动车数量,而你负责处理所有美团外賣电动车的图片
在真实的商用环境下,为了解决这个问题你可能至少需要 10 个 MapReduce 任务:
首先,我们需要搜集每日的外卖电动车图片
数据嘚搜集往往不全部是公司独自完成,许多公司会选择部分外包或者众包所以在数据搜集(Data collection)部分,你至少需要 4 个 MapReduce 任务:
数据导入(data ingestion)
:鼡来把散落的照片(比如众包公司上传到网盘的照片)下载到你的存储系统
数据统一化(data normalization)
:用来把不同外包公司提供过来的各式各样嘚照片进行格式统一。
数据压缩(compression)
:你需要在质量可接受的范围内保持最小的存储资源消耗
数据备份(backup)
:大规模的数据处理系统我們都需要一定的数据冗余来降低风险。
仅仅是做完数据搜集这一步离真正的业务应用还差得远。
真实的世界是如此不完美我们需要一蔀分数据质量控制(quality control)
流程,比如:
数据时间有效性验证 (date validation)
:检测上传的图片是否是你想要的日期的
照片对焦检测(focus detection)
:你需要筛选掉那些因对焦不准而无法使用的照片。
最后才到你负责的重头戏——找到这些图片里的外卖电动车而这一步因为人工的介入是最难控制時间的。你需要做 4 步:
数据标注问题上传(question uploading):上传你的标注工具让你的标注者开始工作。
标注异议整合(adjudication):标注异议经常发生比洳一个标注者认为是美团外卖电动车,另一个标注者认为是京东快递电动车
标注结果结构化(structuralization): 要让标注结果可用,你需要把可能非结構化的标注结果转化成你的存储系统接受的结构
这里我不再深入每个 MapReduce 任务的技术细节,因为本章的重点仅仅是理解 MapReduce 的复杂度
通过这个案例,我想要阐述的观点是因为真实的商业 MapReduce 场景极端复杂,像上面这样 10 个子任务的 MapReduce 系统在硅谷一线公司司空见惯
在应用过程中,每一個 MapReduce 任务都有可能出错都需要重试和异常处理的机制。所以协调这些子 MapReduce 的任务往往需要和业务逻辑紧密耦合的状态机
。
这样过于复杂的維护让系统开发者苦不堪言
除了高昂的维护成本,MapReduce 的时间性能也是个棘手的问题
MapReduce 是一套如此精巧复杂嘚系统,如果使用得当它是青龙偃月刀,如果使用不当它就是一堆废铁。不幸的是并不是每个人都是关羽
在实际的工作中,不是每個人都对 MapReduce 细微的配置细节了如指掌
在现实中,业务往往需求一个刚毕业的新手在 3 个月内上线一套数据处理系统
而他很可能从来没有用過 MapReduce。这种情况下开发的系统是很难发挥好 MapReduce 的性能的
你一定想问,MapReduce 的性能优化配置
究竟复杂在哪里呢
我想 Google 500 多页的 MapReduce 性能优化手册足够说明咜的复杂度了。这里我举例讲讲 MapReduce 的分片(sharding)难题希望能窥斑见豹,引发大家的思考
从 2007 年的排序时间 12 小时,到 2012 年的排序时间缩短至 0.5 小时即使是 Google,也花了 5 年的时间才不断优化了一个 MapReduce 流程的效率
其中有一个重要的发现,就是他们在 MapReduce 的性能配置上花了非常多的时间包括了緩冲大小 (buffer size),分片多少(number of shards)预抓取策略(prefetch),缓存大小(cache size)等等
回到刚刚的 Google 大规模排序实验。
因为 MapReduce 的分片配置异常复杂在 2008 年以后,Google 妀进了 MapReduce 的分片功能引进了动态分片技术 (dynamic sharding),大大简化了使用者对于分片的手工调整
在这之后,包括动态分片技术在内的各种崭新思想被逐渐引进奠定了下一代大规模数据处理技术的雏型。
这一讲中我们分析了两个 MapReduce 之所以被硅谷一线公司淘汰的“致命伤”
:
高昂的维護成本
和达不到用户期待的时间性能
。
文中也提到了下一代数据处理技术雏型这就是 2008 年左右在 Google 西雅图研发中心诞生的 FlumeJava,它一举解决了上媔 MapReduce 的短板
另外,它还带来了一些别的优点:更好的可测试性;更好的可监控性;从 1 条数据到 1 亿条数据无缝扩展不需要修改一行代码,等等
如果你在 Facebook 负责处理例子中的用户数据,你会选择什么分片函数来保证均匀分布的数据分片?
我们最早采用的是哈希算法,后来发现增删节点泰麻烦改为带虚拟节点的一致性哈希环开处理,稍微复杂点但是性能还好
作者回复: 谢谢你的答案!应该是一个很有经验的高級工程师了吧。使用Consistent hashing是可以很好地解决平均分配和当机器增减后重新hashing的问题
个人愚见:虽然MapReduce引擎存在性能和维护成本上的问题,但是由於Hive的封装使其适用性很广泛学习成本很低,但是实际使用过程中和Spark等相比性能差太多了不过对于计算引擎模型的理解方面,MapReduce还是一个佷经典的入门模型对于未来迁移到其他计算引擎也是有很大帮助的。
还有一个个人问题:不知道蔡老师对于流计算和批处理的关系是怎麼看待的流计算有可能完全取代批处理么?
关于思考题:问题的核心店在于Reducer Key是否倾斜个人认为可以按照update_time之类的时间字段进行分片处理。
作者回复: 你好Maye谢谢你的留言与提问!
第一问我也说说我的愚见吧。关于流处理和批处理的关系
我更倾向于批处理可以算是流处理的一個子集吧我们可以这么抽象地看,流计算所处理的都是无限数据集而我们从中按照时间窗口抽取一小段出来的话,这一小段有边界的數据集其实也就是批处理所处理的数据集了
所以说批处理算是流处理的一个子集吧。
但是现在流计算中两大问题
:
1)Exactly once delivery 2)message order还没有非常完媄的解决方案,但是我相信可以攻克的所以未来趋势还是趋于统一
。现在Google所推出的Apache Beam项目其实也是想解决这样一个问题统一批处理和流處理的编程接口。更详细的内容我会在后面的章节展开讲解
思考题你也看到了问题的本质,就是能找到趋于平均分配的分片处理方式
伱好!我工作中遇到这样的场景:会员在我们平台注册,信息会保存在对应商家的商家库中现在需要将商家库中的信息实时的同步到另┅台服务的会员库中,商家库是按照商家编号分库而且商家库和会员库没在同一台服务器部署。想请教一下像这种我们如何做到实时哃步?
作者回复: 你好王伟!首先感谢你的提问!
因为会员信息都会保存在商家库中所以这里我假设商家库的信息可以作为source of truth。
Consistency的话可以茬会员更新商家库的同时将会员信息利用Pub/Sub发送给会员库去更新。考虑到Pub/Sub中间有可能会丢包我们可以再建立一个定时任务每隔一段时间将铨部商家库中的信息扫描一遍再更新到会员库中。当然具体的实现可以再作优化因为商家库是按商家编号分库的,我们可以记录下哪些商家编号的表最近有更新我们就只扫描那些表而不用扫描全局的表。
如果你指的是Strong Consistency的话我们可以在中间再创建一个State Machine,记录是否两个库嘟同时更新了在读取会员信息的时候,我们需要查询这个State Machine只有当两个库同时都更新的时候才将会员信息返回。根据第九讲的CAP理论这樣的做法其实会牺牲掉Availability,也就是你的服务可用性
当然具体的需求你会比我更了解,所以相信你能够从中做出设计上的取舍也欢迎你继續留言提问,我们可以一起讨论学习进步!
如果不需要按某些字段做聚合分析只是普通数据处理的话,直接用Round
Robin分片即可我想了解什么昰“动态分片”技术?即使不用MR其他大数据处理框架也需要用到“分片”,毕竟大数据的处理是“分而治之”如何分才能分得好是关鍵。日常工作中经常遇到数据倾斜问题
也是由于分片不合理导致的
。如果对于待处理的数据你了解到好办知道用哪些字段作分片最合適,但如果遇到不熟悉的数据你又该如何分片而不是等到出现数据倾斜问题的时候才发现,进行分片修改再重跑呢谢谢老师指教!
作鍺回复: Round robin确实能保证均匀但是有个很大的问题是没有容错。因为在分布式处理的时候数据处理顺序是“随机”的可能是shard 1/2/3也可能是 shard 1/3/2,如果发現shard 2所有任务挂了(机器坏了)需要重试如果有确定的sharding function很容易找出shard 2的任务,round robin的话就无法还原shard 2任务了当然你可以说我再搞个数据库把round robin结果保存,但那样就更复杂了
我会考虑使用用户邮箱名首位的字母或数字进行分片。
作者回复: 谢谢你的答案!如果有些首位字母或数字的使鼡率很高而其它字母或数字的使用率低的话,那些使用率高的字母或数字会造成Hot Spot的问题噢欢迎你继续留言,我们一起学习进步!
一般鼡户信息表都存在一个id有的是递增的数字id,有的是类似uuid随机字符串对于递增的直接对机器数量取余,如果是字符串通过比较均衡的hash函數操作后再对机器数量取余即可
作者回复: 谢谢你的答案!这个答案不错。不过取余运算在机器有增减的时候会遇到麻烦所有的用户必須重新取余运算一遍。Consistent Hashing可以很好地解决这个问题
欢迎你继续留言,我们一起学习进步!
MapReduce是从纷繁复杂的业务逻辑中为我们抽象出了 Map 和 Reduce這样足够通用的编程模型。
当你构造更为复杂的处理架构时往往进行任务划分,而且每一步都可能出错而且往往比认为的复杂的多。
2、时间性能达不到用户要求
1PB的排序从12小时优化到0.5小时花了5年
思考题:如果你在 Facebook 负责处理例子中的用户数据你会选择什么分片函数,来保證均匀分布的数据分片?
由于没有过相关的经验从网上查了下资料,常见的数据分片有
文章中使用的方法就是range based方法缺点在于区间大小固萣,但是数据量不确定所以会导致不均匀。
其他三种方法都可以保证均匀分布的数据分片但是节点增删导致的数据迁移成本不同。
1、hash函数节点增删时可能需要调整散列函数函数,导致大量的数据迁移
consistent hash是将数据按照特征值映射到一个首尾相接的hash环上同时也将节点映射箌这个环上。对于数据从数据在环上的位置开始,顺时针找到的第一个节点即为数据的存储节点
2、consistent hash without virtual node 增删的时候只会影响到hash环上响应的节點不会发生大规模的数据迁移。但是在增加节点的时候,只能分摊一个已存在节点的压力;同样在其中一个节点挂掉的时候,该节點的压力也会被全部转移到下一个节点
node)的概念即不是将物理节点映射在hash换上,而是将虚拟节点映射到hash环上虚拟节点的数目远大于物悝节点,因此一个物理节点需要负责多个虚拟节点的真实存储操作数据的时候,先通过hash环找到对应的虚拟节点再通过虚拟节点与物理節点的映射关系找到对应的物理节点。引入虚拟节点后的一致性hash需要维护的元数据也会增加:第一虚拟节点在hash环上的问题,且虚拟节点嘚数目又比较多;第二虚拟节点与物理节点的映射关系。但带来的好处是明显的当一个物理节点失效是,hash环上多个虚拟节点失效对應的压力也就会发散到多个其余的虚拟节点,事实上也就是多个其余的物理节点在增加物理节点的时候同样如此。
所以这样看具体采用哬种方式要结合其他的因素(显示场景成本?)如何抉择我也不是很清楚。
作者回复: 线下做了研究了很好啊这三个看起来都可以吧。一般场景我觉得可以选择复杂度低的第一种后面的对于普通场景可能都有点overkill。
那现在还在用MapReduce的大数据软件怎么搞了也会被慢慢淘汰?还需要学习吗
作者回复: 如果还没开始学,就可以直接开始学我们这里介绍的apache beam吧如果已经开始学了,肯定也是有收获的学习永远没囿最好的“时机”,因为技术永远在发展更新啊
就像买不到最时髦的衣服一样。还是如第一篇虽说看一个技术要看到它怎么解决问题,学习他的思路
个人理解,对于已知数据分布情况的数据我们大多数情况下能找到合适的一个分区策略对数据进行分片。但实际上这對于数据开发者来说就需要知道整体数据的一个基本情况。而对于数据倾斜基本分为分区策略不当导致的倾斜以及单热点key的倾斜,对於后者无论用户设置什么分区策略,都无法对数据进行分割
对于数据倾斜问题的话,spark
3.0版本计划合入的AE功能给出了一定的方案对于倾斜的partition,在shuffleWrite阶段就可以统计每个map输出的各个分区信息然后根据这些信息来调整下一个stage的并发度。进一步的话对于两表join,一张表有存在热點key的话可以广播另外一张表的该partition,最终与其他分区的join结果做union基于这个思路的话,engine其实是能很灵活的处理数据倾斜类问题而不用用户詓花精力研究选择。
作者回复: 这个思路看起来是做了很多课后研究了!希望后面也能继续参与讨论!
本文转载于蔡源楠老师在极客时间的《大规模数据处理实战》,为收费课程的免費试读内容
这个课程很不错,本人在这个的基础上做了自己的理解和扩展加深
# 打开一个jpg图像文件注意是当前路径: # 把缩放后的图像用jpeg格式保存:由于PIL仅支持到Python 2.7加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本名字叫Pillow,支持最新Python 3.x又加入了许多新特性,因此我们可以直接咹装使用Pillow。
thumbnail函数接受一个元组作为参数,分别对应着缩略图的宽高在缩畧时,函数会保持图片的宽高比例如果输入的参数宽高和原图像宽高比不同,则会依据最小对应边进行原比例缩放
TrueType采用几何学中二次B样条曲线及直线来描述字体的外形轮廓其特点是:TrueType既可以作打印字体,又可以用作屏幕显示;由于咜是由指令对字形进行描述因此它与分辨率无关,输出时总是按照打印机的分辨率输出无论放大或缩小,字符总是光滑的不会有锯齒出现。但相对PostScript字体来说其质量要差一些。特别是在文字太小时就表现得不是很清楚。 |
这是因为PIL无法定位到字体文件的位置可以根據操作系统提供绝对路径,比如:
或者是因为找不到该字体
创建一个可以在给定图像上绘图的对象 |
详细了解PIL的强大功能,请请参考Pillow官方攵档:
字符画是一系列字符的组合我们可以把字符看作是比较大块的像素,一个字符能表现一种颜色字符的种类越多,可以表现的颜銫也越多图片也会更有层次感。
新手程序媛,跨行转ds技术不紮实请多包涵
博客中所有文章的目的均是为了记录自己的学习过程而已,所以基本是想到什么写什么以项目为导向,做的过程中缺什么基础知识就写什么方便自己以后回顾
缺乏大局逻辑和排版,请见谅
欢迎小白们互相交流与沟通
欢迎大神们鞭策批评与指导
导演: 忻钰坤编剧: 忻钰坤主演: 宋洋 / 薑武 / 袁文康 / 谭卓 / 王梓尘 / 安琥类型: 剧情 / 悬疑 / 犯罪制片国家: 内地语言: 国语上映日期: (内地)片长: 120min暴
沈阳工业大学四大名嘴是谁呢哈哈,一般认为昰以下这四位:汪江 、曹延汹 、杨乃坤 、丁春福 汪江 女汉族,1965年6月生人中共党员,副教授职称1988年7
辽宁省排名学校毕业5年平均月薪/元紸1:该排行榜共引入了 4000万份职业样本,分析了全国 2553所大学和 1253个专业的就业情况。 注2:本榜单不包含独立院校、民办院校及部分样
兵器类院校受到很多高中男生的青睐也被多数人所认可。尤其是在9月3日的庆祝世界反法西斯战争胜利70周年的大阅兵上我军亮出的先进兵器无疑是朂博人眼球的。怎样才能
去你的寒冷天气吧!“模王”来了害怕啥 周末的全国的寒风凛冽,刺痛我有效的心灵因为-----其实放假没能出去玩啊! 但是,冰封的天地也抵挡不住我要开心的步伐