Hadoop是大数据分析的明显王者,它专注于批处理。 该模型足以应付许多情况(例如对Web编制索引),但是存在其他使用模型,其中需要来自高度动态来源的实时信息。 解决了这个问题后,Nathan Marz引入了Storm(现在通过BackType通过Twitter引入)。 Storm不是在静态数据上运行,而是在预计会连续的流数据上运行。 Twitter用户每天产生1.4亿条推文,不难看出这项技术的用处。
但是,Storm不仅仅是一个传统的大数据分析系统:它是一个复杂的事件处理(CEP)系统的示例。 CEP系统通常分为面向计算和检测的类别,每个类别都可以通过用户定义的算法在Storm中实现。 例如,CEP可以用于从大量事件中识别有意义的事件,然后对这些事件实时采取措施。
Nathan Marz提供了许多在Twitter中使用Storm的示例。 最有趣的方法之一是趋势信息的生成。 Twitter从推文的消防水龙头中提取新兴趋势,并将其维持在地方和国家层面。 这意味着当故事开始出现时,Twitter的趋势主题算法会实时识别主题。 这种实时算法是在Storm中实现的,是对Twitter数据的连续分析。
风暴与传统大数据
Storm与其他大数据解决方案的不同之处在于它所解决的范例。 Hadoop从根本上说是一个批处理系统。 数据被引入到Hadoop文件系统(HDFS)中,并跨节点分布以进行处理。 处理完成后,结果数据将返回给HDFS,以供创建者使用。 Storm支持构建可转换未终结数据流的拓扑。 与Hadoop作业不同,这些转换永远不会停止,而是在数据到达时继续进行处理。
大数据实施
Hadoop的核心是用Java™语言编写的,但支持以多种语言编写的数据分析应用程序。 最近的进入者为实现其实现以利用现代语言及其功能走了更深奥的路线。 例如,加州大学伯克利分校的Spark是用Scala语言实现的,而Twitter Storm是用Clojure(发音为closure )实现的。
Clojure是Lisp语言的现代方言。 与Lisp一样,Clojure也支持编程的功能样式,但是Clojure还集成了简化多线程编程的功能(这是构建Storm的有用功能)。 Clojure是在Java虚拟机上运行的基于虚拟机(VM)的语言。 但是,即使Storm是用Clojure开发的,您也可以用几乎任何语言在Storm中编写应用程序。 只需一个适配器即可连接到Storm的体系结构。 存在用于Scala,JRuby,Perl和PHP的适配器,并且有一个结构化查询语言适配器,它支持流式传输到Storm拓扑。
风暴的关键属性
Storm实施了一组在性能和可靠性方面进行定义的特征。 Storm使用ZeroMQ进行消息传递,这消除了中间排队,并允许消息直接在任务本身之间流动。 消息传递的背后是一种自动有效的机制,用于对Storm的原始类型进行序列化和反序列化。
使Storm最有趣的是它对容错和管理的关注。 Storm实施有保证的消息处理,以使每个元组都可以通过拓扑完全处理。 如果发现未处理元组,则会从喷嘴自动重播它。 Storm还在任务级别实现故障检测,在任务级别,任务失败后,消息将自动重新分配以快速重新开始处理。 与Hadoop相比,Storm包括更智能的流程管理,而Hadoop由主管管理流程以确保充分利用资源。
风暴模型
Storm实现了一个数据流模型,在该模型中,数据连续流过转换实体网络(请参见图1 )。 数据流的抽象称为流,它是无限制的元组序列。 元组就像一个结构,可以表示标准数据类型(例如int,float和字节数组)或带有一些附加序列化代码的用户定义类型。 每个流由唯一的ID定义,该ID可用于构建数据源和接收器的拓扑。 流源自喷口,喷口将数据从外部源流到Storm拓扑中。
图1.一个简单的Storm拓扑的概念架构
接收器 (或提供转换的实体)称为螺栓。 螺栓在流上实现单个转换,并在Storm拓扑内实现所有处理。 螺栓可以实现传统的功能,例如MapReduce功能,或者实现更复杂的动作(单步功能),例如过滤,聚合或与外部实体(例如数据库)进行通信。 典型的Storm拓扑实现多次转换,因此需要具有独立元组流的多个螺栓。 喷嘴和螺栓都在Linux®系统中作为一项或多项任务实现。
您可以使用Storm轻松实现字词频率的MapReduce功能。 如图2所示,喷口生成文本数据流,而Bolt实现Map功能(以标记流中的单词)。 然后,来自“ map”螺栓的结果流流入单个螺栓,该螺栓实现了Reduce函数(将单词聚合为计数)。
图2. MapReduce函数的简单Storm拓扑
请注意,螺栓可以将数据流式传输到多个螺栓,也可以接受来自多个源的数据。 Storm具有流分组的概念,它实现了改组(随机但元组与螺栓的分布相等)或字段分组(基于流字段的流分区)。 存在其他流分组,包括生产者使用其自身内部逻辑路由元组的能力。
但是,Storm体系结构中最有趣的功能之一就是保证消息处理的概念。 Storm可以确保将处理喷头发出的每个元组; 如果未在某个超时时间内处理它,Storm将从喷口重播元组。 此功能需要一些巧妙的技巧来通过拓扑跟踪元组,这是Storm的主要增值之一。
除了支持可靠的消息传递外,Storm还使用ZeroMQ来最大化消息传递性能(删除中间队列并实现任务之间消息的直接传递)。 ZeroMQ合并了拥塞检测并更改了其通信以优化可用带宽。
通过示例风暴
现在,让我们看一个通过代码实现一个简单的MapReduce拓扑的Storm示例(参见清单1 )。 该示例使用了GitHub上Nathan的storm-starter工具包中构造良好的字数示例(请参阅参考资料中的链接)。 此示例说明了图2中所示的拓扑,该拓扑实现了由一个螺栓组成的映射变换和一个由单个螺栓组成的reduce变换。
清单1.在Storm中为图2构建拓扑
01 TopologyBuilder builder = new TopologyBuilder();
02
03 builder.setSpout("spout", new RandomSentenceSpout(), 5);
04
05 builder.setBolt("map", new SplitSentence(), 4)
06 .shuffleGrouping("spout");
07
08 builder.setBolt("reduce", new WordCount(), 8)
09 .fieldsGrouping("map", new Fields("word"));
10
11 Config conf = new Config();
12 conf.setDebug(true);
13
14 LocalCluster cluster = new LocalCluster();
15 cluster.submitTopology("word-count", conf, builder.createTopology());
16
17 Thread.sleep(10000);
18
19 cluster.shutdown();
清单1 (添加的行号供参考)从使用TopologyBuilder
声明新拓扑开始。 接着,在第3行,喷口被定义(名为spout
),它由一个的RandomSentenceSpout
。 RandomSentenceSpout
类(即nextTuple
方法)发出五个随机语句之一作为其数据。 setSpout
方法末尾的5
参数是并行提示(或为此活动创建的任务数)。
在第5行和第6行,我定义了第一个螺栓(或算法转换实体),在这种情况下,是地图(或拆分)螺栓。 该螺栓使用SplitSentence
标记输入流,并发出各个单词作为其输出。 请注意第6行使用shuffleGrouping
,它定义了此螺栓的输入订阅(在本例中为“ spout”),但流分组也定义为shuffle。 这种随机分组表示将对喷嘴的输入进行随机混合,或将其随机分配到此螺栓中的任务(提示为四任务并行)。
在第8行和第9行,我定义了最后一个螺栓,该螺栓有效地用作化简元件,其输入为映射螺栓。 WordCount
方法实现必要的单词计数行为(将单词组合在一起以保持总体计数),但不会混洗,因此其输出是一致的。 如果有多个任务执行reduce行为,那么最终将得到分段计数,而不是整体计数。
第11和12行创建和定义配置对象并启用Debug模式。 Config
类包含大量的配置可能性(请参阅参考资料中有关Storm类树的更多信息的链接)。
第14和15行创建了本地集群(在这种情况下,定义了本地模式的使用)。 我定义了本地集群的名称,配置对象和拓扑(通过builder
类的createTopology
元素检索)。
最后,在第17行,StormHibernate一段时间,然后在第19行关闭集群。请记住,Storm是一个连续的操作系统,因此任务可以存在相当长的时间,并在流中的新元组上运行他们已订阅。
您可以在storm-starter套件中了解有关此出奇的简单实现的更多信息,包括喷嘴和螺栓的详细信息。
使用风暴
内森·马兹(Nathan Marz)写了一套可读性强的文档,详细介绍了如何为集群和本地操作模式安装Storm。 本地模式允许使用Storm,而无需大型节点集群。 如果您需要在集群中使用Storm但缺少节点,则还可以在Amazon Elastic Compute Cloud(EC2)中实现Storm集群。 请参阅相关的主题为每个风暴模式(本地,集群和Amazon EC2)的参考。
其他开源大数据解决方案
自Google在2004年推出MapReduce范式以来,出现了几种使用(或具有质量)原始MapReduce范式的解决方案。 Google的MapReduce原始应用程序是为万维网建立索引的。 尽管此应用程序仍然很流行,但是此简单模型解决的问题正在增长。
表1列出了可用的开源大数据解决方案,包括传统的批处理和流应用程序。 在将Storm引入开源之前将近一年,Yahoo!的S4分布式流计算平台已开源到Apache。 S4于2010年10月发布,它提供了一个高性能计算(HPC)平台,向应用程序开发人员隐藏了并行处理的复杂性。 S4实现了可扩展的分散式集群体系结构,并结合了部分容错能力。
表1.开源大数据解决方案
解 | 开发者 | 类型 | 描述 |
---|---|---|---|
风暴 | 推特 | 流媒体 | Twitter的新流式大数据分析解决方案 |
S4 | 雅虎! | 流媒体 | Yahoo!的分布式流计算平台 |
Hadoop的 | 阿帕奇 | 批量 | MapReduce范例的第一个开源实现 |
火花 | 加州大学伯克利分校 | 批量 | 支持内存数据集和弹性的最新分析平台 |
迪斯科 | 诺基亚 | 批量 | 诺基亚的分布式MapReduce框架 |
高性能计算中心 | LexisNexis | 批量 | 适用于大数据的HPC集群 |
向前走
尽管Hadoop仍然是最受关注的大数据分析解决方案,但存在许多其他可能性,每种可能性具有不同的特征。 我在过去的文章中探讨了Spark,它结合了数据集的内存功能(具有重建丢失的数据的功能)。 但是Hadoop和Spark都专注于大数据集的批处理。 Storm为大数据分析提供了一种新模型,并且由于它是最近开源的,因此引起了极大的兴趣。
与Hadoop不同,Storm是一种计算系统,不包含任何存储概念。 无论数据是从非传统来源动态到达还是存储在诸如数据库之类的存储系统中(或由控制器消耗以实时操纵某些其他设备(例如存储在服务器上),Storm都可以在各种情况下使用Storm)交易系统)。
请参阅相关信息的链接,在风暴的更多信息,如何获得一个集群启动和运行,以及其他大数据分析解决方案(批处理和流媒体)。
翻译自: https://www.ibm.com/developerworks/java/library/os-twitterstorm/index.html