Storm集群搭建

1. Storm介绍

1.1 storm 初见

Storm是一个开源的分布式实时计算框架,最初是由Twitter开发的,现在是Apache的顶级项目之一。
Storm适用于处理潜在无限的流式数据。Storm之与实时数据计算相当于Hadoop之与批处理。

1.2 storm的特点

Storm的主要特点如下:
简单的编程模型:类似于MapReduce降低了并行批处理复杂性,Storm降低了进行实时处理的复杂性。
容错性:Storm会管理工作进程和节点的故障。
水平扩展:计算是在多个线程、进程和服务器之间并行进行的。
可靠的消息处理:Storm保证每个消息至少能得到一次完整处理。任务失败时,它会负责从消息源重试消息。
快速:系统的设计保证了消息能得到快速的处理,使用ØMQ作为其底层消息队列。
多语言支持:你可以在Storm之上使用各种编程语言。默认支持Clojure、Java、Ruby和Python,要增加对其他语言的支持,只需实现一个简单的Storm通信协议即可

1.3 storm 的适用场景

Storm适用于以下场景:
1) 信息流处理(Stream Processing)
Storm可以用来实时处理新数据和更新数据库,兼具容错性和可扩展性。
2) 连续计算(Continuous Computation)
Storm可以进行连续查询并把结果即时反馈给客户,比如将Twitter上的热门话题发送到客户端。
3) 分布式远程过程调用(Distributed RPC)
Storm可以用来并行处理密集查询,Storm的拓扑结构(后文会介绍)是一个等待调用信息的分布函数,当它收到一条调用信息后,会对查询进行计算,并返回查询结果。

1.4 storm 的基本概念

Streams:消息流stream是storm里的关键抽象。一个消息流是一个没有边界的tuple序列, 而这些tuple序列会以一种分布式的方式并行地创建和处理。通过对stream中tuple序列中每个字段命名来定义stream。在默认的情况下,tuple的字段类型可以是:integer,long,short, byte,string,double,float,boolean和byte array。你也可以自定义类型(只要实现相应的序列化器)。
Spout:Storm中的消息源,用于为Topology生产消息(数据),一般是从外部数据源(如Message Queue、RDBMS、NoSQL、Realtime Log)不间断地读取数据并发送给Topology消息(tuple元组)。
Spout类里面最重要的方法是nextTuple。要么发射一个新的tuple到topology里面或者简单的返回如果已经没有新的tuple。要注意的是nextTuple方法不能阻塞,因为storm在同一个线程上面调用所有消息源spout的方法。另外两个比较重要的spout方法是ack和fail。storm在检测到一个tuple被整个topology成功处理的时候调用ack,否则调用fail。storm只对可靠的spout调用ack和fail。
Bolt:Storm中的消息处理者,用于为Topology进行消息的处理,Bolt可以执行过滤, 聚合, 查询数据库等操作,而且可以一级一级的进行处理。比如算出一堆图片里面被转发最多的图片就至少需要两步:第一步算出每个图片的转发数量。第二步找出转发最多的前10个图片。(如果要把这个过程做得更具有扩展性那么可能需要更多的步骤)。
Bolts的主要方法是execute, 它以一个tuple作为输入,bolts使用OutputCollector来发射tuple,bolts必须要为它处理的每一个tuple调用OutputCollector的ack方法,以通知Storm这个tuple被处理完成了,从而通知这个tuple的发射者spouts。定义一个topology的其中一步是定义每个bolt接收什么样的流作为输入。stream grouping就是用来定义一个stream应该如果分配数据给bolts上面的多个tasks。
Stream groupings:定义一个topology的其中一步是定义每个bolt接收什么样的流作为输入。stream grouping就是用来定义一个stream应该如果分配数据给bolts上面的多个tasks。
Shuffle Grouping: 随机分组, 随机派发stream里面的tuple,保证每个bolt接收到的tuple数目大致相同。
Fields Grouping:按字段分组, 比如按userid来分组, 具有同样userid的tuple会被分到相同的Bolts里的一个task, 而不同的userid则会被分配到不同的bolts里的task。
All Grouping:广播发送,对于每一个tuple,所有的bolts都会收到。
Global Grouping:全局分组, 这个tuple被分配到storm中的一个bolt的其中一个task。再具体一点就是分配给id值最低的那个task。
Non Grouping:不分组,这个分组的意思是说stream不关心到底谁会收到它的tuple。目前这种分组和Shuffle grouping是一样的效果, 有一点不同的是storm会把这个bolt放到这个bolt的订阅者同一个线程里面去执行。
Direct Grouping: 直接分组, 这是一种比较特别的分组方法,用这种分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。 只有被声明为Direct Stream的消息流可以声明这种分组方法。而且这种消息tuple必须使用emitDirect方法来发射。消息处理者可以通过TopologyContext来获取处理它的消息的task的id (OutputCollector.emit方法也会返回task的id)。
Local or shuffle grouping:如果目标bolt有一个或者多个task在同一个工作进程中,tuple将会被随机发生给这些tasks。否则,和普通的ShuffleGrouping行为一致。
Tasks:每一个spout和bolt会被当作很多task在整个集群里执行。每一个executor对应到一个线程,在这个线程上运行多个task,而stream grouping则是定义怎么从一堆task发射tuple到另外一堆task。你可以调用TopologyBuilder类的setSpout和setBolt来设置并行度(也就是有多少个task)。
Workers:一个topology可能会在一个或者多个worker(工作进程)里面执行,每个worker是一个物理JVM并且执行整个topology的一部分。比如,对于并行度是300的topology来说,如果我们使用50个工作进程来执行,那么每个工作进程会处理其中的6个tasks。Storm会尽量均匀的工作分配给所有的worker。
1.5 Storm与Hadoop 对比

2. Storm集群部署

2.2安装配置zookeeper

Storm使用Zookeeper协调集群,由于Zookeeper并不用于消息传递,所以Storm给Zookeeper带来的压力相当低。对于Zookeeper集群的话,官方推荐的最小节点数为3个。
在Zookeeper集群的每台机器上完成以下安装部署步骤:
tar -xf zookeeper-3.4.5.tar.gz
将zookeeper-3.4.5/conf目录下的zoo_sample.cfg文件拷贝一份,命名为为“zoo.cfg”
修改zoo.cfg配置文件

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/home/hadooptest/zookeeper-3.4.3/zookeeperdir/zookeeper-data
dataLogDir=/home/hadooptest/zookeeper-3.4.3/zookeeperdir/logs

# the port at which the clients will connect
clientPort=2181
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

# 2888,3888 are election port
server.1=zookeeper:2888:3888

其中,2888端口号是zookeeper服务之间通信的端口,而3888是zookeeper与其他应用程序通信的端口。而zookeeper是在hosts中已映射了本机的ip。initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒。syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是2*2000=4 秒。
server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
创建dataDir参数指定的目录/home/storm/zookeeper/data,并在该目录下创建文件,命名为“myid”的文件。
编辑“myid”文件,并在对应的IP的机器上输入对应的编号。如在zookeeper上,“myid”文件内容就是1。若还有其他服务器,比如地址为192.168.1.102,则在zoo.cfg文件中还需加入server.2=192.168.1.102:2888:3888。那么myid文件在192.168.1.102服务器上的内容就是2。如果是多服务器配置,就需要将zookeeper-3.4.5目录拷贝到其他服务器,然后按照上述的方法修改myid。在/etc/profile文件中设置PATH,修改profile文件

sudo vi /etc/profile

export ZOOKEEPER_HOME=/home/storm/zookeeper-3.4.5
PATH=$ZOOKEEPER_HOME/bin:$PATH
export PATH

启动

1、在所有服务器中执行:zookeeper-3.4.5/bin/zkServer.sh start
2、输入jps命令查看进程:
namenode上显示为
2245 QuorumPeerMain
其中,QuorumPeerMain是zookeeper进程,启动正常。(HMaster和HRegionServer为已启动的hbase进程,其他为安装hadoop后启动的进程)
3、查看状态:zookeeper-3.4.5/bin/zkServer.sh status

JMX enabled by default
Using config: /home/hadooptest/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follwer

2.3 安装Storm依赖库

2.3.1 安装zeromq

 (http://zeromq.org/area:download)
http://download.zeromq.org/zeromq-2.1.7.tar.gz
tar -zxvf zeromq-2.1.7.gz
yum install uuidd
yum install e2fsprogs e2fsprogs-devel
yum install libuuid-devel
./configure
make
sudo make install

2.3.2 安装 jzmq

https://github.com/nathanmarz/jzmq
download zip
yum install pkconfig libtool
unzip jzmq-master.zip
cd jzmq-master
./autogen.sh 
 ./configure 
make 
 make install

2.4 安装Storm

http://storm.apache.org/downloads.html
tar xvf storm-x.tar.gz
cd storm-x

修改配置文件 conf/storm.yaml

storm.zookeeper.servers:
     - "master"
# 
nimbus.host: "master"
#ui.port: "9090"
storm.local.dir: "/var/storm"

2.5 启动Storm

主节点

./bin/storm  nimbus &  nimbus 进程
./bin/storm  ui &      UI界面进程
或者
Bin/storm   nimbus  </dev/null 2<&1 &
Bin/storm   supervisor  </dev/null 2<&1 &
Bin/storm ui </dev/null  2<&1 &

从节点

./bin/storm supervisor & supervisor 进程

访问 http://192.168.159.129:8080/index.html 查看ui
执行jps

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值