storm 1.0新特性


参考:

     官方文档: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两个插件使开发更加简单,减省了开发成本和学习成本。所以是建议升级的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值