环境配置:
在每个节点上操作:
1、下载,解压,配置环境变量。
2、依赖安装
3、修改storm.yaml
启动zookeeper。
启动nimbus。
启动若干supervisor。
启动ui。
序列化:0.6版本以后变化大。
使用kyro序列化。
处理的字段类型是动态的。
事务的概念:每个流要有唯一id,第一次执行成功,再一次执行会跳过。保证只执行一次。
配置文件优先级:
defaults.yaml <storm.yaml < topology specific configuration < internal componentspecific configuration < external component specific configuration
Storm uses modhashing to map a spout tuple id to an acker task
Acker = map(tuple id,[task id,ack val])
There are three waysto remove reliability. The first is to set Config.TOPOLOGY_ACKERS to 0
Youcan turn off tracking for an individual spout tuple by omitting a message id intheSpoutOutputCollector.emit method
you canemit them as unanchored tuples
worker死掉,supervisor会重启它,多次重启失败,nimbus会把worker指定到另一台机器。
正在运行的topology可以用客户端命令改变并行度:
storm rebalancemytopology -n 5 -e blue-spout=3 -e yellow-bolt=10
也可以在ui改。
DRPC:
分布式并行计算,把输入流当做函数的参数,把函数执行结果当做输出流发出。
客户端给DRPC服务器发送要执行的方法的名字,以及这个方法的参数。实现了这个函数的topology使用DRPCSpout从DRPC服务器接收函数调用流。每个函数调用被DRPC服务器标记了一个唯一的id。这个topology然后计算结果,在topology的最后一个叫做ReturnResults的bolt会连接到DRPC服务器,并且把这个调用的结果发送给DRPC服务器(通过那个唯一的id标识)。DRPC服务器用那个唯一id来跟等待的客户端匹配上,唤醒这个客户端并且把结果发送给它。
LinearDRPCTopologyBuilder的工作原理
(过期类,现在使用trident)
DRPCSpout发射tuple: [args, return-info]。return-info包含DRPC服务器的主机地址,端口以及当前请求的request-id
DRPC Topology包含以下元素:
DRPCSpout
PrepareRequest(生成request-id, return info以及args)
CoordinatedBolt
JoinResult-- 组合结果和return info
ReturnResult-- 连接到DRPC服务器并且返回结果
LinearDRPCTopologyBuilder是利用storm的原语来构建高层抽象的很好的例子。
Trident has joins,aggregations, grouping, functions, and filters.
数据库或其它持久存储的增量处理。
输入源可以是FixedBatchSpout,也可以是 Kestrel 或 Kafka,zk保存了输入源的元数据信息。
特性:fault-tolerant, exactly-once ,所以可以用来更新数据库等存储系统。
persistentAggregate(new MemoryMapState.Factory(), new Count(), newFields("count")) //放入内存,可以选择放入其他持久库,github上有很多实现了的state,例如:trident-memcached,trident-redis等。
Trident在处理输入stream的时候会把输入转换成若干个tuple的batch来处理。我们在task节点利用trident进行持久化操作时的效率应该是可以的。利用TridentState ,通过DRPC,可以进行持久化数据的查询。存和取的过程都是批处理的形式。并且聚合操作有类似mapreduce中combiner 的优化。
trident会翻译成高效的storm topology。
Trident提供了下面的语义来实现有且只有一次被处理的目标。
Tuples 是被分成小的集合被批量处理的 (see the tutorial)
每一批tuples被给定一个唯一ID作为事务ID (txid). 当这一批tuple被重播时, txid不变.
批与批之间的状态更新时严格顺序的。比如说第三批tuple的状态的更新必须要等到第二批tuple的状态更新成功之后才可以进行.