Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区Storm实时数据分析平台第1课Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区关于本课程的预备知识Linux:懂基本操作Java:能看懂Java程序Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区参考书Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区参考书Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区实验环境与Hadoop课程类似三节点,可以使用虚拟机Linux,JVMStorm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区大数据平台知识路线图Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区课程目标部署:storm和zookeeper集群了解storm的架构和基本工作原理掌握storm的spout,bolts,topology等组件的组成和原理能书写基本的java程序运行storm的实例,懂得在本地模式下调试,开发topology和提交topology到storm集群应用Storm进行实时数据分析Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区实时流计算互联网从诞生的第一时间起,对世界的最大的改变就是让信息能够实时交互,从而大大加速了各个环节的效率。正因为大家对信息实时响应、实时交互的需求,软件行业除了个人操作系统之外,数据库(更精确的说是关系型数据库)应该是软件行业发展最快、收益最为丰厚的产品了。记得十年前,很多银行别说实时转账,连实时查询都做不到,但是数据库和高速网络改变了这个情况。随着互联网的更进一步发展,从Portal信息浏览型到Search信息搜索型到SNS关系交互传递型,以及电子商务、互联网旅游生活产品等将生活中的流通环节在线化。对效率的要求让大家对于实时性的要求进一步提升,而信息的交互和沟通正在从点对点往信息链甚至信息网的方向发展,这样必然带来数据在各个维度的交叉关联,数据爆炸已不可避免。因此流式处理加NoSQL产品应运而生,分别解决实时框架和数据大规模存储计算的问题。Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区流式处理场景:算法交易Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区流式处理场景:算法交易Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区关系型数据库不适合流式处理Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区实时流计算早在7、8年前诸如UC伯克利、斯坦福等大学就开始了对流式数据处理的研究,但是由于更多的关注于金融行业的业务场景或者互联网流量监控的业务场景,以及当时互联网数据场景的限制,造成了研究多是基于对传统数据库处理的流式化,对流式框架本身的研究偏少。目前这样的研究逐渐没有了声音,工业界更多的精力转向了实时数据库。2010年Yahoo!对S4的开源,2011年twitter对Storm的开源,改变了这个情况。以前互联网的开发人员在做一个实时应用的时候,除了要关注应用逻辑计算处理本身,还要为了数据的实时流转、交互、分布大伤脑筋。但是现在情况却大为不同,以Storm为例,开发人员可以快速的搭建一套健壮、易用的实时流处理框架,配合SQL产品或者NoSQL产品或者MapReduce计算平台,就可以低成本的做出很多以前很难想象的实时产品:比如一淘数据部的量子恒道品牌旗下的多个产品就是构建在实时流处理平台上的Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区Storm是什么如果只用一句话来描述storm的话,可能会是这样:分布式实时计算系统。按照storm作者的说法,storm对于实时计算的意义类似于hadoop对于批处理的意义。我们都知道,根据googlemapreduce来实现的hadoop为我们提供了map,reduce原语,使我们的批处理程序变得非常地简单和优美。同样,storm也为实时计算提供了一些简单优美的原语。我们会在第三节中详细介绍。我们来看一下storm的适用场景。1、流数据处理。Storm可以用来处理源源不断流进来的消息,处理之后将结果写入到某个存储中去。2、持续计算。连续发送数据到客户端,使它们能够实时更新并显示结果,如网站指标。3、分布式rpc。由于storm的处理组件是分布式的,而且处理延迟极低,所以可以作为一个通用的分布式rpc框架来使用。当然,其实我们的搜索引擎本身也是一个分布式rpc系统。Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区数据分析系统的组成客户端数据仓库并和计算系统批处理计算系统实时计算系统资源调度系统存储系统Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区一种流式处理软件架构图Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区流式处理和批处理Storm关注的是数据多次处理一次写入,而Hadoop关注的是数据一次写入,多次查询、使用。Strom系统运行起来后是持续不断的,而Hadoop往往只是在业务需要时调用数据Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区Storm和Hadoop对比HadoopStorm系统角色JobTrackerNimbusTaskTrackerSupervisorChildWorker应用名称JobTopology组件接口Mapper/ReducerSpout/BoltStorm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区Storm特点Storm是一个开源的分布式实时计算系统,可以简单、可靠的处理大量的数据流。Storm有很多使用场景:如实时分析,在线机器学习,持续计算,分布式RPC,ETL等等。Storm支持水平扩展,具有高容错性,保证每个消息都会得到处理,而且处理速度很快(在一个小集群中,每个结点每秒可以处理数以百万计的消息)。Storm的部署和运维都很便捷,而且更为重要的是可以使用任意编程语言来开发应用。Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区Storm特点Storm有如下特点:编程模型简单可扩展高可靠性高容错性支持多种编程语言Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区运行模式本地模式远程模式Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区Storm集群部署Storm集群架构:Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区组成Nimbus主节点:主节点通常运行一个后台程序——Nimbus,用于响应分布在集群中的节点,分配任务和监测故障。这个很类似于Hadoop中的JobTracker。Supervisor工作节点:工作节点同样会运行一个后台程序——Supervisor,用于收听工作指派并基于要求运行工作进程。每个工作节点都是topology中一个子集的实现。而Nimbus和Supervisor之间的协调则通过Zookeeper系统或者集群。ZookeeperZookeeper是完成Supervisor和Nimbus之间协调的服务。而应用程序实现实时的逻辑则被封装进Storm中的“topology”。topology则是一组由Spouts(数据源)和Bolts(数据操作)通过StreamGroupings进行连接的图。下面对出现的术语进行更深刻的解析。Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区Topology(拓扑)storm中运行的一个实时应用程序,因为各个组件间的消息流动形成逻辑上的一个拓扑结构。一个topology是spouts和bolts组成的图,通过streamgroupings将图中的spouts和bolts连接起来,如下图:Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区Topology(拓扑)一个topology会一直运行直到你手动kill掉,Storm自动重新分配执行失败的任务,并且Storm可以保证你不会有数据丢失(如果开启了高可靠性的话)。如果一些机器意外停机它上面的所有任务会被转移到其他机器上。运行一个topology很简单。首先,把你所有的代码以及所依赖的jar打进一个jar包。然后运行类似下面的这个命令:stormjarall-my-code.jarbacktype.storm.MyTopologyarg1arg2这个命令会运行主类:backtype.strom.MyTopology,参数是arg1,arg2。这个类的main函数定义这个topology并且把它提交给Nimbus。stormjar负责连接到Nimbus并且上传jar包。Topology的定义是一个Thrift结构,并且Nimbus就是一个Thrift服务,你可以提交由任何语言创建的topology。上面的方面是用JVM-based语言提交的最简单的方法。Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区Tuplestorm使用tuple来作为它的数据模型。每个tuple是一堆值,每个值有一个名字,并且每个值可以是任何类型,在我的理解里面一个tuple可以看作一个没有方法的java对象。总体来看,storm支持所有的基本类型、字符串以及字节数组作为tuple的值类型。你也可以使用你自己定义的类型来作为值类型,只要你实现对应的序列化器(serializer)。一个Tuple代表数据流中的一个基本的处理单元,例如一条cookie日志,它可以包含多个Field,每个Field表示一个属性。Tuple本来应该是一个Key-Value的Map,由于各个组件间传递的tuple的字段名称已经事先定义好了,所以Tuple只需要按序填入各个Value,所以就是一个ValueList。一个没有边界的、源源不断的、连续的Tuple序列就组成了Stream。Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区StreamStream是storm里面的关键抽象。一个stream是一个没有边界的tuple序列。storm提供一些原语来分布式地、可靠地把一个stream传输进一个新的stream。比如:你可以把一个tweets流传输到热门话题的流。storm提供的最基本的处理stream的原语是spout和bolt。你可以实现Spout和Bolt对应的接口以处理你的应用的逻辑Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区Spout消息源spout是Storm里面一个topology里面的消息生产者,简而言之,Spout从来源处读取数据并放入topology。spout是流的源头。比如一个spout可能从Kestrel队列里面读取消息并且把这些消息发射成一个流。又比如一个spout可以调用twitter的一个api并且把返回的tweets发射成一个流。通常Spout会从外部数据源(队列、数据库等)读取数据,然后封装成Tuple形式,之后发送到Stream中。Spout是一个主动的角色,在接口内部有个nextTuple函数,Storm框架会不停的调用该函数Storm实时数据分析平台讲师黄志洪吴仕灿DATAGURU专业数据分析社区BoltTopology中所有的处理都由Bolt完成。即所有的消息处理逻辑被封装在bolts里面。Bolt可以完成任何事,比如:连接的过滤、聚合、访问文件/数据库、等等。Bolt处理输入的Stream,并产生新的输出Stream。Bolt可以执行过滤、函数操作、Join、操作数据库等任何操作。Bolt是一个被动的角色