Storm_cn
文档
官网
github
github-2
维基百科
中文
中文-2
概念
为什么要用storm? more
- Storm是一个免费,开源的分布式实时计算系统。
- Storm有很多使用场景:实时分析,在线机器学习,持续计算,分布式RPC,ETL工具等。
- Storm很快:基准测试计时显示,每个节点每秒处理超过一百万个tuple数据。
- 它是高可用的,高容错的,保证你的数据得到处理,并且很容易设置和操作。
Topologies more
- 实时应用的逻辑被封装成topology。
- 一个topology和一个MapReduce job类似。唯一的不同点就是一个MapReduce job最终会结束,然而一个topology会永远运行(当然,直到你kill了它)。
- 一个topology是一个通过stream groupings连接的spouts和bolts的图表。
Topologies -> TopologyBuilder more
TopologyBuilder公开了Java API,用于具体描述一个topology,用于Storm执行。Topologies最终是Thrift结构,但是基于Thrift API如此冗长,TopologyBuilder极大的简化了创建topologies的过程。创建和提交一个topology的模版如下:
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("1", new TestWordSpout(true), 5);
builder.setSpout("2", new TestWordSpout(true), 3);
builder.setBolt("3", new TestWordCounter(), 3)
.fieldsGrouping("1", new Fields("word"))
.fieldsGrouping("2", new Fields("word"));
builder.setBolt("4", new TestGlobalCount())
.globalGrouping("1");
Map conf = new HashMap();
conf.put(Config.TOPOLOGY_WORKERS, 4);
StormSubmitter.submitTopology("mytopology", conf, builder.createTopology());
用本地模式运行相同的topology,将它配置为记录所有发出的tuples,如下。注意让topology运行10秒钟再关闭。
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("1", new TestWordSpout(true), 5);
builder.setSpout("2", new TestWordSpout(true), 3);
builder.setBolt("3", new TestWordCounter(), 3)
.fieldsGrouping("1", new Fields("word"))
.fieldsGrouping("2", new Fields("word"));
builder.setBolt("4", new TestGlobalCount())
.globalGrouping("1");
Map conf = new HashMap();
conf.put(Config.TOPOLOGY_WORKERS, 4);
conf.put(Config.TOPOLOGY_DEBUG, true);
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("mytopology", conf, builder.createTopology());
Utils.sleep(10000);
cluster.shutdown();
Streams more
- Stream是Storm的一个核心抽象概念。一个Stream是一系列无界的tuples序列,它用一种分布式的并行的方式处理或创建的。
- Streams定义了一个模式,该模式命名了tuples的字段,tuples包含intergers,longs,shorts,bytes,strings,doubles,floats,booleans和byte数组。你也可以定义你自己的序列化,以便自定义类似用于tuples的本地。
- 每个流被声明的时候都被赋予一个id。鉴于单个spouts和bolts的流如此常见,OutputFieldsDeclarer有一个简单的方法用于声明单个stream,而不需要特别指定id。在这种情况下,stream的默认id为"default".
Streams -> Tuple more
- tuple是Storm的主要数据结构。一个tuple是一个被命名的值的列表,每个值可以是任何类型。tuples是动态类型的 - 字段的类型不需要指定。typles有一些有用的方法比如getInteger,getString,用于获取字段的值,而无需转换结果。
- Storm需要指导如何序列化一个tuple里的所有值。默认情况下,Storm指导如何序列化原始的类型,string,byte数组。如果你想要使用其他类型,你需要为那个类型实现并注册一个序列化。
Streams -> Serialization more
Spouts more
- 一个spout是在topology里的streams的一个源。通常spouts会从外部源读取tuples然后将它们发射到topology里(例如,Kestrel队列或者Twitter API)。
- Spouts可以是可靠的或者不可靠的。如果tuple被Storm处理失败,一个可靠的spout能够响应,然后不可靠的spout会在它发射之后忽略它。
- Spouts可以发射超过一个stream。为了实现这个,使用OutputFieldsDeclarer的declareStream方法声明多个streams,然后在使用SpoutOutputCollector的emit方法时,特别指定要发射的stream。
- spouts的主要方法是nextTuple。nextTuple可以发射一个新tuple到topology,或者在没有新tuple发射的时候简单返回。有一点很重要,nextTuple方法在任何spout的实现中都不要阻塞,因为Storm在同一个线程上调用所有的spout方法。
- spouts的另一个主要方法是ack和fail。当Storm检测到一个从spout发射的tuple被topology成功处理或者处理失败的时候,它们会被调用。ack和fail只会被可靠的spouts调用。
Spouts -> ISpout more
Spouts -> IRichSpout more
Spouts -> Guaranteeing Message Processing more
Bolts more
- topologies的所有处理都在bolts中完成。bolts可以任何事,如过滤,处理,聚合,joins,和数据库交互等等。
- Bolts可以做简单的stream转换。做复杂的stream转换通常需要很多步骤和很多bolts。例如,将一条推特转换为趋势图像至少需要两步:一个bolt用于滚动计数,一个或多个bolts用于退出顶部X图像(你可以通过用三个bolts来实现一个更稳定的stream转换)。
- Bolts可以发射超过一个stream。为了实现这个,为了实现这个,使用OutputFieldsDeclarer的declareStream方法声明多个streams,然后在使用SpoutOutputCollector的emit方法时,特别指定要发射的stream.