参考:
官方文档:https://storm.apache.org/releases/1.0.0/
性能提升:与先前的版本相比,处理速度增加, 延迟减少.性能提升10倍以上,延迟减少60%。Storm 1.0的性能最高提升了16倍,在大多数情况下预计都会有3倍的性能提升。性能的重大改善来自下面的更改:
在SpoutOutputCollector.emit()调用中使用Java重新实现了Clojure reduce函数;
在DisruptorQueue中引入批处理,代替spout层的批处理,这以增加延迟为代价大幅提升了吞吐量。
Pacemaker:一个处理工作进程心跳的心跳守护进程,它常驻内存,提供了比ZooKeeper更好的性能;减少了通过zookeeper保持心跳的瓶颈. 通过in-memory store这些数据,具体参考:https://storm.apache.org/releases/1.0.1/Pacemaker.html;
分布式缓存及相关API:支持在命令行更改缓存内容.不需要重启拓扑。这对于当前将资源文件包含在拓扑jar包中的做法是一种改进,这种做法更新文件时需要重新部署;
HA Nimbus:之前版本中nimbus是单点的,新版本可以启动多个nimbus service,选择leader;
流窗口API:新增窗口定义支持,这些窗口可以应用于数据处理,比如在最后一个小时里计算最热门的话题。以前,开发人员必须构建自己的窗口逻辑,具体参考:http://storm.apache.org/releases/1.0.0/Windowing.html
自动反压:当任务缓冲区的大小达到了指定的限制(以百分比表示),Storm就会自动降低拓扑spouts的速度;之前版本中,通过设置topology.max.spout.pending来设置最大等待队列.新版本中通过设置task的缓冲区的百分比大小进行限流.当缓冲区达到设置的警戒线的高值时,会降低spout的发送速度.当缓冲区大小达到设置的警戒线的低值时,会取消缓冲区;
资源调度:可以设置拓扑的spout/bolt内存(on-heap和off-heap)和CPU,具体参考:http://storm.apache.org/releases/1.0.0/Resource_Aware_Scheduler_overview.html
动态工作进程性能分析:旨在让用户可以从Storm UI获取工作进程性能数据,比如堆转储文件、JStack输出
bolt的状态管理: 继承BaseStatefulBolt ,在bolt失败时recover.
动态调整log级别:支持动态的修改日志等级,不必在停机修改了,相当于热加载
Tuple抽样以及调试:Storm UI提供了Tuple抽样的功能,这样你就可以知道数据的一个实际流转情况,解决了拓扑难以调试的难题。
分布式日志查询:可以在storm ui 中对单个拓扑的日志进行全部的查找,即查找所以的supervisor日志.
动态的Worker配置:在storm ui 中可以请求worker的Heap dump,Jstack output,JProfile Recording.
相比storm 0.9.2,1.0.0版本提供了两个插件,一个是flux,一个是sql,比较方便开发。
flux官方文档:https://storm.apache.org/releases/1.0.0/flux.html
flux中文资料:http://blog.csdn.net/u013291394/article/details/50814042
sql官方文档:http://storm.apache.org/releases/1.0.0/storm-sql.html
flux:主要目的是为了方便拓扑的开发与部署,除了使用Java代码,还可以使用Yaml来动态定义拓扑。容易配置和部署拓扑(包括Storm和Trident)支持变更已存在的拓扑通过YAML文件来定义Spouts和Bolts,甚至可以支持Storm的其他组件,如storm-kafka/storm-hdfs/storm-hbase等容易支持多语言协议组件方便在不同环境中切换。
下面为使用YAML DSL构建 wordcount topology的示例:
name: "yaml-topology"config:
topology.workers: 1# spout definitionsspouts:
- id: "spout-1"
className: "org.apache.storm.testing.TestWordSpout"
parallelism: 1# bolt definitionsbolts:
- id: "bolt-1"
className: "org.apache.storm.testing.TestWordCounter"
parallelism: 1
- id: "bolt-2"
className: "org.apache.storm.flux.wrappers.bolts.LogInfoBolt"
parallelism: 1#stream definitionsstreams:
- name: "spout-1 --> bolt-1" # name isn't used (placeholder for logging, UI, etc.)
from: "spout-1"
to: "bolt-1"
grouping:
type: FIELDS
args: ["word"]
- name: "bolt-1 --> bolt2"
from: "bolt-1"
to: "bolt-2"
grouping:
type: SHUFFLE
发布运行 Flux Topology
在有了jar文件和YAML文件后就可以通过以下的命令运行Flux拓扑了,其中myTopology-0.1.0-SNAPSHOT.jar是打包后的jar文件,org.apache.storm.flux.Flux是Flux的入口类,--local表示是在本地运行拓扑,my_config.yaml使YAML配置文件:
storm jar myTopology-0.1.0-SNAPSHOT.jar org.apache.storm.flux.Flux --local my_config.yaml
Flux虽然可以加方便拓扑的修改与部署,但这仍然不支持动态的修改拓扑结构,在修改拓扑时仍要中断并重启。不过现在在开发中的几个特性有望改善这个情况。
sql:类Spark streaming的流批处理工具
执行方法:
Run the storm sql command to compile SQL statements into Trident topology, and submit it to the Storm cluster
$ bin/storm sql <sql-file> <topo-name>
StormSQL需要建立外部表,建表语法遵循Hive DDL.
CREATE EXTERNAL TABLE table_name field_list
[ STORED AS
INPUTFORMAT input_format_classname
OUTPUTFORMAT output_format_classname
]
LOCATION location
[ TBLPROPERTIES tbl_properties ]
[ AS select_stmt ]
建表示例:
CREATE EXTERNAL TABLE FOO (ID INT PRIMARY KEY) LOCATION 'kafka://localhost:2181/brokers?topic=test' TBLPROPERTIES '{"producer":{"bootstrap.servers":"localhost:9092","acks":"1","key.serializer":"org.apache.org.apache.storm.kafka.IntSerializer","value.serializer":"org.apache.org.apache.storm.kafka.ByteBufferSerializer"}}'
过滤kafka数据示例(从topic=orders输入,输出到topic=large_orders,收录订单中总价大于50的订单):
CREATE EXTERNAL TABLE ORDERS (ID INT PRIMARY KEY, UNIT_PRICE INT, QUANTITY INT) LOCATION 'kafka://localhost:2181/brokers?topic=orders' TBLPROPERTIES '{"producer":{"bootstrap.servers":"localhost:9092","acks":"1","key.serializer":"org.apache.org.apache.storm.kafka.IntSerializer","value.serializer":"org.apache.org.apache.storm.kafka.ByteBufferSerializer"}}'
CREATE EXTERNAL TABLE LARGE_ORDERS (ID INT PRIMARY KEY, TOTAL INT) LOCATION 'kafka://localhost:2181/brokers?topic=large_orders' TBLPROPERTIES '{"producer":{"bootstrap.servers":"localhost:9092","acks":"1","key.serializer":"org.apache.org.apache.storm.kafka.IntSerializer","value.serializer":"org.apache.org.apache.storm.kafka.ByteBufferSerializer"}}'
INSERT INTO LARGE_ORDERS SELECT ID, UNIT_PRICE * QUANTITY AS TOTAL FROM ORDERS WHERE UNIT_PRICE * QUANTITY > 50
然后提交这个拓扑:
$ bin/storm sql order_filtering.sql order_filtering
就可以在 Storm UI 中查看到order_filtering这个拓扑的信息了。
Storm SQL的内部实现原理:https://storm.apache.org/releases/1.0.0/storm-sql-internal.html
总结:
总体来说,相比0.9.2版本 Storm 1.0.x版本性能表现更优异,并且提供了Tuple抽样以及调试,分布式日志查询功能,以后查询日志更加方便。开发拓扑项目Java接口基本没有变化,老项目更新jar包应该就能直接使用。
提供的flux和sql两个插件使开发更加简单,减省了开发成本和学习成本。所以是建议升级的。