??xml version="1.0" encoding="utf-8" standalone="yes"?> 分布计算pȝ框架Q按照数据集的特Ҏ_主要分ؓdata-flow和streaming两种。data-flow主要是以数据块ؓ数据源来处理数据Q代表有QMR、Spark{,我称作它们ؓ大数据,而streaming主要是处理单位内得到的数据,q种方式Q更注重于实时性,主要包括Strom、JStorm和Samza{,我称作它们ؓ快数据?/p> 在这文章中Q我主要谈论streaming相关的框架?/p> W一个是StormQ一个实时计系l,它假定数据源是动态的Q可以向水一样处理数据?/p> 它的特点是:低gq、高性能、分布式、可扩展和容错性?/p> 架构如下图所C?/p> Storm的具体概念可以参照:http://blog.csdn.net/hljlzc2007/article/details/12976211Q这里不做具体介l?/p> Storm目前是最最E_的开源流式处理框Ӟ但是个h认ؓ它有两个问题?/p> 1. Storm虽然支持多个语言~写spout和bolt端的代码Q但是它的主要技术实现是clojureQ这l玩大数据、开源的朋友带来了极大的不变Q因为大家会的语a不是以java和C++{大众语aZQ这L话,变得不可控了Q难以深入了解、修改其l节?/p> 2. Storm可以支持在Yarn(Hadoop 2.0)上,可以和其他开源框架共享Hadoop集群的资源,但是性能不佳Q这个有待Storm改善 当然无论如何QStorm依然是目前开源流式处理框架的王者?/p> W二个我惌的是JStormQ这个是阉K做的Q算是Storm的另一个实玎ͼ它用的语a是Java. 特点Q?/p> 1. 客户端的API与Storm基本上是一致的Q如果从Stormq移q来Q不需要修改bolt和spout的代?/p> 2. Jstrom比StromE_Q速度更快 3. 提供了一些新的特?/p> 大家有兴可以去玩玩Q项目地址https://github.com/alibaba/jstorm W三个是Samza Samza是由LinkedIn开源的一个技术,它是一个开源的分布式流处理pȝQ非常类gStorm。不同的是它q行在Hadoop之上Qƈ且用了自己开发的Kafka分布式消息处理系l?/p> q是Linkin开发的一个小而美的项目,如何呢Q?/p> 1. 只有几千行代码,完成的功能就可以和Storm媲美Q当然目前还有很多的不 2. 和Kafkal合紧密Q更方便的处理数?/p> 3. q行在Yarn?/p> 之前我做q的一个项目,是Kafka + Storm + ElasticSearchQ将来完全可以将Storm替换成SamzaQ这L话,q可以利用Hadoop集群的资源,做一些存储、离U分析的功能。将实时处理和离U分析都q行在Hadoop上,不得不说Samza是一个伟大的目Q这样可以减项目的增长复杂度,利于l护Q还是那句话Q小而美的东西,更受Ƣ迎一些?/p> 架构Q?/p> Samza主要包含三层Q?/p> 1. 处理层 --> Kafka 2. 执行? --> YARN 3. 处理? --> Samza API Samza的流处理层和执行层都是可插拔式的Q开发h员可以用其他框架来替代Q不局限于上述两种技术?/p> Samza提供了一个YARN ApplicationMasterQ和YARN jobQ运行在集群之外Q下图中不同颜色代表不同的主机?/p> Samza客户端告诉YARN的Resouce ManagerQ它惛_动一个Samza jobQ?YARN RM 告诉YARN Node managerQ分配空间给YARN ApplicationMasterQNM指定完空间后QYARN container会运行Samza Task Runner?/p> Samza状态管?/p> 式处理数据对状态的理是很隄Q由于数据是动的,本n没有状态,q样需要靠历史数据来记录应用的场合QSamza提供了一个内部的key-value数据库,它是ZLevelDBQ运行的JVM之外的,使用它来存储历史数据。这L做的好处是: 1. 减少JVM的开销 2. 使用内部存储Q极大提高的吞吐?/p> 3. 减少q发操作 Samza处理程. 下图是Samza官方l的一例子Q根据Member ID分组Q计页面访问次数。入口消息分别来自Machine1?Q出口是Machine3Q我们可以这L解,消息分散在不同的消息pȝ中(KafkaQ,Samza从不同的Kafka中读取topicQ在topicq行处理后,发送到Machine3Q这里不做过多分解,具体可以参照官方文档?/p> 目地址Q?a target="_blank" style="color: #336699; text-decoration: none;">https://github.com/apache/incubator-samza 官方文gQ?a target="_blank" style="color: #336699; text-decoration: none;">http://samza.incubator.apache.org/ 以上l了我们无限遐想QStorm是否会保持领先地位,Samza能否取而代之呢Q无论如何,作ؓ开发者来_几千行代码,我都q不及待去要M下了?/p>
2. In-memory Analytics : Apache Spark
3. Search Analytics : Apache Elastic search, SOLR
4. Log Analytics : Apache ELK Stack,ESK Stack(Elastic Search, Log
Stash, Spark Streaming, Kibana)
5. Batch Analytics : Apache MapReduce
***** NO SQL DB *****
1. MongoDB
2. Hbase
3. Cassandra
***** SOA *****
1. Oracle SOA
2. JBoss SOA
3. TiBco SOA
4. SOAP, RESTful Webservices
]]>
使用Nimbus获取STORM的信?br />http://www.andys-sundaypink.com/i/retrieve-storm-cluster-statistic-from-nimbus-java-mode/
TFramedTransport tTransport = new TFramedTransport(tsocket);
TBinaryProtocol tBinaryProtocol = new TBinaryProtocol(tTransport);
Nimbus.Client client = new Nimbus.Client(tBinaryProtocol);
String topologyId = "test-1-234232567";
try {
tTransport.open();
ClusterSummary clusterSummary = client.getClusterInfo();
StormTopology stormTopology = client.getTopology(topologyId);
TopologyInfo topologyInfo = client.getTopologyInfo(topologyId);
List<ExecutorSummary> executorSummaries = topologyInfo.get_executors();
List<TopologySummary> topologies = clusterSummary.get_topologies();
for(ExecutorSummary executorSummary : executorSummaries){
String id = executorSummary.get_component_id();
ExecutorInfo executorInfo = executorSummary.get_executor_info();
ExecutorStats executorStats = executorSummary.get_stats();
System.out.println("executorSummary :: " + id + " emit size :: " + executorStats.get_emitted_size());
}
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
e.printStackTrace();
} catch (NotAliveException e) {
e.printStackTrace();
}
]]>
处理的方式有各种自定义:
如果要处理某U消息了Q要怎么办呢Q?br />
当一个TOPOLOGY被部|到STORMӞSTORM会查N|对象的WORKER数量Q根据这个数量相应的启动N个JVMQ然后根据每个步骤配|的NUMTASKS生成相应个数的线E,然后每个步骤中配|的数量实例化相应个数的对象Q然后就启动一个线E不断的执行SPOUT中的nextTuple()ҎQ如果这个方法中有输出结果,启动另一U程Qƈ在此U程中将q个l果作ؓ参数传到下一个对象的excueҎ中?br />
如果此时又有一个步骤BOLT需要执行的话,也是新取一个线E去执行BOLT中的Ҏ启动的线E不会越qNUMTASKS的数量?br />
]]>
setNumWorkers
) specifies how many processes you want allocated around the cluster to execute the topology. Each component in the topology will execute as many threads. The number of threads allocated to a given component is configured through the setBolt
and setSpout
methods. Those threadsexist within worker processes. Each worker process contains within it some number of threads for some number of components. For instance, you may have 300 threads specified across all your components and 50 worker processes specified in your config. Each worker process will execute 6 threads, each of which of could belong to a different component. You tune the performance of Storm topologies by tweaking the parallelism for each component and the number of worker processes those threads should run within.setDebug
), when set to true, tells Storm to log every message every emitted by a component. This is useful in local mode when testing topologies, but you probably want to keep this turned off when running topologies on the cluster.There's many other configurations you can set for the topology. The various configurations are detailed on the Javadoc for Config.
There are a variety of configurations you can set per topology. A list of all the configurations you can set can be found here. The ones prefixed with "TOPOLOGY" can be overridden on a topology-specific basis (the other ones are cluster configurations and cannot be overridden). Here are some common ones that are set for a topology: