前言
为什么要写这本书
云计算与大数据为计算机科学领域注入了前所未有的活力,而大数据的实时处理更是为海量数据处理和数据挖掘带来了崭新的契机。从某种意义上讲,传统大数据的批处理方式已经一定程度上解决了我们所面临的问题,由MapReduce、Bulk Synchronous Parallel以及其他计算范式衍生而来的大规模计算集群已经广泛运用于生产环境中。然而,客户的要求是永不满足的。他们想要更多的数据、服务、价值以及更多的便利。随着数据量的增加,对实时响应时间的需求也在提高,原本承载着海量数据处理任务的批处理系统在实时计算处理方面越发显得乏力。这么说的原因很简单,像Hadoop使用的MapReduce这样的数据批处理技术,其设计初衷并不是为了满足实时计算的需求。数据批处理系统与实时处理系统在需求上存在着本质的区别。要做到实时性,不仅需要及时地推送数据以便处理,还要将数据划分成尽可能小的单位,而像HDFS存储推送数据的能力已经远不能满足实时性的需求。
虽然目前Apache Spark等新平台和框架越来越为流行,同时极大提升了批处理的性能,但是由于这些传统批处理系统的运行机制本身,无法从根本上解决实时计算的问题。
因此,随着业务数据规模的爆炸式增长,对数据实时处理能力的需求也越来越大。专注于实时性、规模化的计算平台新时代已经悄然来临。
Apache Storm的出现扭转了传统数据批处理系统的劣势,成为了真正意义上的实时数据处理系统。Storm实时处理系统实现了一个可靠的、高容错性的实时分布式处理平台,那么这些听起来十分抽象的概念到底是如何实现的呢?这其实就是笔者写作本书的目的之一。当笔者深入研究和学习了Storm的内部结构和代码实现之后,就在思考有没有什么办法让其他更多的人少走弯路,并能在实践中对这个看似“神秘”的实时处理系统的设计与实现融会贯通呢?
本书特色
本书是一本由浅入深并详细讲解编写一套全新的基于C/C++的实时处理系统的编程实战书。本书从基础知识开始,到实时数据系统的架构设计,到代码的实际编写,逐步实现一个完整的实时数据处理系统。本书把这套全新的高性能分布式实时处理系统命名为Hurricane,该单词与Storm涵义类似,但略有不同,其中维基百科对Hurricane的解释是“A storm that has very strong fast winds and that moves over water”,即“在水面高速移动的飓风(storm)”。
同时,为了支持高性能的实时处理系统,我们必须提供高性能的网络层,能够支持大量的并发,因此本书设计实现了一套跨平台的网络库Meshy,并将其作为Hurricane实时处理系统的传输层。
为了编写更清晰、易于移植、易于维护的现代化C++代码,我们在书中大量使用了C++11的特性,从一些小的语法点(如auto、override)到C++11中新增加的库(如thread、chrono、functional)到一些翻天覆地的语法特性(如统一初始化、Lambda表达式)都有所涉及。每当遇到新的C++11知识时,我们都会着重向读者介绍。由于目前C++14还不够普及成熟,因此在本书中暂不考虑C++14的特性。
为此,本书一开始将会花费大量篇幅介绍分布式计算存储的概念以及网络通信的基础知识。接着阐述和分布式计算存储相关的网络高层抽象知识,为构建分布式网络应用打下坚实基础。接着集中介绍本书需要运用的C++相关知识,包括C++11的语言特性以及需要了解的底层知识。之后就开始介绍Hurricane实时处理系统的设计方案,并引导读者一步步自己实现Hurricane实时处理系统。
完成Hurricane实时处理系统的主体功能部分后,我们转而介绍Meshy,阐述如何实现Meshy这一跨平台的网络框架,并与Hurricane实时处理系统进行对接。为了实现跨平台的高性能网络通信库,我们必须学习使用epoll、IOCP等与平台密切相关的技术来保证系统性能。同时,我们也要学会如何编写管理一个需要考虑移植和平台兼容性的系统的技巧与实践方法。最后辅以实战用例讲解如何将该系统应用于实际的生产环境中。
总之,Hurricane实时处理系统是一个使用C++11编写的,以高性能为关注点的分布式实时计算框架,使用流模型作为计算模型,同时提供更易于理解的高层接口。
希望读者能够从本书中或多或少学到点新的知识,能够对C++语言以及网络通信有更加深入的认识,了解如何构建一个可应用于生产环境的分布式实时处理系统。
如何阅读本书
本书以最基本的云计算与大数据概念作为引子,逐步引入高性能分布式实时处理系统编程所需要的知识,抽丝剥茧地把有关实时处理系统的架构以及内部实现娓娓道来。
第1章 介绍分布式系统的一些基本概念,以及开发实时处理系统所需要具备的一些重要知识点。
第2章 介绍分布式系统通信基础,包括TCP/IP以及Socket方面的基本概念,为后续开发网络库Meshy做知识储备。
第3章 介绍分布式系统通信所需的高层抽象,包括RPC远程过程调用、RESTful、消息队列等常用的通信模型。同时介绍基本的序列化概念与解决方案,并使用Thrift开发简单的公告牌服务,为Hurricane的开发建立通信抽象与框架上的基础概念。
第4章 介绍C++高性能编程所需的基础与进阶知识,包括C++中的内存资源管理、编码解决方案、并发与异步处理以及内存管理技巧,以及C++11中与内存管理、编码处理、线程模型相关的内容。
第5章 介绍分布式处理系统的基本概念,包括批处理与实时处理的区别,Hadoop与Storm的基本介绍及基本模型。最后介绍可靠消息处理的基本思想。
第6章 介绍实时处理系统的总体架构与接口设计,包括消息源、消息处理器、数据收集器、元组以及序列化接口。
第7章 介绍服务组件的设计与实现,包括Executor及其消息队列、动态装载以及Task的设计与实现等。
第8章 介绍管理服务的设计与实现,其中包括集群管理器President以及节点管理器Manager的架构设计与编程实现。
第9章 介绍实时处理系统中各部分接口的实现,包括消息源、消息处理单元以及数据收集器的实现。
第10章 介绍可靠消息处理的概念、接口设计与具体实现,包括简单和高效的实现方案。
第11章 介绍底层数据传输层及Meshy的设计与实现,包括I/O多路复用的概念与实现方法、所需的基础工具,以及跨平台的实现方案。最后辅以实战用例来展示集成与使用Meshy的方法。
第12章 介绍事务性计算拓扑的概念、实现方案与编程实现,并介绍相关API,以及如何使用Cassandra存储元数据。
第13章 介绍在不同的编程语言中实现计算拓扑的方法,并在现有技术基础上增加一些新的技术。
第14章 介绍基于Hurricane实时处理系统的高级抽象元语、分布式远程过程调用(DRPC)的设计、实现方案及编程实战。
第15章 介绍了基于Hurricane实时处理系统开发的日志流处理实例,其中包含日志流处理的整体流程、使用Hurricane处理日志的具体实现思路,以及使用Hurricane处理日志的具体实现。
第16章 介绍了基于Hurricane实时处理系统开发的频繁组合查找实例,其中包含频繁项集挖掘概念与方法、频繁二项集挖掘算法原理与实现分布式统计方法。并介绍如何使用Hurricane实现自己的频繁二项集挖掘系统。
第17章 介绍在AWS和阿里云上部署Hurricane实时处理系统,首先介绍在AWS上创建私有云和EC2实例的方法,接着介绍在阿里云上创建私有云和ECS实例的方法,最后介绍Hurricane的分布式部署原理与方法。
阅读前提
本书采用Ubuntu或Debian操作系统以及Windows操作系统作为基本的开发环境。此外,本书并不准备对基础的编程概念进行理论介绍。我们假定你在阅读本书之前已经达到基本的编程技术水平以及具备一定的C++编程经验和功底。如果不是,笔者建议阅读《C++编程思想》作为基础来了解编程的基本概念,并阅读《高级C/C++编译技术》作为提高。
本书版式约定
在本书中,读者会发现针对不同信息类型的文本样式。下面是这些样式的示例和解释。
所有命令行输入和输出如下所示:
mkdir Hurricane cd Hurricane
代码清单通常以以下格式展现:
1 #include <iostream> 2 #include <cstdlib> 3 4 int main( ) 5 { 6 std::cout << "Welcome to Hurricane" << std::endl; 7 8 return EXIT_SUCCESS; 9 }
在正文中时常会用以下方式拓展所讲解的内容:
提示 这里是相关提示的文字。
读者对象
(1)大数据系统研发工程师。本书不但讲解高性能分布式实时处理系统编程所需要的方方面面,抽丝剥茧地呈现出实时处理系统的架构以及内部实现,还带领大家自己编写一套分布式实时处理系统。
(2)研发人员。本书是一本深入剖析分布式实时处理系统编号的指南。
(3)架构师。本书是一本层次化分布式系统架构设计的实战书。读者可以深入理解分布式实时处理系统的内部构造以及重要组成部分,并自已设计分布式系统的各个层次。
(4)编程初学者。学习实战技术,掌握分布式系统开发中惯用的编程技巧。
勘误和支持
虽然笔者在编写本书的过程中经过反复审校,全力确保本书内容的准确性,但疏漏在所难免。书中难免可能会出现一些不妥或不准确的描述,恳请读者批评指正。本书所涉及的所有源代码及工程都可以从华章官网(www.hzbook.com)下载,同时这些项目也都是开源项目。现在我怀着期盼和忐忑的心情,将这本著作呈献给大家,我渴望得到你的认可,更渴望和你成为朋友,如果你有任何问题和建议,请与我联系(电子邮箱:samblg@me.com),期待能够得到你的真挚反馈。
致谢
在创作本书的过程中,我得到了很多人的帮助,这里必须要一一感谢,聊表寸心。感谢鲁昌华教授,在我的成长道路上给予了很大的支持和鼓励。感谢我在Autodesk中国研究院(ACRD)的同事和思科系统(中国)研发中心的朋友。特别是我的良师益友彭敏、旷天亮和徐立冰,在我的学习工作中给予了很大帮助。感谢我的好友金柳颀,感谢你在写作本书过程中的通力合作以及技术问题上的共同探讨。还要感谢机械工业出版社的高婧雅编辑对我的信任与支持。
谨以此书献给我最亲爱的家人与朋友,你们是我奋斗路上坚强的后盾。