《分布式实时处理系统:原理、架构与实现.html.pdf》由会员分享,可在线阅读,更多相关《分布式实时处理系统:原理、架构与实现.html.pdf(81页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、本书赞誉 本书不但讲解高性能分布式实时处理系统编程的原理,特别对内存资源管理、编码解决方案、并发与异步处理、线程模型、 批处理与实时处理的区别、消息队列、动态装载等作了详细介绍,还深入分析了实时处理系统的架构以及内部实现,最后详细分 析了怎样实现一套分布式实时处理系统Hurricane。本书非常适合大数据开发人员和架构师阅读,同时可以解决性能优化的很多 问题。 卢亿雷,AdMaster技术副总裁兼总架构师 分布式系统可以追溯到20世纪60年代的ARPANET。随着物联网、边缘计算和其他相关领域的蓬勃发展,对高性能分布式实 时处理系统的需求日益增多。这本技术专著着眼于实际分布式框架的编程应用,将
2、助力有志于该领域的软件开发人员。 安宁,Oracle空间数据部门首席工程师、IEEE高级会员和ACM终身会员 本书不仅仅是一部讲授代码编写的书籍,还是一个开源社区的星星火种,我特别推荐所有对实时大数据分析感兴趣的同业中 人阅读此书,并以此作为迈入下一个开源大时代的第一步。 徐立冰,思科系统高级客户经理 通常来说,在互联网+、大数据时代盛行拿来主义;有开源的Spark、Strom,绝对不会动自己构建分布式系统的心思。但 是作者不然,深厚的C+功底以及对分布式计算框架的深度理解,构建了高性能分布式、实时处理系统Hurricane,进入了更高 层次的追求。 静下心来,这本书将对自己的C+编程、分布式
3、存储系统、分布式计算框架、分布式通信等知识进行了洗礼,不知不觉间 就提升了自己的层次,期待阅读本书之后,也可以构建一个全新的分布式实时处理系统,变成分布式实时计算领域的贡献者。 路已铺好,如何贡献,那是追求。 于俊,科大讯飞大数据专家 “天下武功,无坚不摧,唯快不破”,如果说以MapReduce、Spark等为代表的批处理方式,是数据处理的“坚”,则 Storm、Hurricane等流处理系统,充分体现了数据处理的“快”。本书由浅到深,从基础的分布式系统的概念、网络通信和 C+11高性能编程,到流处理中的消息、消息源、处理单元、收集器、计算拓扑等重要抽象的实现,到日志处理、频繁组合等 典型应用
4、,深入研究了一个典型分布式流处理系统的各个重要方面,推荐。 蔡斌,腾讯科技高级工程师 分布式实时处理系统,难就难在把分布式和实时处理结合起来。本文从拆解留言板系统开始节节升级,直至推出Hurricane 实时处理系统,旁征博引,纲举目张。充分体现了分布式构建和实时处理的细节考虑。 彭敏,思科系统(中国)研发有限公司服务器与平台架构部门研发经理 作者以他参与Cisco和Autodesk诸多大型系统开发时所积累的经验以及对开源技术多年的钻研铸就本书。本书由理论到应 用,由实现到优化,由浅入深,抽丝剥茧地把这么浩繁的概念在本书中讲得十分清晰。 张洋,Autodesk(中国)研发中心平台架构研发部门经
5、理 正如“如何阅读本书”中说的一样,“本书从最基本概念作为引子,逐步引入高性能分布式实时处理系统编程所需要的方方 面面,抽丝剥茧把实时处理系统的架构以及实现娓娓道来”,有概念、有理论,有本身知识体系的交代,也有周边必要知识内容 的说明,有实战、有案例,不空谈,能落地,是一本不可多得的学习分布式实时架构的好书。 贾锋,知名大数据布道者和践行者 序一 2016年春节刚过,此时距离我出版腾云已经过去三年,而写作一本技术书籍的艰辛仍然历历在目。我身边有不少大拿 级别的牛人,不少都被出版社试探过,但真正动笔的寥寥可数,主要原因是写书实在不是一件吃饭喝酒般轻描淡写的事情。在被 本职工作和家庭琐事折腾得死去
6、活来的间隙,强打起精神一砖一瓦地堆砌出几十万字,想想就让人却步,而这个过程往往历时数 月,这意味着你要过上小一年的苦行僧式生活。若不是对书中主题保持着异乎寻常的兴趣和坚定不移的信念,一般人不会轻易开 始这段苦旅。正是因为这个原因,我相信卢誉声的这本书一定是个干货满满的好东西。 优秀的技术书籍都有一个特点,那就是自下而上的阐述方式,从最底层、最实际的操作层面入手,而不是形而上的口号式概 念,而本书则正是这样一本书。读者从第1章就能实际触摸到实操的快感,书中讲解了大量实例,我常说“一百字的定义,不如 一句话的实例”,通过这些范例,读者可以快速获得感性认识,进而随着章节的推进把这些认知归纳总结为自己
7、能够掌握的方法 论。在游泳中学习游泳,说的就是这种简单、实用的学习思路。而考验一个作者功力的地方,就是他能否针对每个关键概念提出 恰当清晰的例子,并阐述清楚。从我读到的篇章来看,卢誉声的这个工作完成得相当不错。这样一本朴实而扎实的技术书籍反映 的是作者的态度,作为读者,在阅读过程中我可以感受到字面下作者热切希望跟广大同行分享的激情,那种把自己的认识和盘托 出的诚恳是每一个痴迷于技术的工程师都有过的感受,卢誉声体会过,我体会过,这本书未来的大多数读者都体会过。正是这种 对技术的诚恳让我相信本书值得一读。 回过头来我想说说对开源的认识。本书由Apache Storm说开,Apache Storm作
8、为一个顶级开源项目在业界的影响力无需 多言,为了了解项目的背景,我特意读了Storm项目的孕育者Nathan Marz的长文History of Apache Storm and lessons learned。我发现,虽然Nathan充分认识到Storm能够带来的商业潜力(赶在Twitter收购前公开展示Storm的效果),但他 从来没有动摇过将这个项目完全开源的打算,甚至应该反过来说,他从来没想过要将Storm作为一个私有计划保持下去。2011 年7月,Nathan所在的BackType正式被Twitter收购,几乎毫不犹豫的,他旋即开始着手将Storm开源,这之后便是大家熟悉的 故事,S
9、torm以令人炫目的速度吸收开发者,并在短短三年后,于2014年9月17日正式成为Apache顶级项目。 为什么会有开源运动?这已经是一个无法再吸引注意力的老旧话题,无数人从商业、技术、社会等领域给出了无数严密的解 答,但我们真的从心里认可这种行为了吗?特别是在国内的商业环境下,广大工程师每天享受开源项目的成果之余,真的理解开 源运动的深意了吗?至少对我来说,花了很长一段时间才得出能够说服自己的解释。 第一个我无法理解的现象就是,开源并没有带来可量化的商业价值。作为开源世界的老大哥,Red Hat的管理层向股东保证 在2016财年达到20亿美元销售额,此时距离Red Hat成立已经超过20年。
10、作为对比,2015财年Microsoft的销售额超过930亿美 元,如果说今日的微软已经包括了游戏机硬件、搜索等与软件不相关的业务,那么另一个传统软件领域的代表Oracle在2015年 营收达到382亿美元,而SAP也有200亿美元。这些被嘲笑成“史前恐龙”的传统软件厂商在不同场合被描述为落后生产力的代 表,它们站在开源潮流的对立面,出于狭隘的商业利益,沿着封闭、自我的路线一意孤行。可事实是,软件产业说到底同卖手 机、卖汽车一样,仍然是一门生意,遵循用户用脚投票的商业规律,既然开源这么美好,为什么没有像苹果手机一样,通过巨大 的商业成功快速颠覆原有模式呢? 另一个一直以来我没想明白的问题是,作
11、为最终用户的工程师为什么要拥抱开源呢?开源固然可以给程序员带来莫大的快 感,不管是个人成就还是物质回报,以往依附于大型软件公司的独立程序员现在有机会在社区通过个人贡献树立更大的影响力; 可是对于绝大使用这些产品的工程师来说,开源和商业产品的区别就没有那么大了,而使用开源还伴随着学习成本和不稳定的后 期支持。即使如此,我们周围抵触开源的声音却越来越小,即使那些最老资历、最忠诚的Oracle DBA也开始接触MySQL,很有 意思? 把时间拉回20世纪90年代,彼时个人电脑还是黑科技代表之一,学校还会开设“电脑课”教授基本操作,这类课程中往往 很重要的一个章节就是“五笔打字”法。打字这个技巧放在今
12、天几乎是跟走路、吃饭一样的基本生存技能,90后一代已经很难 回忆起来自己是在哪个时刻“学”会了打字,大多数都是自然而然在日常生活中磨练出来的。20年前的一门专业技巧现在已经 完全融入大众生活,这其中蕴含了一个有意思的规律,即任何一种技能都会随着时间的推移失去门槛,同时在这个过程中经过无 数人的实践和磨练,这项技能已经进化出一套最有效率的模式,后来者可以跳过探索、试验的过程,用最短的时间直接掌握这套 模式就能实现之前高手级别才能达到的效果。在打字这个例子中,对于中国人来说目前在高效与易学间取得最佳平衡的是具备联 想功能的拼音输入法,因此年轻的电脑用户只需听从朋友推荐下载正确的软件,两三天内就能练
13、就足够应付日常交流的打字能 力。 如果把视线拉远,欣欣向荣的新型操作系统和数据库正是这种技能门槛不断拉低的现象在软件领域的投射。操作系统、大型 数据库这些领域在20世纪90年代是皇冠顶上的宝石,全世界也只有那么一小簇顶尖专家能够弄明白其中的奥妙,而时间过去20 年,Microsoft们已经培养出一大群熟悉这些大型系统的专家,人力门槛不复存在,而搭建一个操作系统或数据库的基本方法论 现在已经非常成熟,因此开发操作系统不再有那么耀眼的光环,越来越多的政府机构、企业、科研机构甚至个人进入这个领域, 并且取得不错的成果。这完全是因为最初的那一批精英已经填平了这条路上的大坑,并将他们提炼出来的最优方法论
14、形成“可复 制的经验”,而后来人能够直接利用这些“可复制的经验”,快速经过基础知识积累阶段,直接针对当下的难点攻坚,从而令一 些出色的后来者能够进一步推高整个领域的高度。 在没有开源运动的时代,“可复制的经验”的传承是受到严格限制的,要么在企业内部形成专利,只有技术团队的核心成员 能够接触到,要么在科研机构的高墙后,少部分有能力进入高墙后的精英得以一窥究竟。开源几乎是以几何倍数放大了“可复制 的经验”的传播速度,这种方式在技术领域带来的后果是极大地加快了技术本身的演进,这很好理解,因为参与的人多了,众人 拾柴火焰高,自然比小团体的做法有效率。而在商业领域,开源则令资源配置更有效率,开源行为本身
15、会大量产生“可复制的经 验”,从而反过来进一步拉低特定技术领域的门槛,加速技术的演进,企业的决策者发现新技术的成熟速度大大加快,因此他们 必须更加积极地把资源配置到更前沿的领域以保持竞争力。回到Red Hat的例子,虽然这家公司本身的销售额永远不可能达到 Microsoft或Oracle的高度,但Red Hat以远比Microsoft小得多的规模提供了一个同样可靠并更加灵活的操作系统,为整个行业 释放出大量优秀工程师资源,这些人才将进入云计算、大数据等新兴行业,在新的山头攻坚。如果没有Red Hat这样的企业以最 有效率的方式为行业提供基础设施,新的技术领域很难建立足够的人才队伍,整个行业的发
16、展速度也会缓慢下来。因此,我们不 能只看Red Hat的销售额,还应该看看AWS、Salesforce这样的新兴玩家,正是因为有了Red Hat,才有后者的高速发展。对于 个人而言,这种大趋势是不可阻挡的,聪明的老专家们自然会即时调整方向,拥抱开源。 开源运动近年来已经逐渐突破计算机软件领域,开始向其他行业扩展,例如开源服务器硬件、开源网络设备,甚至开源的IT 管理流程。说白了,开源是一种新时代的知识传承模式,未来的世界将处处开源,竞争的壁垒将体现在高效协调资源的能力,而 不是对特定知识的独占。当我知道卢誉声将把书中提到的Hurricane完全开源时,我非常赞同他的做法。因为这个动作,本书不
17、仅仅是一部讲授代码编写的书籍,还是一个开源社区的星星火种,我特别推荐所有对实时大数据分析感兴趣的同业中人阅读此 书,并以此作为迈入下一个开源大时代的第一步。 徐立冰 思科系统高级客户经理 序二 最近,我陷入纷繁复杂的产品问题中,难以自拔,而当我看到这本书时,感想良多,思绪万千。想到我刚工作时非常喜欢一 类书,“xx技术yy天从入门到精通”,一般都是从基本概念到实际操作全程指导,非常适合入门新手。随着工作的深入和扩展, 百度、谷歌和各种技术论坛、知识库又成为更常用的查询工具。 然而,正如武打小说里的速成功夫或者一招鲜,始终不能让我们到达真正高手的境界。系统的学习和实践一门技术才是攀上 高阶的王道
18、。 我和作者誉声共事多年,多数时间从事分布式实时处理系统设计和实现,誉声举一反三,经常通过具体案例和问题,总结、 归纳出规律和特点,继而演绎出适应性更强的结构,我受益良多。 现在这份关于分布式实时处理系统的佳作由浅入深,由易到难。从头读来,可以感受到完整的分布式系统的清晰脉络。尤其 难得的是,既有高屋建瓴的架构设计,又有C+最细、最艰深的要点剖析;既有明确的理论指导,又有细节到代码行的具体实 现。这就是一套进阶大规模计算领域的秘笈。 分布式实时处理系统可以说是软件发展中里程碑式的智慧结晶,凝结了无数高手的心血,也是大规模业务持续推动的结果。 一般只有很大的软件公司或者开源组织有能力投资发展。能
19、有长期深入的实际工作经验很不容易,可以看出本书都是实战经验总 结。 正如文中所提及的各种分布式系统,不仅要求架构合理、安全可靠、性能优异、开放标准、弹性互联,而且对于每行代码都 有严格要求,更难的是需要有一支强大的团队才能坚持到成功。而作为一个团队,正需要每个人都要有本文所体现出的统一意 志。 分布式实时处理系统,难就难在把分布式和实时处理结合起来。本文从拆解留言板系统开始节节升级,直至推出Hurricane 系统,旁征博引,纲举目张。充分体现了分布式构建和实时处理的细节考虑。 本人也仍然战斗在一线的分布式实时处理系统中,深感个中艰难,尤其是带领一支强大战队不停前行。时刻需要类似本文 的“系统
20、综述”保障团队的思想统一、步调一致,不断创造新高度。 在这里,我愿意推荐好文与君共飨。在软件海洋的最精彩之路互进共勉。 彭敏 思科系统(中国)研发有限公司服务器与平台架构部门研发经理 序三 并行计算和分布式系统一直都是个迷人的主题。近十年来,随着云计算和大数据的发展,它也逐渐从云端走下。如今,几乎 所有人都可以尝试使用各种编程语言去构建各种规模的分布式应用。广大的C+开发者也被深深地吸引,为之兴奋。C+11的 发布让这门已有三十多年历史的语言充满了活力,我们不禁想问:这百多项C+11的新特性如何能被高效地应用于分布式系统 的开发?是不是该有一本书来谈谈这个问题呢? 能在第一时间看到本书的原稿,
21、我感到很高兴。因为这就是一本关于实时分布式系统的书,一本关于C+11的书,更是一 本关于实战的书。全书以Hurricane这个自制系统为例,清晰地将实时分布式系统从概念,到实现,再到应用和部署完全地呈现 在了读者面前。并将C+11的诸多新特性贯穿其中。本书的主题是探讨互联网时代之下的云计算和大数据处理的高效实现。书 中所述的高性能编程思想和C+11应用放在其他类型系统里同样适用。 这是一本讲技术的书,而且写得很好。由理论到应用,由实现到优化,由浅入深,抽丝剥茧地把这么浩繁的概念在本书中讲 得十分清晰。这也是一本讲技巧的书,在实现高性能系统和遇到困难时,定会派上很大用场。这还是本有活力的书,无论
22、是 C+11、大数据,还是Samuel、Lionel这两个书中的年轻人,都让这本书充满了朝气。 读完本书,尚感意犹未尽。作者以他参与Cisco和Autodesk诸多大型系统开发时所积累的经验以及对开源技术多年的钻研铸 就本书。相信作者的写作和分享一定会带给你们一段充满乐趣的阅读之旅。 张洋 Autodesk(中国)研发中心平台架构研发部门经理 前言 为什么要写这本书 云计算与大数据为计算机科学领域注入了前所未有的活力,而大数据的实时处理更是为海量数据处理和数据挖掘带来了崭新 的契机。从某种意义上讲,传统大数据的批处理方式已经一定程度上解决了我们所面临的问题,由MapReduce、Bulk Sy
23、nchronous Parallel以及其他计算范式衍生而来的大规模计算集群已经广泛运用于生产环境中。然而,客户的要求是永不满足 的。他们想要更多的数据、服务、价值以及更多的便利。随着数据量的增加,对实时响应时间的需求也在提高,原本承载着海量 数据处理任务的批处理系统在实时计算处理方面越发显得乏力。这么说的原因很简单,像Hadoop使用的MapReduce这样的数 据批处理技术,其设计初衷并不是为了满足实时计算的需求。数据批处理系统与实时处理系统在需求上存在着本质的区别。要做 到实时性,不仅需要及时地推送数据以便处理,还要将数据划分成尽可能小的单位,而像HDFS存储推送数据的能力已经远不能 满
24、足实时性的需求。 虽然目前Apache Spark等新平台和框架越来越为流行,同时极大提升了批处理的性能,但是由于这些传统批处理系统的运 行机制本身,无法从根本上解决实时计算的问题。 因此,随着业务数据规模的爆炸式增长,对数据实时处理能力的需求也越来越大。专注于实时性、规模化的计算平台新时代 已经悄然来临。 Apache Storm的出现扭转了传统数据批处理系统的劣势,成为了真正意义上的实时数据处理系统。Storm实时处理系统实 现了一个可靠的、高容错性的实时分布式处理平台,那么这些听起来十分抽象的概念到底是如何实现的呢?这其实就是笔者写作 本书的目的之一。当笔者深入研究和学习了Storm的内
25、部结构和代码实现之后,就在思考有没有什么办法让其他更多的人少走弯 路,并能在实践中对这个看似“神秘”的实时处理系统的设计与实现融会贯通呢? 本书特色 本书是一本由浅入深并详细讲解编写一套全新的基于C/C+的实时处理系统的编程实战书。本书从基础知识开始,到实时 数据系统的架构设计,到代码的实际编写,逐步实现一个完整的实时数据处理系统。本书把这套全新的高性能分布式实时处理系 统命名为Hurricane,该单词与Storm涵义类似,但略有不同,其中维基百科对Hurricane的解释是“A storm that has very strong fast winds and that moves ove
26、r water”,即“在水面高速移动的飓风(storm)”。 同时,为了支持高性能的实时处理系统,我们必须提供高性能的网络层,能够支持大量的并发,因此本书设计实现了一套跨 平台的网络库Meshy,并将其作为Hurricane实时处理系统的传输层。 为了编写更清晰、易于移植、易于维护的现代化C+代码,我们在书中大量使用了C+11的特性,从一些小的语法点(如 auto、override)到C+11中新增加的库(如thread、chrono、functional)到一些翻天覆地的语法特性(如统一初始化、 Lambda表达式)都有所涉及。每当遇到新的C+11知识时,我们都会着重向读者介绍。由于目前C+
27、14还不够普及成熟,因 此在本书中暂不考虑C+14的特性。 为此,本书一开始将会花费大量篇幅介绍分布式计算存储的概念以及网络通信的基础知识。接着阐述和分布式计算存储相关 的网络高层抽象知识,为构建分布式网络应用打下坚实基础。接着集中介绍本书需要运用的C+相关知识,包括C+11的语言 特性以及需要了解的底层知识。之后就开始介绍Hurricane实时处理系统的设计方案,并引导读者一步步自己实现Hurricane实 时处理系统。 完成Hurricane实时处理系统的主体功能部分后,我们转而介绍Meshy,阐述如何实现Meshy这一跨平台的网络框架,并与 Hurricane实时处理系统进行对接。为了实
28、现跨平台的高性能网络通信库,我们必须学习使用epoll、IOCP等与平台密切相关的 技术来保证系统性能。同时,我们也要学会如何编写管理一个需要考虑移植和平台兼容性的系统的技巧与实践方法。最后辅以实 战用例讲解如何将该系统应用于实际的生产环境中。 总之,Hurricane实时处理系统是一个使用C+11编写的,以高性能为关注点的分布式实时计算框架,使用流模型作为计算 模型,同时提供更易于理解的高层接口。 希望读者能够从本书中或多或少学到点新的知识,能够对C+语言以及网络通信有更加深入的认识,了解如何构建一个可 应用于生产环境的分布式实时处理系统。 如何阅读本书 本书以最基本的云计算与大数据概念作为
29、引子,逐步引入高性能分布式实时处理系统编程所需要的知识,抽丝剥茧地把有关 实时处理系统的架构以及内部实现娓娓道来。 第1章 介绍分布式系统的一些基本概念,以及开发实时处理系统所需要具备的一些重要知识点。 第2章 介绍分布式系统通信基础,包括TCP/IP以及Socket方面的基本概念,为后续开发网络库Meshy做知识储备。 第3章 介绍分布式系统通信所需的高层抽象,包括RPC远程过程调用、RESTful、消息队列等常用的通信模型。同时介绍 基本的序列化概念与解决方案,并使用Thrift开发简单的公告牌服务,为Hurricane的开发建立通信抽象与框架上的基础概念。 第4章 介绍C+高性能编程所需
30、的基础与进阶知识,包括C+中的内存资源管理、编码解决方案、并发与异步处理以及内 存管理技巧,以及C+11中与内存管理、编码处理、线程模型相关的内容。 第5章 介绍分布式处理系统的基本概念,包括批处理与实时处理的区别,Hadoop与Storm的基本介绍及基本模型。最后 介绍可靠消息处理的基本思想。 第6章 介绍实时处理系统的总体架构与接口设计,包括消息源、消息处理器、数据收集器、元组以及序列化接口。 第7章 介绍服务组件的设计与实现,包括Executor及其消息队列、动态装载以及Task的设计与实现等。 第8章 介绍管理服务的设计与实现,其中包括集群管理器President以及节点管理器Mana
31、ger的架构设计与编程实现。 第9章 介绍实时处理系统中各部分接口的实现,包括消息源、消息处理单元以及数据收集器的实现。 第10章 介绍可靠消息处理的概念、接口设计与具体实现,包括简单和高效的实现方案。 第11章 介绍底层数据传输层及Meshy的设计与实现,包括I/O多路复用的概念与实现方法、所需的基础工具,以及跨平台 的实现方案。最后辅以实战用例来展示集成与使用Meshy的方法。 第12章 介绍事务性计算拓扑的概念、实现方案与编程实现,并介绍相关API,以及如何使用Cassandra存储元数据。 第13章 介绍在不同的编程语言中实现计算拓扑的方法,并在现有技术基础上增加一些新的技术。 第14
32、章 介绍基于Hurricane实时处理系统的高级抽象元语、分布式远程过程调用(DRPC)的设计、实现方案及编程实 战。 第15章 介绍了基于Hurricane实时处理系统开发的日志流处理实例,其中包含日志流处理的整体流程、使用Hurricane处 理日志的具体实现思路,以及使用Hurricane处理日志的具体实现。 第16章 介绍了基于Hurricane实时处理系统开发的频繁组合查找实例,其中包含频繁项集挖掘概念与方法、频繁二项集挖 掘算法原理与实现分布式统计方法。并介绍如何使用Hurricane实现自己的频繁二项集挖掘系统。 第17章 介绍在AWS和阿里云上部署Hurricane实时处理系统
33、,首先介绍在AWS上创建私有云和EC2实例的方法,接着介 绍在阿里云上创建私有云和ECS实例的方法,最后介绍Hurricane的分布式部署原理与方法。 阅读前提 本书采用Ubuntu或Debian操作系统以及Windows操作系统作为基本的开发环境。此外,本书并不准备对基础的编程概念 进行理论介绍。我们假定你在阅读本书之前已经达到基本的编程技术水平以及具备一定的C+编程经验和功底。如果不是,笔 者建议阅读C+编程思想作为基础来了解编程的基本概念,并阅读高级C/C+编译技术作为提高。 本书版式约定 在本书中,读者会发现针对不同信息类型的文本样式。下面是这些样式的示例和解释。 所有命令行输入和输出
34、如下所示: mkdir Hurricane cd Hurricane 代码清单通常以以下格式展现: 1 #include 2 #include 3 4 int main() 5 6 std:cout Welcome to Hurricane std:endl; 7 8 return EXIT_SUCCESS; 9 在正文中时常会用以下方式拓展所讲解的内容: 提示 这里是相关提示的文字。 读者对象 (1)大数据系统研发工程师。本书不但讲解高性能分布式实时处理系统编程所需要的方方面面,抽丝剥茧地呈现出实时处 理系统的架构以及内部实现,还带领大家自己编写一套分布式实时处理系统。 (2)研发人员。本书
35、是一本深入剖析分布式实时处理系统编号的指南。 (3)架构师。本书是一本层次化分布式系统架构设计的实战书。读者可以深入理解分布式实时处理系统的内部构造以及重 要组成部分,并自已设计分布式系统的各个层次。 (4)编程初学者。学习实战技术,掌握分布式系统开发中惯用的编程技巧。 勘误和支持 虽然笔者在编写本书的过程中经过反复审校,全力确保本书内容的准确性,但疏漏在所难免。书中难免可能会出现一些不妥 或不准确的描述,恳请读者批评指正。本书所涉及的所有源代码及工程都可以从华章官网()下载,同时这 些项目也都是开源项目。现在我怀着期盼和忐忑的心情,将这本著作呈献给大家,我渴望得到你的认可,更渴望和你成为朋友
36、, 如果你有任何问题和建议,请与我联系(电子邮箱:samblg),期待能够得到你的真挚反馈。 致谢 在创作本书的过程中,我得到了很多人的帮助,这里必须要一一感谢,聊表寸心。感谢鲁昌华教授,在我的成长道路上给予 了很大的支持和鼓励。感谢我在Autodesk中国研究院(ACRD)的同事和思科系统(中国)研发中心的朋友。特别是我的良师 益友彭敏、旷天亮和徐立冰,在我的学习工作中给予了很大帮助。感谢我的好友金柳颀,感谢你在写作本书过程中的通力合作以 及技术问题上的共同探讨。还要感谢机械工业出版社的高婧雅编辑对我的信任与支持。 谨以此书献给我最亲爱的家人与朋友,你们是我奋斗路上坚强的后盾。 卢誉声 于上
37、海 第1章 分布式计算概述 本章主要介绍分布式系统的一些基本概念,以及开发实时处理系统所需要具备的一些重要知识点,包括分布式概念、分布式 系统特性、具体的分布式存储系统类型与产品实例,并对通用分布式计算系统进行简要介绍,通过对比传统批处理式解决方案 (Apache Hadoop和Apache Spark)和Apache Storm的流计算模型,最终引出实时处理系统的概念,这也是本书所要阐述和 实现的重点。 1.1 分布式概念 由计算机组成的网络无处不在,现如今我们的日常生活已经被各种不同类型的网络包围,如电话网络、企业网络、家庭网络 以及各种类型的局域网,共同构成了我们称之为Internet的
38、网络。因此,我们可以断言Internet是由各种不同类型、不同地区、 不同领域的网络构成的互联网。我们可以发现,互联网并没有集中式的控制中心,而是由大量分离且互联的节点组成的。这正是 一个分散式的模型。我们可以把这个概念类比到即将讲解的分布式概念上。 分布式概念是在网络这个大前提下诞生的。传统的计算是集中式的计算,使用计算能力强大的服务器处理大量的计算任务, 但这种超级计算机的建造和维护成本极高,且明显存在很大的瓶颈。与之相对,如果一套系统可以将需要海量计算能力才能处理 的问题拆分成许多小块,然后将这些小块分配给同一套系统中不同的计算节点进行处理,最后如有必要将分开计算的结果合并得 到最终结果
39、,那么就将这种系统称为分布式系统。对于这种系统来说,我们会采用多种方式在不同节点之间进行数据通信和协 调,而网络消息则是常用手段之一。 通过以上描述,我们基本可以认为,一套分布式系统会使用网络上的硬件资源和软件组件进行计算,而各个计算节点间通过 一定方式进行通信。这是从计算机科学的角度简单概述了分布式系统的概念。 如果我们从网络这个关键因素考虑,我们可以将计算分摊到网络中不同的计算节点,充分利用网络中的计算资源,而这些节 点可能存在于不同的区域中,在空间上存在一定距离。虽说这种解释不那么正式,但也从另一个角度上生动地阐述了分布式的基 本特性,即节点分布。 1.2 分布式计算及其原理 前文提到分
40、布式计算就是将计算任务分摊到大量的计算节点上,一起完成海量的计算任务。 而分布式计算的原理和并行计算类似,就是将一个复杂庞大的计算任务适当划分为一个一个小任务,并让任务并行执行,只 不过分布式计算会将这些任务分配到不同的计算节点上,每个计算节点只需要完成自己的计算任务即可,可以有效分担海量的计 算任务。而每个计算节点也可以并行处理自身的任务,更加充分利用机器的CPU资源。最后我们想方设法将每个节点计算结果 汇总,得到最后的计算结果。 很多时候,划分计算任务以支持分布式计算看起来较为困难,但人们逐渐发现确实也是可行的。而且随着计算任务量增加与 计算节点增加,这种划分体现出来的价值会越来越大。分布
41、式计算一般分为以下几步。 1)设计分布式计算模型:首先我们要规定分布式系统的计算模型。计算模型决定了系统中各个组件应该如何运行,组件之 间应该如何进行消息通信,组件和节点应该如何管理等。 2)分布式任务分配:分布式算法不同于普通算法。普通算法通常是按部就班,一步接着一步完成任务。而分布式计算中计 算任务是分摊到各个节点上的。该算法着重解决的是能否分配任务,或如何分配任务的问题。 3)编写并执行分布式程序:使用特定的分布式计算框架与计算模型,将分布式算法转化为实现,并尽量保证整个集群的高 效运行。其中有一些难点。 计算任务的划分。 分布式计算的特点就是多个节点同时运算,因此如何将复杂算法优化分解
42、成适用于每个节点计算的小任务,并回收节点的计 算结果就成了问题。尤其是并行计算的最大特点是希望节点之间的计算互不相干,这样可以保证各节点以最快速度完成计算,一 旦出现节点之间的等待,往往就会拖慢整个系统的速度。 多节点之间的通信方式。 另一个难点是节点之间如何高效通信。虽然在划分计算任务时,计算任务最好确保互不相干,这样每个节点可以各自为政。 但大多数时候节点之间还是需要互相通信,比如获取对方的计算结果等。一般有两种解决方案:一种是利用消息队列,将节点之 间的依赖变成节点之间的消息传递;第二种是利用分布式存储系统,我们可以将节点的执行结果暂时存放在数据库中,其他节点 等待或从数据库中获取数据。
43、无论哪种方式只要符合实际需求都是可行的。 1.3 分布式系统特性 G.Coulouris1曾经对分布式系统下了一个简单的定义:你会知道系统当中的某台电脑崩溃或停止运行了,但是你的软件却 永远不会。这句话虽然简单,但是却道出了分布式系统的关键特性。分布式系统的特性包括容错性、高可扩展性、开放性、并发 处理能力和透明性,现在我们来看一下这些概念的涵义。 1 George Coulouris是Distributed Systems-Concepts and Design这本书的作者,曾是剑桥大学的高级研究员。 1.4 通用分布式计算系统 单从分布式计算系统这个类别来说,其覆盖面非常广。我们将在本节中
44、着重介绍几个十分常见的计算系统。这些计算系统被 广泛应用于各个领域。 1.5 分布式存储系统 分布式技术大体分为分布式存储技术和分布式计算技术,我们先来探讨一下分布式存储技术。在互联网高速发展的今天,分 布式技术逐渐成为了大型企业业务构建所需的基本技术之一,而分布式存储系统更是成为了分布式计算必备的主要系统,无论是 云计算还是大数据的处理和分析,都离不开分布式存储系统,因此,如何基于高性能、高可扩展性、高可用性以及成本低的分布 式存储系统来构建实时计算系统,成为了热门话题。本节将介绍分布式存储的基本概念和特点,并简单介绍几个流行的分布式存 储新系统。 1.6 本章小结 本章对分布式系统的几个主
45、要方面进行了基本的介绍,包括什么是分布式系统、分布式系统的特性、分布式系统细分类别之 下的分布式存储系统的概述,以及针对通用分布式计算系统的简要介绍。本章用简短的篇幅,结合笔者自身的体会,以分布式系 统为引子,逐步介绍分布式计算系统以及分布式存储系统。这些知识是后续章节介绍分布式实时处理系统编程实战所必不可少的 内容。通过本章的学习,读者应该已经具备开发分布式实时处理系统的基础知识以及掌握开发过程中需要关注的重点,这将为后 续内容的学习打下坚实的基础。 第2章 分布式系统通信基础 上一章介绍了什么是分布式系统,以及分布式系统的分类和组成。这其中需要强调的是,分布式系统中包含了各种各样的节 点,
46、这些节点各司其职,共同完成整套系统的业务逻辑需求。那么自然而然的,这些节点之间需要进行通信。现如今Internet使 用的主流协议族是TCP/IP协议族,它是一个多层次、多协议的通信框架。本章将对TCP/IP协议族进行概述,并着重讲解IP协 议、TCP协议以及HTTP协议(包含Restful API的概念),因为这些是后续开发分布式实时处理系统所必须掌握的知识点我 们会在开发的程序中使用Socket进行通信,并提供灵活的Restful API供用户使用。网络通信协议包罗万象,其中每一项都需要 我们花费大量时间和精力去学习和研究。本章把最常用、最直接的一些概念呈现给读者,并辅以一些快速实践,帮助
47、大家快速灵 活地掌握网络通信知识。另外,本书会在恰当的地方列出RFC文档,读者可以通过RFC文档编号查阅更加详细的网络协议细节。 2.1 时代的浪潮 让我们回到20世纪60年代,那还是一个没有网络的世界。 在那个年代,没有网络也就意味着无法像现在这样方便地在机器之间共享数据。但当时美国的高级研究计划管理局 (Advanced Research Projects Agency,ARPA)已经开始筹划建立一个颇具规模的网络,并将这个网络称为ARPANet。 其目的是在美国建立起一个健壮的网络体系,而ARPANet则是作为未来网络的一个实验性项目。刚开始的时候,也就是 1969年,这个计划的网络中只
48、有4个节点,分别是分布在洛杉矶的加利福尼亚大学洛杉矶分校、加州大学圣巴巴拉分校、斯坦福 大学、犹他州大学4所大学的4台大型计算机。而这个网络的主要研究人员也都来自这几所学校。 这个网络的要求是,希望在计算机之间共享硬件、软件和数据库资源。同时网络要有极强的健壮性,一条线路或一个节点损 坏不能影响整个网络工作。 问题来了,我们应该如何构建这个通信网络呢? 2.2 可靠的数据链路 我们先把眼光放短点,考虑一下如何实现两个相邻机器节点之间的可靠数据传输。因为原始的物理链路仅由传输介质和设备 组成,数据在两个设备之间传输时随时可能因为外界原因而丢失或发生变化,直接使用物理链路无法确保数据在相邻节点之间
49、的 可靠传输。 为此,我们引入一个抽象的概念,叫做“数据链路”。数据链路是一条逻辑链路,我们假定两个机器节点只要使用了逻辑链 路,就可以可靠地相互通信(当然,如果你把物理链路拆掉了,那我也就没办法了)。此外,我们希望可以保证一条物理链路上 可以存在多条逻辑链路,也就是做到物理线路的复用。 为此,我们需要定义一个规范,所有的设备在发送和接收数据时都需要遵循这种规范,我们将这种规范称为“协议”。就像 我们平时写信的时候,需要遵循一定的格式要求,只有保证格式正确,邮递员才能将信件送到正确的目的地。而协议正是如此, 只有通信双方都遵守协议,才能进行正常的通信。因此我们的思路就是在物理链路的基础上,使用一系列的协议控制数据传输, 确保相邻节点之间数据的可靠传输。 2.3 分层架构 有了大致的思路之后,让我们来想一想如何在数据链路的基础上构建一个完整的网络体系。 上一节中我们讲解了如何构建可靠的数据链路。虽然这个数据链路是我们附加在物理链路之上的抽象概念,但这种数据链路 我们一般都会使用纯硬件实现。但是如果想仿照数据链路使用硬件实现接下来的功能,就不是那么简单了。 例如,接下来要实现数据的转发功