标签:
开篇:实时计算是针对海量数据计算,主要是弥补hadoop等框架只能进行离线批处理的不足。实时计算不一定要精确到秒级,个人理解是相对于离线的一种范称吧。主要应用场景有:
1) 数据源是不断产生的,服务端要不断处理接收的数据,同时回馈给客户端。 Storm是基于流的处理框架。以将发送的tuple序列化,进行分发到相应处理端中。数据流在时间和数量上是无限的,这种数据时不断产生的,比如用户的访问历史,点击历史,搜索信息等等。 2) 处理器是循环等待消息的,消息一来即处理数据,进而得出结果。当上传topology时,相应的spout和bolt就一直在运行,除非你显示停止任务。 一个topology 计算模型:
数据流模型: 在storm中数据流其实就是无界的tuple元组数组。Spout是数据产生器,emit数据给相应的bolt,bolt可以接受任意多的stream作为输入,然后进行处理,bolt可以继续emit到相应的bolt或者spout。 Storm提供了若干数据流分发策略(StreamGrouping),来处理发射出去的流的去向问题,具体可以看storm的文档。也可以自定义分发策略,方法是继承CustomStreamGrouping接口,实现chooseTasks方法。 何为实时计算呢,可以分为三个阶段:实时数据采集、实时计算、实时服务。 实时采集主要体现在及时响应、低延迟等特点。主要框架有chakwa、kafaka、TimeTunnel等。 实时计算框架有Yahoo开源的S4、Twitter开源的Storm,还有Esper,Streambase,HStreaming等 实时服务,发布服务或者实时dump数据。 其实这三个阶段没有明显的界限。 缺陷: Storm还是有一些缺陷的,比如数据只能在之前订制好的topology里的spout和bolt之间进行传输,不能跨topology传输。当有新的业务需求的时候,往往要么重新写个topology,或者在原有的topology上添加新的处理组件。前者很容易造成重复开发和数据重复,而且浪费资源。后者在数据共用上处理不好,很容易造成数据重复处理的问题。现阶段一般的解决方案是在topology上添加一层消息中间件作为数据分发层,每个头topology都共享这个消息源。 storm集群主件: Storm 数据流模型: 1. 搭建篇: 机器环境: Ubuntu 12.10+virtualbox(两个ubuntu12.04server); 开发模式: Storm开发模式有两种,一种是本地模式,一种是远程模式(集群模式)。本地模式主要是将topology提交到你的本机上模拟集群环境,这样便于调试。集群模式要将topology提交到你的远端集群。 准备: 搭建zookeeper环境,具体过程详见官网手册。 搭建完成后通过bin/zkServer.sh脚本启动Zookeeper服务。 安装Storm依赖库: ZeroMQ 2.1.7 JZMQ Java 6 Python 2.6.6 Unzip 下载后编译安装ZMQ: wget http://download.zeromq.org/zeromq-2.1.7.tar.gz tar -xzf zeromq-2.1.7.tar.gz cd zeromq-2.1.7 ./configure make sudo make install 下载后编译安装JZMQ: git clone https://github.com/nathanmarz/jzmq.git cd jzmq ./autogen.sh ./configure make sudo make install 下载并解压Storm发布版本 1. 下载Storm发行版本, Storm0.8.1: wget https://github.com/downloads/nathanmarz/storm/storm-0.8.1.zip 2. 解压到安装目录下: unzip storm-0.8.1.zip 2.1 修改storm.yaml配置文件 Storm发行版本解压目录下有一个conf/storm.yaml文件,用于配置Storm。默认配置在这里可以查看。conf/storm.yaml中的配置选项将覆盖defaults.yaml中的默认配置。以下配置选项是必须在conf/storm.yaml中进行配置的: 1) storm.zookeeper.servers: Storm集群使用的Zookeeper集群地址,其格式如下: storm.zookeeper.servers: -"ip1" -"ip2" //这里ip1 与 ip2是指先前搭建zookeeper集群中各个机器的ip。 如果Zookeeper集群使用的不是默认端口,那么还需要storm.zookeeper.port选项。 2) storm.local.dir: Nimbus和Supervisor进程用于存储少量状态,需要提前创建该目录并给以足够的访问权限。然后在storm.yaml中配置该目录,如: storm.local.dir: "/home/fang/storm/workdir" 这个目录里的文件对于以后集群的运行十分重要,往往每当你打开ui时出现路由错误,就是因为你之前关闭storm不正确引起的,解决方法就是关闭所有storm和zookeeper,然后将这个目录下的数据全部删除,再重启storn即可。 3) java.library.path: Storm使用的本地库(ZMQ和JZMQ)加载路径,默认为"/usr/local/lib:/opt/local/lib:/usr/lib",一般来说ZMQ和JZMQ默认安装在/usr/local/lib下,因此不需要配置即可。 4) nimbus.host: Storm集群Nimbus机器地址,各个Supervisor工作节点需要知道哪个机器是Nimbus,以便下载Topologies的jars、confs等文件,如: nimbus.host: "主机ip" 5) supervisor.slots.ports: 对于每个Supervisor工作节点,需要配置该工作节点可以运行的worker数量。每个worker占用一个单独的端口用于接收消息,该配置选项即用于定义哪些端口是可被worker使用的。默认情况下,每个节点上可运行4个workers,分别在6700、6701、6702和6703端口,如: supervisor.slots.ports: -6700 -6701 -6702 - 6703 启动: 1) 进入各个机器的zookeeper/bin目录下,运行./zkServer.shstart。启动zookeeper。 2) 在主机上, 运行./storm nimbus&; 3) 在worker机上,与西宁./stormsupervisor &; 4) 可以通过在主机运行./stormui &查看统计报告。 更多精彩内容请关注:http://bbs.superwu.cn 关注超人学院微信二维码: |
标签:
原文地址:http://www.cnblogs.com/CRXY/p/4503762.html