从零开始学Storm(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-08 17:29:28

点击下载

作者:赵必厦,程丽明

出版社:清华大学出版社

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

从零开始学Storm

从零开始学Storm试读:

前言

Storm是一个免费开源的分布式实时计算系统。Storm能轻松可靠地处理无界的数据流,就像Hadoop批处理一样对数据进行实时处理;但是Storm能持续运作下去,并且Storm的使用十分简单,开发人员可以使用任何编程语言对它进行操作,得到满意的结果。

本书以Storm官方网站最新的Release版本Storm 0.9.0.1进行讲解,从零开始,使读者在较短的时间内系统掌握Storm的理论基础,面向Linux平台搭建与研发自己基于Storm的大数据处理平台。全书分为5个模块,共20章内容,其中“基础知识”6章、“安装与部署”4章、“研发与维护”4章、“进阶知识”5章、“企业应用”1章,分别介绍了Storm的安装与配置、Storm的基本原理、Topology组件、Spout组件、Bolt组件、ZooKeeper集群、实战环节等内容,包括理论基础、环境搭建、研发准备、应用案例等。

作为国内第一本介绍Storm方面的书籍,本书的Storm理论部分主要参考了Storm Wiki;另外,为了更好地理解Storm,也参考了不少Storm爱好者的中文翻译文章;而Storm的应用部分,是本书编者的实战应用经验与理论相结合的结晶。本书在编写过程中,得到了多位Storm开发者/爱好者的帮助以及对本书的校验和建议,在此表示感谢,特别要感谢赵鸿、陈险峰两位同志。

由于编者水平有限,且本书涉及的知识点较多,书中难免有不妥和错误之处,敬请广大读者批评指正。

书中的源代码主要来自storm-starter项目,下载地址为:https://github.com/nathanmarz/storm-starter。

为了更有效地学习,建议读者在开始学习或阅读本书前先了解Linux的基本操作、Shell脚本的基本语法、Java语言的基本语法等内容。编者2014年4月第一章Storm简介

本章主要介绍Storm的起源,Storm的基本概念、特征和优势,从哪里可以找到Storm的学习和源代码参考的网站,以及Storm的应用现状和发展趋势。通过本章的学习,读者将对Storm有一个基本的了解。1.1什么是Storm

Storm是一个免费开源的分布式实时计算系统。Storm能轻松可靠地处理无界的数据流,就像Hadoop批处理一样对数据进行实时处理;但是Storm能持续地运作下去,并且要掌握Storm十分简单,开发人员可以使用任何编程语言对它进行操作,得到满意的结果。

Storm能用到很多场景中,包括实时分析、在线机器学习、连续计算、分布式RPC、ETL等。Storm的处理速度非常快,每个节点每秒钟可以处理100万条消息。同时,Storm是可伸缩的、容错的,并且能保证数据根据用户的设定被妥善处理,便于进行设置和操作。Storm的抽象示意图如图1.1所示。图1.1 Storm的抽象示意图

Storm集成了许多消息队列和数据库技术。Storm的Topology消耗数据流,以任意复杂的方式处理这些流,并且在每个需要计算的阶段以这些流进行重新划分。Storm的开发语言主要是Java和Clojure,其中Java定义骨架,Clojure编写核心逻辑。Storm具有多语言功能,Java是Storm的主要使用语言,但Python也是Storm的常用语言之一(本书的一些例子将使用Python语言)。

Storm公开一组原语进行实时计算。使用这些简单的原语,能实现类似MapReduce的效果。Storm的原语极大地简化了并行实时计算的编写,最终使并行批处理的编写变得易于实现。

Storm具有的关键特征如下。(1)用例非常广泛(Extremely broad set of use cases)

Storm可以用于处理消息和更新数据库(即流处理),完成数据流的持续查询任务,然后把结果流送到客户端(持续计算)。Storm并行密集查询能持续进行,完成搜索查询(分布式RPC)和更多的业务功能。仅一个小小的Storm的原语集便可以处理惊人数量的用例。(2)可伸缩性(Scalable)

Storm每秒处理大量的消息。要对一个拓扑进行扩展,用户所需要做的仅仅是向拓扑中添加主机,然后增加拓扑的并行设置。让我们来看下Storm规模化的一个例子,最初的Storm应用程序在一个10节点集群(作为拓扑的一部分)上每秒处理1000000条消息,这还包括每秒数以百计的数据库调用。Storm使用ZooKeeper协调集群,使其可以扩展到更大的集群规模。(3)保证没有数据丢失(Guarantees no data loss)

一个实时系统必须强有力地保证数据能按照用户设定而被成功处理。一个丢失数据的系统是不优秀的,仍拥有非常有限的用例。Storm能保证每条消息都会被妥善处理,这与其他系统(例如S4)形成了非常直接的对比。(4)强壮的鲁棒性(Extremely robust)

不同于鲁棒性差的甚至难以管理的Hadoop系统,Storm集群非常健壮,能有效地运行。强壮的鲁棒性是Storm项目的一个明确目标,旨在让用户尽可能简单地管理Storm集群。(5)容错性好(Fault-tolerant)

如果在执行用户设定的计算时有错误发生,Storm只需要重新分配任务再执行。Storm能保证计算可以永远运行,直到用户结束计算进程为止。(6)编程语言无关(Programming language agnostic)

健壮的、可伸缩的实时处理不应该局限于单一的平台。Storm的拓扑和处理组件可以使用任何语言定义。这一编程语言无关性使得Storm可以被几乎任何一个用户轻松使用。1.2Storm的诞生

Storm是随着实时大数据处理的需求而生的,最早用在微博社交工具Twitter上,在分布式的环境下不间断地实时处理少量的数据。Storm获得了极大的成功。之后由Twitter开源,成为处理实时大数据的最实用工具之一。1.2.1 从Twitter说起

Twitter(中文译名:推特)是美国的一个社交网络及微博客服务的网站,由利兹·斯通、埃文·威廉姆斯和杰克·多尔西于2006年共同创建,总部位于美国加州旧金山。Twitter利用无线网络、有线网络等通信技术进行即时通信,是微博的鼻祖。它允许用户将自己的最新动态和想法以短消息的形式(推文)发布(发推),可绑定IM即时通信软件。所有的Twitter消息都被限制在140个字符之内。1.2.2 Twitter需要处理大批实时性要求高的大数据业务

Twitter业务的实时处理需求极高。几十亿的用户在不同高峰段通过手机、平板电脑、个人计算机等终端发布大量(说海量真是名副其实)的信息,同时大量的用户在Twitter上从这些海量的信息中搜索、查看关心的话题并且对它们进行转发和评论。这一切都需要强大的实时处理海量数据的能力。

除基本的推文发布功能之外,Twitter还有大量的统计类应用,主要包括doesfollow(判断某用户是否follow了另一用户)、TweetStats(分析用户自身或其他用户的Twitter内容,如发推常见时间段、主要交流用户等)、Twitterholic(统计出用户的一些基本数据,更能将这些数据与其他Twitter用户进行比较,而得出一个排名)、TwitterRank(根据用户所有推文和其他用户互动等信息,进行Twitter的细分排名)、Tweetwasters(在Twitter上总的花费时间及细项统计)和monitter(根据用户设定选择三个关键词进行监控)。从以上的简要介绍来看,这些业务都需要实时对最新的大量数据进行统计。

Twitter本身还有一些需要进行大数据处理的业务,另外还向第三方开发者提供开放API(Twitter将自己的网站服务封装成一系列API开放出去,供第三方开发者使用以开发Twitter相关的应用,通过Twitter获得收益)。Twitter需要对这些应用提供实时的大数据服务,主要有:TwitterMap(用户根据Twitter的Username进行地理位置的搜索,显示用户公开的Twitter留言以及地理位置等相关信息),TwitterBar(将用户当前浏览的网站地址收藏到自己的Twitter账号中,还可见当前访问网站的相关信息等),Twittervision(在Google Map上实时显示用户更新Twitter的内容),Twitter tools(WordPress插件,用户可以在自己的WP平台上发送以及显示自己的Twitter留言等),Twitteroo(安装在Windows下的桌面软件,允许用户在不登入Twitter的情况下向自己的账号中发送信息),Twitter Badges(Twitter提供的一款小型应用,用户可以通过它将自己的心情放在自己的博客中)。1.2.3 Storm帮助Twitter解决实时海量大数据处理问题

过去的十年经历了数据处理的革命。MapReduce、Hadoop以及相关技术,已经能够对先前难以想象的大规模数据进行存储和处理。然而,这些数据处理技术并不是实时的,也注定不是实时的。没有高手会把Hadoop变成一个实时系统,实时数据处理相对于批处理有一个从本质上不同的需求集。

然而,企业越来越要求超大规模的实时数据处理。缺乏实时处理能力的Hadoop已经成为数据处理生态系统中最大的缺陷。

Storm填补了这一缺陷。Storm是一个分布式实时计算系统。类似于提供了一组通用原语进行批处理的Hadoop,Storm提供了一组通用原语进行实时计算。Storm是简单的,可以使用任何编程语言,很多公司使用它并且有很浓厚的兴趣去使用它。

在Storm出现之前,通常需要手工搭建一个消息队列和Worker组成的网络进行实时处理。工作节点会处理从消息队列弹出的消息,然后更新数据库,并发送新消息到其他队列进行进一步处理。可惜,这种方法具有严重的局限性。(1)很乏味

用户用大部分的开发时间来配置向何处发送消息、部署工作节点、部署中间队列等工作,而用户关心的实时处理逻辑只占用户代码库中一个相对小的百分比。(2)系统很脆弱

有很小的容错功能,用户的职责是保证每个工作节点和消息队列运行起来。(3)很难对规模进行扩展

当一个工作节点或队列的消息吞吐量达到高点,用户需要决定对数据如何传播进行划分。用户需要重新配置其他工作节点,让它们知道发送消息的新位置。这就引入了移动组件和新的可以失败的组件。

尽管可将队列和工作节点范例分解为大量的消息,但是消息处理显然是实时计算的基本范例。问题是如何在不丢失数据,扩展到很大规模,并且可以简单地使用和操作的前提下,做到这些?而Storm可满足这一目标。

2011年7月,Twitter正式收购了BackType公司。BackType公司提供的服务主要为:分析一个组织在Twitter发布的信息的影响力,并且总结分析Twitter消息为他人重复转发的频率。同年8月4日Twitter将Storm正式开源。具有实时、快速地处理海量大数据的能力,Storm能帮助Twitter和其他有此类需求的企业解决实时大数据处理问题。1.3Storm的成长

Storm自开源后,得到了原项目小组和其他热心贡献者的帮助,其组成技术不断地发展,拥有了广大的支持者和技术兴趣者。这些支持者和技术兴趣者中也成立了许多技术支持网站,以向学习者提供帮助及技术爱好者之间相互交流。1.3.1 Storm正式开源

Twitter将Storm正式开源了,这是一个分布式的、容错的实时计算系统,它被托管在GitHub上,遵循 Eclipse Public License 1.0。Storm是由BackType开发的实时处理系统,BackType现在已在Twitter麾下。GitHub上的最新版本是Storm 0.9.0.1,基本是用Clojure写的。

Storm为分布式实时计算提供了一组通用原语,可用于“流处理”之中,实时处理消息并更新数据库。这是管理队列及工作者集群的另一种方式。Storm也可被用于“连续计算”(Continuous Computation),对数据流做连续查询,在计算时就将结果以流的形式输出给用户。它还可用于“分布式RPC”,以并行的方式运行昂贵的运算。

Storm可以方便地在一个计算机集群中编写与扩展复杂的实时计算,Storm之于实时处理,就好比Hadoop之于批处理。Storm保证每个消息都会得到处理,而且它速度很快——在一个小集群中,每秒可以处理数以百万计的消息。更棒的是可以使用任意编程语言来进行开发。1.3.2 Storm的核心技术和基本组成

Storm框架的核心由7个部分组成,如图1.2所示,它们同时也是Storm的基本组成部分。图1.2 Storm的核心技术组成

• Topology(拓扑)

一个拓扑是一个图的计算。用户在一个拓扑的每个节点包含处理逻辑,节点之间的链接显示数据应该如何在节点之间传递。Topology的运行是很简单的。

• Stream(流)

流是Storm的核心抽象。一个流是一个无界Tuple序列,Tuple可以包含整形、长整形、短整形、字节、字符、双精度数、浮点数、布尔值和字节数组。用户可以通过定义序列化器,在本机Tuple使用自定义类型。

• Spout(喷口)

Spout是Topology流的来源。一般Spout从外部来源读取Tuple,提交到Topology(如Kestrel队列或Twitter API)。Spout可分为可靠的和不可靠的两种模式。Spout可以发出超过一个流。

• Bolt(螺栓)

Topology中的所有处理都在Bolt中完成。Bolt可以完成过滤、业务处理、连接运算、连接、访问数据库等业务。Bolt可以做简单的流的转换,发出超过一个流,主要方法是execute方法。完全可以在Bolt中启动新的线程做异步处理。

• Stream grouping(流分组)

流分组在Bolt的任务中定义流应该如何分区。Storm有7个内置的流分组接口随机分组(Shuffle grouping)、字段分组(Fields grouping)、全部分组(All grouping)、全局分组(Global grouping)、无分组(None grouping)、直接分组(Direct grouping)、本地或者随机分组(Local or shuffle grouping)。

• Task(任务)

每个Spout或者Bolt在集群执行许多任务。每个任务对应一个线程的执行,流分组定义如何从一个任务集到另一个任务集发送Tuple。可通过TopologyBuilder类的setSpout()和setBolt()方法来设置每个Spout或者Bolt的并行度。

• Worker(工作进程)

Topology跨一个或多个Worker节点的进程执行。每个Worker节点的进程是一个物理的JVM和Topology执行所有任务的一个子集。1.3.3 Storm的项目小组

Storm项目小组的构成如图1.3所示。图1.3 Storm项目小组的构成1.项目主管

Nathan Marz,Storm的作者和主工程师,Twitter首席工程师。

Nathan Marz原是BackType的主力工程师。BackType于2011年7月被Twitter收购。收购后不久,Storm对外开源,许多互联网公司纷纷采纳这一系统。

Nathan Marz依然带领其团队继续从事Storm的相关工作。过去很长时间内Nathan Marz热衷于研究Java、Ruby、Python,现在则使用Clojure。Clojure非常有趣,它给Storm项目组带来了巨大的效能。

Nathan Marz坚信开源的力量,并发表了一些开源项目。Cascalog是用于MapReduce的高度抽象的库,用Clojure编写,拥有活跃的用户社区,并有大量企业使用。Storm用十分流行的Java、Scala或Clojure语言编写。目前Nathan Marz正在编写Big Data一书,主要介绍可扩展的实时数据系统的原则与实践。2.项目核心贡献者(1)徐明明

中国阿里巴巴的徐明明是Storm项目的核心贡献者。他的英文名为James Xu,Twitter账号为xumingming。

徐明明于2007年毕业,一直从事互联网方面的工作,目前在阿里巴巴做交易相关的开发工作。当Storm开源的时候他正好在做数据统计相关的项目,对Storm产生了浓厚的兴趣,并且为Storm的发展做出了巨大的贡献,属于Storm的学术型使用者。图1.4显示了徐明明对Storm的贡献。图1.4 徐明明的贡献图

徐明明主要关注java、Clojure、开源、大数据相关的技术。他翻译了《Clojure编程》一书(http://book.douban.com/subject/21661495/)。

可以从以下网站访问徐明明的最新成果:https://github.com/xumingming,http://stackoverflow.com/users/238546/james-xu,http://weibo.com/64398966。(2)P. Taylor Goetz

P. Taylor Goetz是Storm项目在GitHub网站上排名第2的核心贡献者,主要的贡献有storm-signals、storm-jms、storm-cassandra、storm-maven-plugin和duke。他对storm项目特别是最新的0.9版本做出了极大的贡献,图1.5显示了P. Taylor Goetz对Storm的贡献。图1.5 P. Taylor Goetz的贡献图

可以从以下网站访问P. Taylor Goetz的最新成果:https://github.com/ptgoetz,http://ptgoetz.github.io/blog/archives/。(3)Mike Heffner

Mike Heffner是Storm项目在GitHub网站上排名第3的核心贡献者,主要的贡献有awsam、rails_datatables、octoglassformtastic-sass和ofxsh。他对Storm的贡献如图1.6所示。图1.6 Mike Heffner的贡献图

Mike Heffner的Twitter主页是:http://twitter.com/mheffner。您可以通过Twitter与他进行Storm技术的交流。(4)Jason Jackson

Jason Jackson在Twitter、BackType、Google、UWaterloo担任过软件工程师。Jason Jackson的Twitter主页是:http://twitter.com/jason_j。您可以通过Twitter与他进行Storm技术的交流。(5)Andy Feng

Andy Feng是Storm项目的核心贡献者。Andy Feng主要关注Java、Shell、JavaScript语言。同样,Andy Feng对Storm做出了巨大的贡献,他对Storm的贡献如图1.7所示。图1.7 Andy Feng的贡献图

可以从以下网站位置访问Andy Feng的最新成果:https://github.com/anfeng。3.项目的其他贡献者

以下是Storm项目的其他贡献者以及他们的个人/贡献成果介绍。

Christopher Bertels

http://twitter.com/bakkdoor

Michael Montano

http://twitter.com/michaelmontano

Dennis Zhuang

https://github.com/killme2008

Trevor Smith

https://github.com/trevorsummerssmith

Ben Hughes

https://github.com/schleyfox

Alexey Kachayev

https://github.com/kachayev

Haitao Yao

https://github.com/haitaoyao

Dan Dillinger

https://github.com/ddillinger

Kang Xiao

https://github.com/xiaokang

Gabriel Grant

https://github.com/gabrielgrant

Travis Wellman

https://github.com/travisfw

Kasper Madsen

https://github.com/KasperMadsen

Michael Cetrulo

https://github.com/git2samus

Thomas Jack

https://github.com/tomo

Nicolas Yzet

https://github.com/nicoo

Fabian Neumann

https://github.com/hellp

Soren Macbeth

https://github.com/sorenmacbeth

Ashley Brown

https://github.com/ashleywbrown

Guanpeng Xu

https://github.com/herberteuler

Vinod Chandru

https://github.com/vinodc

Martin Kleppmann

https://github.com/ept

Evan Chan

https://github.com/velvia

Sjoerd Mulder

https://github.com/sjoerdmulder

Yuta Okamoto

https://github.com/okapies

Barry Hart

https://github.com/barrywhart

Sergey Lukjanov

https://github.com/Frostman

Ross Feinstein

https://github.com/rnfein

Junichiro Takagi

https://github.com/tjun

Bryan Peterson

https://github.com/Lazyshot

Sam Ritchie

https://github.com/sritchie

Stuart Anderson

https://github.com/emblem

Robert Evans

https://github.com/revans2

Lorcan Coyle

https://github.com/lorcan

Derek Dagit

https://github.com/d2r

Andrew Olson

https://github.com/noslowerdna

Gavin Li

https://github.com/lyogavin

Tudor Scurtu

https://github.com/tscurtu

Homer Strong

https://github.com/strongh

Sean Melody

https://github.com/srmelody

Jake Donham

https://github.com/jaked

Ankit Toshniwal

https://github.com/ankitoshniwal1.3.4 Storm的技术支持网站1.Storm项目的官方网址

Storm项目的官方网址为: http://storm-project.net/

使用浏览器打开官网网址,其首页如图1.8所示。图1.8 Storm项目的官方网址图2.GitHub上的Storm项目

Storm项目在GitHub上的网址为: https://github.com/nathanmarz/storm

在GitHub主页https://github.com/上可以搜索到GitHub上与Storm相关的所有项目,如图1.9和图1.10所示。图1.9 在GitHub网站上搜索Storm项目图1.10 GitHub网站上的Storm项目

在这个网站上,可以找到Storm的相关代码和相关项目。

特别说明,GitHub网站上的Storm Wiki有storm-contrib项目外的其他值得注意的Storm相关项目的链接。

此外,还可以在Storm Wiki上找到Storm的相关文档和教程,Storm Wiki的网址为 https://github.com/nathanmarz/storm/wiki

GitHub网站上的Storm Wiki如图1.11所示。图1.11 GitHub网站上的Storm wiki3.在Wiki上的Storm介绍

在Wiki上可以对Storm项目有一个总体的了解,可以找到Storm的一些相关网站链接,如图1.12所示。图1.12 Storm Wiki的网站图4.Storm的邮件列表

Storm的邮件列表地址如下: http://groups.google.com/group/storm-user

用户可在Storm的邮件列表中进行提问。

用户也可以到freenode网站(http://freenode.net/)的#storm-user的空间找到Storm开发者来帮助你。1.4Storm的优势

Storm的主要优势如下。1.4.1 集成多种技术

Storm集成了一些消息队列系统和数据库系统,Storm的Spout抽象使得它很容易集成一些新的消息队列系统。消息队列集成主要有:● Kestrel● RabbitMQ/AMQP● Kafka● JMS

同样,Storm也可以很容易地和数据库系统集成。简单打开一个数据库连接,就可以像平常一样进行读写,Storm会自动完成并行化、分区、在失败时尝试连接等操作。1.4.2 简单的API

Storm有简单且易于使用的API。当使用Storm编程的时候,用户可以使用相应的API来操纵和变换Tuple的流。一个Tuple是一个命名的值列表。Tuple可以包含任何类型的对象,如果想使用一个Storm不知道的类型,可以通过序列化注册该类型然后在程序中进行应用。

Storm只有三个抽象类型:Spout、Bolt和拓扑。Spout是计算流的来源。通常在系统中Spout从Kestrel、RabbitMQ和Kafka等消息队列进行读取,但Spout还可以生成自己的流或者从Twitter流的API的某个地方读取。Spout实现了现有的大多数队列系统。

Bolt处理任意数量的输入流,并且产生任意数量的新的输出流。大多数的逻辑计算进入Bolt,如功能、过滤、流连接与数据库交互等。

Topology是一个由很多Spout和Bolt组成的网络,网络上的每条边代表了一个Bolt订阅的数据流,这些数据流包括从Spout或从Bolt输出的数据流。一个Topology实际上就是一个任意复杂的多级流计算过程。当Topology在服务器上部署完之后,它就会一直运行下去,直到用户禁止相应的进程。

Storm有一个“本地模式”,用户可以在进程里面模拟一个Storm集群,然后进行类似实际集群上的开发工作。这种模式对于开发和测试十分有用。当用户准备好在一个真正的集群上提交Topology执行的时候,可以使用Storm命令行方便地从客户端提交一个Topology到集群上运行。1.4.3 可扩展的

Storm的Topology是并行计算的,它运行在一个集群主机上面。可以对Topology的不同部分单独调整它们的并行扩展。Storm命令行客户端的rebalance命令可以调整并行运行的Topology。

Storm内在的并行度意味着它能以低延迟速度来处理高吞吐量的消息。根据Storm官方网站的资料介绍,Storm的一个节点(Intel E5645@2.4Ghz的CPU,24 GB的内存)在1秒钟能够处理100万个100字节的消息。1.4.4 容错的

Storm是容错的。当Worker死亡,Storm会自动重新启动它们。如果一个节点死亡,Worker将在另一个节点上重新启动。

Storm的守护进程Nimbus和Supervisor被设计为无状态和快速失败的,所以如果它们死亡,它们会重启,就像什么都没发生过。这意味着可以使用kill -9命令来强制杀死Storm守护进程而不影响集群或者Topology的健康。1.4.5 保证数据处理

Storm保证每一个Tuple都能被完全处理。Storm的核心机制之一是能够通过一种非常有效的Topology方式来跟踪Tuple。

Storm保证每个消息至少能得到一次完整处理。任务失败时,它会负责从消息源重试消息。

使用Trident(一种在Storm的基本抽象上更高层次的抽象),用户可以实现一次且仅一次处理的语义。1.4.6 可以使用任何语言

Storm可与任何编程语言一起使用。Storm的核心是一个定义和提交Topology的Thrift定义。因为Thrift可以用于任何语言,所以Topology可以用任何语言进行定义并提交。

同样,用户可以使用任何语言来定义Spout和Bolt。非JVM的Spout和Bolt可通过一个基于JSON协议的stdin/stdout与Storm通信。目前有Ruby、Python、Javascript、Perl和PHP实现这个协议的适配器。

Storm-starter有一个使用Python实现一个Bolt的Topology的例子。1.4.7 部署和操作简单

Storm集群是易于部署的,仅需要少量的安装和配置就可以运行,Storm的“开箱即用”配置十分适合生产环境。

如果用户在EC2环境上开展业务,通过storm-deploy项目提供的简单方式就可以完成准备、配置和安装一个Storm集群的工作——用户仅仅需要点击一个按钮!

此外,Storm部署之后也很容易操作。现在Storm被设计得极为健壮,使用Storm的集群会日复一日持续地稳定运行。1.4.8 自由开源

Storm是Eclipse Public License许可证下的一个免费开放源码项目,目前被托管在GitHub上。Eclipse Public License(EPL)是一个非常宽容的许可,允许用户使用Storm用于开源的或者专有的目的。

Storm项目使用的是Eclipse Public License 1.0授权,官方原文如下: The use and distribution terms for this software are covered by the Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) which can be found in the file LICENSE.html at theroot of this distribution. By using this software in any fashion, you are agreeing to be bound by the terms of this license. You must not remove this notice, or any other, from this software.

Storm有巨大的并且日益增长的生态系统库,以及与Storm协同使用的工具。storm-contrib项目是一个为社区贡献的中央知识库,storm-contrib内所有的内容都是在Eclipse Public License许可证下的。当然,许多社区成员也会选择storm-contrib外的Storm相关的项目。1.5Storm的应用现状和发展趋势

Storm作为最成功的实时大数据处理工具之一,在实时处理海量数据的领域中得到了充分的应用,以下作简单的介绍,使用Storm的公司及其相关项目的更多内容可参考本书的第20章。1.5.1 应用现状1.Storm应用方向

目前Storm主要应用在以下这3个方面。(1)流处理(Stream Processing)

Storm最基本的用例是“流处理”。Storm可以用来处理源源不断流进来的消息,处理之后将结果写入到某个存储中去。(2)连续计算(Continuous Computation)

Storm的另一个典型用例是“连续计算”。Storm能保证计算可以永远运行,直到用户结束计算进程为止。(3)分布式RPC(Distributed RPC)

Storm的第三个典型用例是“分布式RPC”,由于Storm的处理组件是分布式的,而且处理延迟极低,所以可以作为通用的分布式RPC框架来使用。当然,其实搜索引擎本身也是一个分布式RPC系统。2.使用Storm的企业和组织

自2011年8月Twitter将Storm正式开源以来,Storm在全球众多互联网企业得到了广泛的应用。表1.1是使用Storm的主要企业和组织。表1.1 使用Storm的主要企业和组织3.Storm的相关项目

• storm-website项目

这是storm-project.net网站的源代码,使用Jekyll(https://github.com/mojombo/jekyll)编写。

storm-website项目的网址为:https://github.com/nathanmarz/storm-website。

• storm-starter项目

storm-starter项目的网址为:https://github.com/nathanmarz/storm-starter。

storm-starter项目包含了大量使用Storm的例子。

如果读者是第一次接触Storm,建议首先了解以下3个主要的Storm的Topology。● ExclamationTopology:全由Java编写的基本Topology;● WordCountTopology:使用Python实现Bolt的使用multilang的基

本Topology;● ReachTopology:在Storm上面的复杂的DRPC例子。

• storm-deploy项目

storm-deploy项目的网址为:https://github.com/nathanmarz/storm-deploy

如果读者在AWS上使用Storm,那么可以考虑使用storm-deploy项目。storm-deploy项目使得我们能够非常简单地在AWS上部署Storm集群。storm-deploy在EC2上完全自动化地供给、配置和安装Storm集群,它还为你设置Ganglia,你可以使用Ganglia监视CPU、磁盘和网络。

• storm-contrib项目

storm-contrib项目的网址为:https://github.com/nathanmarz/storm-contrib

storm-contrib是一个使用Storm模块的社区库,其中包含了大量的集成了Redis、Kafka、MongoDB等其他系统的Spout/Bolt,以及Storm开发者遇到的常见任务的代码。

storm-contrib是被组织成每个模块一个子文件夹的“超级项目”,每个模块是分别独立的,模块所有者负责分配。

一些storm-contrib模块是git子模块(链接到外部的github库)。这允许storm-contrib子项目可以被外部维护(所以那些项目可以保持独立的分支和标签),但也包含在storm-contrib项目中,以便增加社区可见度。

storm-contrib内所有的内容都是在Eclipse Public License许可证下的。storm-contrib包括:● Spouts:Spouts集成JMS、Kafka、Redis pub/sub等消息队列系

统。● storm-state:storm-state使得用户在其计算过程中能以一种可靠

的方式来很容易地管理大量的内存状态——通过持久地使用一

个分布式文件系统。● 数据库集成:有许多Bolt帮助集成各种数据库,如MongoDB、关

系数据库、Cassandra等。● 其他繁杂的公用组件。

• storm-mesos项目

storm-mesos项目在Mesos集群资源管理器上运行Storm。Storm与Mesos集群资源管理器整合在一起,这个项目已用于Twitter产品。

用户可以像将Topology提交给正常的Storm集群的方式来将Topology提交给Storm/Mesos。

Storm/Mesos提供了在Topology之间进行隔离的技术。通过这种技术,用户无需为Topology之间可能的干扰而担心。

• storm-yarn项目

storm-yarn项目的网址为:https://github.com/yahoo/storm-yarn。

storm-yarn是Yahoo!公司的开源项目,使Storm集群可以被部署到Hadoop YARN管理的主机上,这仍然是进行中的工作。

本项目的贡献者有:Andy Feng (@anfeng)、Robert Evans (@revans2)、Derek Dagit (@d2r)、Nathan Roberts(@ynroberts)。

• 其他storm相关的项目

可以在GitHub的官方网站(https://github.com/)搜索Storm相关的开源项目。1.5.2 发展趋势1.Storm技术发展情况

2012年,Storm各系列的版本已经在各大公司得到广泛使用;2013年12月,Storm 0.9.0已经成功发布,当前最新版本为0.9.0.1。现已有不少的企业组织或个人开始使用这一新的版本。但目前主要使用的版本为0.8版本。

2012年8月发布的0.8版本中引入了State,使得其从一个纯计算框架演变为一个包含存储和计算的实时计算利器。

另外0.8版本也引入了Trident——一个高级抽象实时计算系统,这是实时计算领域的巨大跨越。Trident提供更加友好的接口,同时可定制Scheduler的特性也为其针对不同的应用场景做优化提供了更便利的手段,也有人已经在基于Storm的实时QL(Query Language)上迈出了一步。

在服务化方面,Storm一直在朝着融入Mesos框架的方向努力。同时,Storm也在实现细节上不断地优化,使用很多优秀的开源产品以进行产品功能的扩展,包括Kryo、Disruptor和Curator等。

Storm集成了许多库,支持包括Kestrel、Kafka、JMS、Cassandra、Memcached以及更多系统。随着支持的库越来越多,Storm更容易与现有的系统协作。

Storm的性能提升超过10倍。经在Twitter内部集群测试,单节点每秒完成100万条信息。

Storm团队正在积极地为推动Storm而努力。目前,团队正在开发一项监测功能,用于观察用户拓扑网络中的实时状态。Storm团队的另外一项庞大的计划用于提高Trident的性能,集成更多的数据存储输入源。2.Storm研究人员发展情况

Storm开源已经两年有余,在过去的两年中得到了飞速的发展,2012年就已经有27个公司宣布正在产品中使用Storm,现在使用Storm的公司的数量还在继续增加。2012年,Storm的邮件列表已有1300多个成员,每月超过500条信息;在GitHub上超过4000个项目负责人;同期Twitter@stormprocessor上的粉丝超过1200个;在旧金山,超过230名会员定期参加讨论活动。目前,世界各地有各种各样针对Storm的讨论活动和兴趣小组;在中国也有很多Storm相关的学习、讨论网站和社交兴趣组。

目前,除项目主管Nathan Marz,项目核心贡献者徐明明、P. Taylor Goetz、Mike Heffner、Jason Jackson、Andy Feng外,全球共有41名代码贡献者。有关Storm的图书已经出版,Amazon网站上的英文版Storm书籍已有十多本(其中包括O'Reilly出版的Storm图书),但目前尚未有中文版Storm书籍面世。3.Storm版本发展情况

Storm 0.7和Storm 0.8系列的版本已在各大公司得到了广泛使用。目前最新的版本是Storm0.9.0.1。

2013年12月,Storm 0.9.0成功发布。这个版本较之前版本新增的功能如下。● 消息通知机制变更:引入了使用纯Java语言编写的Netty作为我

们的传输层,也就是说消息通知机制支持Netty。这一特性是这

个版本最大的变化,也使得Storm具有更好的跨平台能力。● UI变更:支持Topology控制命令,支持查看Nimbus和Topology的

配置值,支持UI上查看各个work的日志。● 安全性增强:Storm的安全保障能力较弱,此版本在这方面有了

一定的加强——提供了API用来实现可插拔的Tuple序列化,并且

有一个基于BlowFish的加密算法用于加密Tuple的实现。

Storm在实现细节上不断地优化,使用很多优秀的开源产品,包括Kryo、Disruptor和Curator等。

可以想像,当Storm发展到1.0版本时,一定是一款无比杰出的产品,让我们拭目以待。1.6如何学习Storm

Storm官方建议的学习Storm的过程如下。1.Storm的基本知识● Javadoc文档● 概念● 配置● 保证消息处理(Guaranteeing message processing)● 容错(Fault-tolerance)● 命令行客户端(Command line client)● 理解Storm拓扑的并行度● 常见问题解答FAQ2.Trident

Trident是Storm的高层抽象,它提供了仅一次处理,“事务性”数据存储持久性和共同流集合的分析操作。3.安装和部署● 安装Storm集群● 本地模式● 故障排除● 在生产集群运行拓扑● 使用Maven或Leiningen创建Storm4.Storm的进阶知识● 序列化(Serialization)● 常见的模式(Common patterns)● Clojure DSL(Clojure DSL)● 使用非JVM语言与风暴(Using non-JVM languages with Storm)● 分布式RPC(Distributed RPC)● 事务拓扑(Transactional topologies)● Kestrel与Storm(Kestrel and Storm)● 直接分组(Direct groupings)● 钩子(Hooks)● 衡量指标(Metrics)● Trident元组的生命周期(Lifecycle of a trident tuple)5.Storm的高阶知识● 为Storm定义一个非JVM语言的DSL● 多语言协议(Multilang protocol):如何为另一种语言提供支持● 实现文档(Implementation docs)1.7本书的章节安排及学习建议1.7.1 本书的章节安排

本书一共20章,其中“基础知识”6章,“安装与部署”4章,“研发与维护”4章,“进阶知识”5章,“企业应用”1章。本书的章节安排如表1.2所示。表1.2 本书的章节安排1.7.2 关于如何阅读本书的建议1.为了调研Storm

建议优先阅读本书的首末两章,即“第1章 Storm简介”和“第20章 企业应用案例”,再阅读“第2章 Storm的基本知识”,也可以阅读完第1章到第6章“基础知识”模块的全部6个章节,最后阅读本书的其他章节。2.为了学习Storm的理论基础

建议优先阅读第1章到第6章“基础知识”模块的全部6个章节,然后阅读第15章到第19章“进阶知识”模块的全部5个章节,最后阅读本书的其他章节。3.为了学习Storm的应用实践

建议优先阅读第7章到第10章“安装与部署”模块的全部4个章节,然后阅读第11章到第14章“研发与维护”模块的全部4个章节,最后阅读本书的其他章节。

在开始相关章节的学习之前,请读者预先准备安装好如下的软硬件环境。(1)生产环境(集群环境)节点

建议使用64位的CentOS 6.0以上的英文版Linux操作系统。(2)开发环境(试验环境)主机

32位或者64位,Linux或者Windows操作系统都可以,无特殊要求。

但是,为了更好地与集群环境进行交互,建议使用64位的CentOS 6.0以上的Linux操作系统。1.8本章小结

本章简单介绍了Storm的基本概念,然后介绍Storm的起源、特征和优势。同时介绍了Storm的项目小组以及从何处可以获得Storm技术支持、技术讨论,以便于读者找到Storm的学习和源代码参考的网站。之后,本章还重点介绍了Storm的应用方向、使用Storm的企业和组织,以及Storm相关的项目,例如storm-starter、storm-deploy和storm-contrib等。在本章末尾给出了学习Storm的官方建议、本书的章节安排及学习建议。通过本章的学习,读者将对Storm有一个基本的了解。第2章Storm的基本知识

本章将学习Storm的基本知识,包括Storm的基本概念、配置、序列化、容错机制、可靠性机制、消息机制、开发环境与生产环境、并行度和命令行客户端等内容。2.1概念2.1.1 元组(Tuple)

元组(Tuple),是消息传递的基本单元,是一个命名的值列表,元组中的字段可以是任何类型的对象。Storm使用元组作为其数据模型,元组支持所有的基本类型、字符串和字节数组作为字段值,只要实现类型的序列化接口就可以使用该类型的对象。元组本来应该是一个key-value的Map,但是由于各个组件间传递的元组的字段名称已经事先定义好,所以只要按序把元组填入各个value即可,所以元组是一个value的List。

拓扑的每个节点必须声明emit(发射)的元组的输出字段。例如,下面的DoubleAndTripleBolt类在declareOutputFields方法中声明输出字段为["double", "triple"]二元组。 public class DoubleAndTripleBolt extends BaseRichBolt { private OutputCollectorBase _collector; @Override public void prepare(Map conf, TopologyContext context, OutputCollectorBase collector) { _collector = collector; } @Override public void execute(Tuple input) { int val = input.getInteger(0); _collector.emit(input, new Values(val*2, val*3)); _collector.ack(input); } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("double", "triple")); } }

首先,在declareOutputFields方法中声明了输出为["double","triple"]的二元组。接着,在prepare方法中把OutputCollectorBase对象赋给私有成员变量_collector。最后,使用_collector发射元组,输出元组是一个二元组,第1个值为原值的2倍,第2个值为原值的3倍,并使用_collector的ack方法,保证消息处理,提供可靠性机制。2.1.2 流(Stream)

流(Stream)是Storm的核心抽象,是一个无界的元组序列。源源不断传递的元组就组成了流,在分布式环境中并行地进行创建和处理。

流被定义成一个为流中元组字段进行命名的模式,默认情况下,元组可以包含整形(integer)、长整形(long)、短整形(short)、字节(byte)、字符(string)、双精度数(double)、浮点数(float)、布尔值(boolean)和字节数组(byte array),还可以自定义序列化器,以便本地元组可以使用自定义类型。

流由元组组成,使用OutputFieldsDeclarer声明流及其模式。Serialization是Storm的动态元组类型的信息,声明自定义序列化。自定义序列化必须实现ISerialization接口,自定义序列化可以注册使用CONFIG.TOPOLOGY_SERIALIZATIONS这个配置。

Storm提供可靠的方式把原语转换成一个新的分布式的流,执行流转换的基本元素是Spout和Bolt。

Spout是流的源头,通常从外部数据源读取元组,并emit到拓扑中。例如,Spout从Kestrel队列中读取元组,并作为一个流提交到拓扑。

Bolt接收任何数量的输入流,执行处理后,可能提交新的流。复杂流的转换,如从tweets流中计算一个热门话题,需要多个步骤,因此需要多个Bolt。Bolt可以执行运行函数、过滤元组、连接流和连接数据库等任何事情。

如图2.1所示,Spout和Bolt的网络被打包成一个“拓扑”,即顶级抽象,之后提交这个拓扑到Storm集群中执行。拓扑是一个图的流转换,节点表示Spout或Bolt,弧边指示哪些Bolt订阅了该流。当一个Spout或Bolt发射一个元组到一个流时,它会发射元组到每一个订阅该流的Bolt。

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载