分布式实时处理系统:原理、架构与实现(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-13 14:05:23

点击下载

作者:卢誉声

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

分布式实时处理系统:原理、架构与实现

分布式实时处理系统:原理、架构与实现试读:

前言

为什么要写这本书

云计算与大数据为计算机科学领域注入了前所未有的活力,而大数据的实时处理更是为海量数据处理和数据挖掘带来了崭新的契机。从某种意义上讲,传统大数据的批处理方式已经一定程度上解决了我们所面临的问题,由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 Hurricanecd Hurricane

代码清单通常以以下格式展现:1 #include 2 #include 34 int main()5 {6 std::cout << "Welcome to Hurricane" << std::endl;78 return EXIT_SUCCESS;9 }

在正文中时常会用以下方式拓展所讲解的内容:

提示 这里是相关提示的文字。读者对象(1)大数据系统研发工程师。本书不但讲解高性能分布式实时处理系统编程所需要的方方面面,抽丝剥茧地呈现出实时处理系统的架构以及内部实现,还带领大家自己编写一套分布式实时处理系统。(2)研发人员。本书是一本深入剖析分布式实时处理系统编号的指南。(3)架构师。本书是一本层次化分布式系统架构设计的实战书。读者可以深入理解分布式实时处理系统的内部构造以及重要组成部分,并自已设计分布式系统的各个层次。(4)编程初学者。学习实战技术,掌握分布式系统开发中惯用的编程技巧。勘误和支持

虽然笔者在编写本书的过程中经过反复审校,全力确保本书内容的准确性,但疏漏在所难免。书中难免可能会出现一些不妥或不准确的描述,恳请读者批评指正。本书所涉及的所有源代码及工程都可以从华章官网(www.hzbook.com)下载,同时这些项目也都是开源项目。现在我怀着期盼和忐忑的心情,将这本著作呈献给大家,我渴望得到你的认可,更渴望和你成为朋友,如果你有任何问题和建议,请与我联系(电子邮箱:samblg@me.com),期待能够得到你的真挚反馈。致谢

在创作本书的过程中,我得到了很多人的帮助,这里必须要一一感谢,聊表寸心。感谢鲁昌华教授,在我的成长道路上给予了很大的支持和鼓励。感谢我在Autodesk中国研究院(ACRD)的同事和思科系统(中国)研发中心的朋友。特别是我的良师益友彭敏、旷天亮和徐立冰,在我的学习工作中给予了很大帮助。感谢我的好友金柳颀,感谢你在写作本书过程中的通力合作以及技术问题上的共同探讨。还要感谢机械工业出版社的高婧雅编辑对我的信任与支持。

谨以此书献给我最亲爱的家人与朋友,你们是我奋斗路上坚强的后盾。卢誉声于上海第1章 分布式计算概述

本章主要介绍分布式系统的一些基本概念,以及开发实时处理系统所需要具备的一些重要知识点,包括分布式概念、分布式系统特性、具体的分布式存储系统类型与产品实例,并对通用分布式计算系统进行简要介绍,通过对比传统批处理式解决方案(Apache Hadoop和Apache Spark)和Apache Storm的流计算模型,最终引出实时处理系统的概念,这也是本书所要阐述和实现的重点。1.1 分布式概念

由计算机组成的网络无处不在,现如今我们的日常生活已经被各种不同类型的网络包围,如电话网络、企业网络、家庭网络以及各种类型的局域网,共同构成了我们称之为Internet的网络。因此,我们可以断言Internet是由各种不同类型、不同地区、不同领域的网络构成的互联网。我们可以发现,互联网并没有集中式的控制中心,而是由大量分离且互联的节点组成的。这正是一个分散式的模型。我们可以把这个概念类比到即将讲解的分布式概念上。

分布式概念是在网络这个大前提下诞生的。传统的计算是集中式的计算,使用计算能力强大的服务器处理大量的计算任务,但这种超级计算机的建造和维护成本极高,且明显存在很大的瓶颈。与之相对,如果一套系统可以将需要海量计算能力才能处理的问题拆分成许多小块,然后将这些小块分配给同一套系统中不同的计算节点进行处理,最后如有必要将分开计算的结果合并得到最终结果,那么就将这种系统称为分布式系统。对于这种系统来说,我们会采用多种方式在不同节点之间进行数据通信和协调,而网络消息则是常用手段之一。

通过以上描述,我们基本可以认为,一套分布式系统会使用网络上的硬件资源和软件组件进行计算,而各个计算节点间通过一定方式进行通信。这是从计算机科学的角度简单概述了分布式系统的概念。

如果我们从网络这个关键因素考虑,我们可以将计算分摊到网络中不同的计算节点,充分利用网络中的计算资源,而这些节点可能存在于不同的区域中,在空间上存在一定距离。虽说这种解释不那么正式,但也从另一个角度上生动地阐述了分布式的基本特性,即节点分布。1.2 分布式计算及其原理

前文提到分布式计算就是将计算任务分摊到大量的计算节点上,一起完成海量的计算任务。

而分布式计算的原理和并行计算类似,就是将一个复杂庞大的计算任务适当划分为一个一个小任务,并让任务并行执行,只不过分布式计算会将这些任务分配到不同的计算节点上,每个计算节点只需要完成自己的计算任务即可,可以有效分担海量的计算任务。而每个计算节点也可以并行处理自身的任务,更加充分利用机器的CPU资源。最后我们想方设法将每个节点计算结果汇总,得到最后的计算结果。

很多时候,划分计算任务以支持分布式计算看起来较为困难,但人们逐渐发现确实也是可行的。而且随着计算任务量增加与计算节点增加,这种划分体现出来的价值会越来越大。分布式计算一般分为以下几步。

1)设计分布式计算模型:首先我们要规定分布式系统的计算模型。计算模型决定了系统中各个组件应该如何运行,组件之间应该如何进行消息通信,组件和节点应该如何管理等。

2)分布式任务分配:分布式算法不同于普通算法。普通算法通常是按部就班,一步接着一步完成任务。而分布式计算中计算任务是分摊到各个节点上的。该算法着重解决的是能否分配任务,或如何分配任务的问题。

3)编写并执行分布式程序:使用特定的分布式计算框架与计算模型,将分布式算法转化为实现,并尽量保证整个集群的高效运行。其中有一些难点。

①计算任务的划分。

分布式计算的特点就是多个节点同时运算,因此如何将复杂算法优化分解成适用于每个节点计算的小任务,并回收节点的计算结果就成了问题。尤其是并行计算的最大特点是希望节点之间的计算互不相干,这样可以保证各节点以最快速度完成计算,一旦出现节点之间的等待,往往就会拖慢整个系统的速度。

②多节点之间的通信方式。

另一个难点是节点之间如何高效通信。虽然在划分计算任务时,计算任务最好确保互不相干,这样每个节点可以各自为政。但大多数时候节点之间还是需要互相通信,比如获取对方的计算结果等。一般有两种解决方案:一种是利用消息队列,将节点之间的依赖变成节点之间的消息传递;第二种是利用分布式存储系统,我们可以将节点的执行结果暂时存放在数据库中,其他节点等待或从数据库中获取数据。无论哪种方式只要符合实际需求都是可行的。1.3 分布式系统特性[1]

G.Coulouris曾经对分布式系统下了一个简单的定义:你会知道系统当中的某台电脑崩溃或停止运行了,但是你的软件却永远不会。这句话虽然简单,但是却道出了分布式系统的关键特性。分布式系统的特性包括容错性、高可扩展性、开放性、并发处理能力和透明性,现在我们来看一下这些概念的涵义。

[1] George Coulouris是《Distributed Systems-Concepts and Design》这本书的作者,曾是剑桥大学的高级研究员。1.3.1 容错性

我们可能永远也制造不出永不出现故障的机器。类似的,我们更加难以制造出永不出错的软件,毕竟软件的运行还在一定程度上依赖于硬件的可靠性。那么在互联网上有那么多的应用程序和服务,它们都有可能出现故障,但在很多时候,我们几乎都不能发现这些服务中断的情况,这时分布式系统的特点之一容错性就凸显出来了。在大规模分布式系统中,检测和避免所有可能发生的故障(包括硬件故障、软件故障或不可抗力,如停电)往往是不太现实的。因此,我们在设计分布式系统的过程中,就会把容错性作为开发系统的首要目标之一。这样一来,一旦在分布式系统中某个节点发生故障,利用容错机制来避免整套系统服务不可用。

那么问题来了,在考虑容错性的同时,我们是否也需要具备检测、恢复和避免故障的能力呢?没错,在设计与开发分布式系统的过程中,这些问题都需要我们进行认真的思考。对于检测故障来说,最直接的方法是校验消息或数据是否有效,但是这种方法能够覆盖的故障面很窄。而有些问题,如服务器应用程序崩溃,通过普通方法很难检测,这时我们可能就需要一套复杂完整的流程来检测服务器是否真的宕机以及服务器的节点信息,这当中涉及很多因素,如网络延迟、消息乱序等,最后,采用合适的方法通知运维人员。

故障恢复对于分布式系统设计与开发来说极其重要。当服务器崩溃后,我们需要通过一种方法来回滚永久数据的状态,确保尚未处理完成的数据不被传递到下一个状态继续处理,并解决多个节点数据可能存在的不一致性问题,这往往涉及事务性。

常见的避免故障的方法包括消息重发、冗余等。考虑到分布式系统的特性,很多计算任务被分布在不同的节点之间进行,那么其中一个难以避免的问题就是消息丢失,消息丢失的情况屡见不鲜,这几乎成为了设计分布式系统必须解决的问题,我们通常的做法是在一定超时范围内,消息不可达时对消息进行重传,在重新尝试多次后如果消息仍然不可达,才认为节点出现问题。数据冗余存储可以在一定程度上降低数据出错的概率。例如,同一份数据,我们将其存储为A和B两份,那么当单点故障发生时,A存储的数据部分丢失或全部丢失,而B存储的数据完好无损,这时候,我们就可以利用B存储的数据对数据进行恢复,避免单点故障导致的数据丢失。当然,这里我们只考虑到数据,如果把分布式系统中其他组件也考虑进来,我们就能看到更多冗余应用的案例,例如,访问某一特定节点的路由器应当还有一份冗余备份,确保当一个路由器发生故障时,消息仍然可以通过备份的路由器送达。数据库中的数据也可以利用类似的思想存储多份冗余数据,以便在某个节点数据丢失的情况下恢复数据。在消息通信的过程中,将相同的消息派发给两个以上的节点存储或处理,以避免某个节点单点故障导致消息丢失等。

冗余是设计分布式系统时必须考虑的特性之一,也是系统对外提供服务的质量的重要保证,提高用户体验,尽可能减少服务不可用时间是非常重要的。1.3.2 高可扩展性

高可扩展性是指系统能够在运行过程中自由地对系统内部节点或现有功能进行扩充,而不影响现有服务的运行。传统的软件系统或单机软件在更新过程中,往往会先停机,然后升级,当一切更新配置都结束后,最后重新启动应用程序。另外,很多传统的系统是“闭环系

[1]统”,其扩展能力非常有限,它们绝大多数使用私有协议进行消息通信,缺乏开放的API也是导致系统扩展能力低下的主要原因之一。因此,在对现有系统进行扩展的过程中,由于私有接口的局限性和不完善性,扩展工作变得异常复杂,有时甚至需要对接口进行更新和定义,才能满足需求,而与其他系统进行集成则变得更加困难:没有开放接口,需要中间层做转换。这些原因都导致了系统在扩展性方面存在难度大和成本高的问题。

我们来看一个现代分布式系统设计的案例:Storm实时处理系统(以下简称Storm)。在Storm中,节点主要由Spout和Bolt两大类组成,我们可以把这种关系类比到MapReduce过程,Spout作为消息源会将搜集到的数据发送到Storm计算拓扑中,再通过一系列消息处理单元Bolt进行分布式处理,最终将处理结果合并得到最终结果。在这里,消息处理单元Bolt是分布式数据处理的核心组件,每当消息处理单元的数据处理完成后,它就会把当前阶段处理的数据发送给下一级消息处理单元做进一步处理。那么,这些消息处理单元之间的元组数据则主要通过开源JSON格式进行传递。利用这种机制,我们看到了一个很好的现象,那就是我们可以随意在消息处理单元后进行扩充,如果数据处理的结果还达不到我们的需求,只需在Storm计算拓扑中继续追加新的消息处理单元,直至满足我们的需求。Storm使用JSON作为节点之间元组数据发送的纽带,一方面解决了私有接口难以扩展和集成的问题,另一方面解决了Storm拓扑结构的后续节点扩充问题。图1-1所示为基本的Storm实时处理系统拓扑结构图,其中每个方框都是一个节点。图1-1 基本的Storm实时处理系统拓扑结构

因此,在设计和开发我们自己的实时处理系统的过程中,高可扩展性是必须考虑的问题之一,我们会在后续章节进行编程实战的时候对此问题做深入分析。

[1] 这里的闭环系统指的是那些完全通过内部通信,而不需要和外部通过协议进行数据交换的系统。1.3.3 开放性

分布式系统的开放性决定了一个系统是否具备自我扩展和与其他系统集成的能力。我们可以通过对外提供开放应用程序编程接口(Open API)的方式来提高分布式系统的开放性,提供哪些接口以及如何提供决定了我们开发的系统的开放程度,以及与现有系统和其他系统集成、扩展的能力。有很多开源产品在这一方面做得非常好,一方面是因为开源的特性导致系统的开放程度很高,另一方面是因为现代软件开发过程都十分重视开放应用编程接口,以求与更多系统进行集成。当然,只有开放应用编程接口还不够,如果我们提供的接口能够遵循某种协议,那么势必会进一步增加系统的开放性,为未来发展带来更多可能。1.3.4 并发处理能力

可能读者已经想到了,分布式系统引发的一个问题就是并发导致的一致性该如何处理?我们举个例子这个问题就比较清楚了。在分布式系统中,我们假设有两个节点A和B同时操作一条数据仓库的记录,那么数据仓库中的最终结果是由节点A操作产生的,还是由节点B操作产生的呢?这样看来,并发请求处理对对象的操作可能相互冲突,产生不一致的结果。我们设计的分布式系统必须确保对象的操作在并发环境中能够安全使用。因此,对象的并发或同步操作必须确保数据的一致性。

除了一致性之外,我们还希望可以一直对系统进行读写,这就是所谓的可用性。而为了一致性,读取或写入操作可能需要等待,常常需要缓冲等处理方式,这又是一件非常讨厌的事情,因为它牺牲了可用性。

数据库系统还有另一个性质——分区容错性,许多人都阐述过,这是数据库系统必须保证的特性,而在此情况下,从传统上来讲,一致性和可用性我们只能二选其一。分布式存储具有以下特性(CAP)。

1)Consistency(一致性):同一个数据在集群中的所有节点,同一时刻是否都是同样的值。

2)Availability(可用性):集群中一部分节点故障后,集群整体是否还能处理客户端的更新请求。

3)Partition Tolerance(分区容错性):是否允许数据的分区,分区是指是否允许集群中的节点之间无法通信。

提示 在理论计算机科学中,CAP定理(CAP Theorem)又被称作布鲁尔定理(Brewer’s Theorem),它指出对于一个分布式计算系统来说,不可能同时满足CAP3个条件。

而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须要实现的。所以我们只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时满足这三点。有关CAP理论的更多具体解释,读者可以参阅:https://en.wikipedia.org/wiki/CAP_theorem。

在一个分布式系统中,CAP定理会使得整个系统变得非常复杂,而且会严重影响整个系统的并发性能。如何在尽量满足CAP定理的前提下提升系统的并发计算与存储能力,值得我们思考。1.3.5 透明性

在分布式系统内部,可能有成千上万个节点在同时工作,对用户的一个请求进行处理,最终得出结果。虽说如此,但我们设计的系统内部细节应该对用户保持一定程度的透明,我们可以为用户提供资源定位符(URL)来访问分布式系统服务,但用户对分布式系统内部的组件是无从了解的。我们应该把分布式系统当做一个整体来看待,而不是多个微型服务节点构成的集合。1.4 通用分布式计算系统

单从分布式计算系统这个类别来说,其覆盖面非常广。我们将在本节中着重介绍几个十分常见的计算系统。这些计算系统被广泛应用于各个领域。1.4.1 Apache Hadoop

Hadoop是由Apache基金会开发的分布式存储与计算框架。用户不需要了解底层的分布式计算原理就可以轻松开发出分布式计算程序,可以充分利用集群中闲置的计算资源,将集群的真正威力调动起来。

Hadoop由两个重要模块组成。一个是Hadoop分布式文件系统(Hadoop Distributed File System),顾名思义,就是一个分布式的文件系统,可以将文件数据分布式地存储在集群中的不同节点上。另一个是MapReduce系统,是一个针对大量数据的分布式计算系统。而当前版本的Hadoop中加入了一个名为YARN的模块,这是一个用于任务调度和资源管理的框架,而目前MapReduce便是基于YARN开发的。

1.Apache Hadoop的历史

Hadoop的思路来自谷歌提出的MapReduce分布式计算框架。谷歌的MapReduce框架可以把一个应用程序分解为许多并行计算指令,跨跃大量的计算节点运行非常巨大的数据集。而Hadoop的MapReduce则是对谷歌MapReduce的开源实现。另一方面其分布式文件系统则是谷歌的GFS的开源实现。

Hadoop原本是Apache Nutch中的一个子项目。后来Apache将MapReduce模块与Nutch Distributed File System(NDFS)单独抽离出来成为一个顶级项目。

Hadoop已经成为目前世界上最流行的分布式计算框架,Apache也建立了不少与Hadoop相关的项目,如HBase、Cassandra、Avro、Hive、Mahout等项目。

2.HDFS分布式文件系统

Hadoop分布式文件系统(HDFS)是一个主从式的分布式文件系统,是GFS的一种开源实现。

HDFS可以利用大量廉价存储器组成分布式存储集群,取代昂贵的集中式磁盘存储阵列。而HDFS集群由一个NameNode和多个DataNode组成,除此之外还有用于热备份的Secondary NameNode,防止集群出现单点故障。

接下来介绍HDFS的各个组成部分。(1)NameNode

NameNode是整个集群的管理者。它并不存储数据本身,而负责存储文件系统的元数据。它负责管理文件系统名称空间,并控制外部客户端对文件系统的访问。

NameNode决定如何将文件内容映射到DataNode的数据块上。此外,实际数据传输并不会经过NameNode,而会让对应的DataNode接收实际数据,并处理分布式存储系统的负载均衡问题。

整个文件系统只有一个NameNode,因此很明显集群可能会出现单点故障,这点我们需要利用Secondary NameNode来解决问题。(2)Secondary NameNode

Secondary NameNode是NameNode的备份节点,HDFS会将NameNode的数据实时备份到Secondary NameNode上,当NameNode宕机需要重启时,则可以利用Secondary NameNode中的数据加快NameNode的重启恢复速度。(3)DataNode

DataNode是实际的数据存储节点,负责相应NameNode创建、删除和复制块的命令。NameNode会读取来自DataNode的心跳信息,以此判断DataNode是否存活。同一份数据会以多份副本存储在不同的DataNode上,一旦某一个DataNode宕机,NameNode会立即采取手段来处理问题。(4)MapReduce模型

MapReduce既是Hadoop中的模块,也是一个计算模型。用户需要自己将算法划分成Map和Reduce两个阶段。首先将数据划分为小块的数据,将数据分配到不同计算节点的Map任务中计算,然后将计算结果汇总到Reduce节点中进行合并,得出最终结果。

MapReduce系统也是主从式的计算系统。在使用YARN后,每个集群有一个Resource-Manager,用于管理整个集群。集群中每个计算节点都有一个NodeManager,负责管理某个节点的容器并监视其资源使用。每个应用程序由一个MRAppMaster进行管理。

3.Apache Hadoop特性

Apache Hadoop具有以下几个特点。

1)高可靠性:Apache Hadoop可以可靠地将数据存储到节点上。

2)高可扩展性:Apache Hadoop的存储和计算节点可以快速扩展,并自动进行负载均衡。

3)高效性:一方面Apache Hadoop会自动在各个节点之间动态调动数据,保证每个节点存储均衡,另一方面读取数据时我们可以从不同节点并行读取,提高数据读取的速度。

4)高容错性:Apache Hadoop会将数据冗余存储在不同节点上,保证数据容错性,计算任务失败时也会自动重新分配任务。

5)低成本:一方面,Apache Hadoop是开源软件,可以节省商业软件的购买成本。同时,Apache Hadoop可以用廉价节点组成的集群取代昂贵的超级计算机,从而可以节省硬件成本。

Apache Hadoop虽然是异常可靠的分布式计算框架,但其计算存储模型也导致它的严重缺陷——实时性较差。首先MapReduce计算模型本身是一种批处理的计算模型,也就是积累一批数据,然后启动MapReduce任务处理完这一批数据,等到下次积累到一定程度,再定时或手动启动一轮新任务,而不是随着数据到来即时处理。

此外,HDFS不是一个高实时性的分布式文件系统。为了提高其实时性我们还需要自己加上很多缓存优化。而致命问题在于MapReduce各个任务之间的通信完全使用HDFS完成,这也就从根本上导致MapReduce不可能具有极高的实时性。1.4.2 Apache Spark

为了解决Apache Hadoop计算速度较慢的问题,Apache Spark应运而生。我们可以将Apache Spark看成一种“高层”分布式计算框架。它具有以下特点。

1)执行速度极快:首先它支持将计算任务的中间结果放在内存中而不是HDFS上,这样可以加快速度,根据评测最高可以提升100倍。

2)支持多种运行模式:除了可以独立在集群上执行任务以外,Spark还支持将任务执行在EC2或Apache Hadoop的YARN上,也可以从HDFS、Cassandra、HBase、Hive等各种数据存储系统中读取数据。

3)更多更通用的计算模型:Hadoop只提供了较为底层的MapReduce模型,编程人员往往需要大量编码来解决简单的任务。而Spark则提供了SQL接口、Apache Spark流模型接口、MLib机器学习接口以及GraphX图形计算接口等多种接口,可以方便应用于多种场合,提高开发人员的开发效率。

但Spark依然没有解决Hadoop计算模型中的一个致命问题——Spark的计算模型依然是任务式的,如果我们需要处理实时流入又需要实时反馈的数据,Spark的模型依然无法很好地满足我们的需求。1.4.3 Apache Storm

随着互联网业务数据规模的急剧增加,人们处理和使用数据的模式已然发生了天翻地覆的变化,传统的技术架构已经越来越无法适应当今海量数据处理的需求。MapReduce、Hadoop以及Spark等技术的出现使得我们能处理的数据量比以前要多得多,这类技术避免了我们面对海量数据时的措手不及,也在一定程度上缓解了传统技术架构过时的问题。

但是,随着业务数据规模的爆炸式增长和对数据实时处理能力的需求越来越高,原本承载着海量数据处理任务的批处理系统在实时计算处理方面越发显得乏力。这么说的原因很简单,像Hadoop使用的MapReduce这样的数据处理技术,其设计初衷并不是为了满足实时计算的需求。任务式计算模型与实时处理系统在需求上存在着本质的区别。要做到实时性,不仅需要及时地推送数据以便处理,还要将数据划分成尽可能小的单位,而像HDFS这样的系统存储推送数据的能力已经远不能满足实时性的需求。

因此,Apache Storm实时处理系统的出现顺应了实时数据处理业务的需求。Apache Storm是一个开源的、实时的计算平台,最初由社交分析公司Backtype的Nathan Marz编写,后来被Twitter收购,并作为开源软件发布。从整体架构上看,Apache Storm和Hadoop非常类似。Apache Storm从架构基础本身就实现了实时计算和数据处理保序的功能,而且从概念上看,Apache Storm秉承了许多Hadoop的概念、术语和操作方法。

Apache Storm作为实时处理系统中的一个典型案例,其特点和优势如下。

1)高可扩展性:Apache Storm可以每秒处理海量消息请求,同时该系统也极易扩展,只需增加机器并提高计算拓扑的并行程度即可。根据官方数据,在包含10个节点的Apache Storm集群中可以每秒处理一百万个消息请求,由此可以看出Apache Storm的实时处理性能优越。

2)高容错性:如果在消息处理过程中出现了异常,Apache Storm的消息源会重新发送相关元组数据,确保请求被重新处理。

3)易于管理:Apache Storm使用ZooKeeper来协调集群内的节点配置并扩展集群规模。

4)消息可靠性:Apache Storm能够确保所有到达计算拓扑的消息都能被处理。

本书从实时处理系统的角度出发,结合分布式系统开发过程中的各种实践,开发一套基于C/C++实现的实时处理系统,我们会在编程实践过程中针对语言的特殊性讲解大量实时处理系统编程设计指导、编程原理和实践经验,从通信系统的设计、软件架构的设计、模块接口设计、核心组件内部设计与实现,到一些高级特性设计实现,由浅入深地指导读者开发出高性能分布式实时处理系统。随后介绍一些高层抽象,希望读者可以自行研究并进行设计实现,将本书教授的知识融会贯通。最后我们以几个实例介绍如何使用编写的系统进行分析,并在公有云上部署实际的系统与服务,让读者有更深刻的认识。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载