一、定义

JStorm是一个分布式实时计算引擎,是一套基于流水线的消息处理机制。

用户按照指定的接口实现一个任务,然后将这个任务递交给JStorm系统,Jstorm将这个任务跑起来,并且按7 * 24小时运行起来,一旦中间一个worker 发生意外故障, 调度器立即分配一个新的worker替换这个失效的worker

二、应用场景

1日志分析

2管道系统, 将一个数据从一个系统传输到另外一个系统;

3消息转化器, 将接受到的消息按照某种格式进行转化,存储到另外一个系统如消息中间件;

4统计分析器, 从日志或消息中,提炼出某个字段,然后做countsum计算,最后将统计值存入外部存储器。中间处理过程可能更复杂。

三、基本概念

1、流(InputStream

是一个不间断的连续的tuple,JStorm里,通过nextTuple方法将数据流往下发射流出。

2Spout/Bolt

JStorm将每个stream的唯一stream源,抽象为一个spout,即原始元组的源头。然后通过此源头将数据封装为tuple发射给一个或多个Bolt

所以Bolt就是JStorm将数据的处理过程抽象为一个个节点,各bolt节点间互相接收和发射数据。

 

我们可以认为spout就是一个一个的水龙头,并且每个水龙头里流出的水是不同的,我们想拿到哪种水就拧开哪个水龙头,然后使用管道将水龙头的水导向到一个水处理器(bolt),水处理器处理后再使用管道导向另一个处理器或者存入容器中。

3Topology

Topology即拓扑(拓扑结构是有向无环的),拓扑是Jstorm中最高层次的一个抽象概念,它可以被提交到Jstorm集群执行,一个拓扑就是一个数据流转换图,图中每个节点是一个spout或者bolt

4Tuple

JStorm将流中数据抽象为tuple,一个tuple就是一个值列表,list中的每个value都有一个name,并且每个value的数据都是可序列化类型。

拓扑的每个节点spout/bolt都要说明它所发射出的元组的字段的name,其他节点只需要订阅该name就可以接收处理。

5Worker/Task

都是JStorm中任务的执行单元

 一个worker表示一个进程,一个task表示一个线程, 一个worker可以运行多个task

四、简单使用

//创建topology的生成器
TestBuilder builder = new TestBuilder(); 
//设置topology的所有配置信息
Config conf = new Config();
//表示整个topology将使用2worker
conf.put(Config.TOPOLOGY_WORKERS, 2);
//设置topolog模式为分布式,这样topology就可以放到JStorm集群上运行
conf.put(Config.STORM_CLUSTER_MODE, "distributed");
////创建Spout,名称为testSpout,执行类为TestSpout
builder.setSpout("testSpout", new TestSpout());
//创建Bolt,名称为testBolt,执行类为TestBolt,并发线程数为5,并且此5个线程接收testSpout输出的数据流
builder.setBolt("testBolt", new testBolt(), 5).shuffleGrouping("testSpout");
//集群,提交topology
StormSubmitter.submitTopology("testTopology", conf, builder.createTopology());
//本地,提交topology
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("test", conf, builder.createTopology());

注意:将jstorm项目放到集群后,每个Bolt会被集群中的服务器随机取出执行,因此Bolt相互之间无法公用一个实例。如果某一个Bolt缓存一个数据集,其它Bolt需要使用这个缓存里的数据集,不能通过取全局实例来获取,可以让缓存的数据集喷数据给其他Bolt

五、Spout类方法介绍


JStorm
 

六、Bolt类方法介绍


JStorm
 

七、JStorm优点

1开发非常迅速, 接口简单,容易上手,只要遵守TopologySpoutBolt的编程规范即可开发出一个扩展性极好的应用,底层rpcworker之间冗余,数据分流之类的动作完全不用考虑。

2扩展性极好, 当一级处理单元速度,直接配置一下并发数,即可线性扩展性能

3健壮, worker失效或机器出现故障时, 自动分配新的worker替换失效worker

4数据准确性, 可以采用Acker机制,保证数据不丢失。 如果对精度有更多一步要求,采用事务机制,保证数据准确。

八、与Strom相比

1JStormStorm更稳定,主要在内存的处理上,storm经常出现内存不够的情况。其次,JStorm新上线的任务不会冲击老的任务,新调度从cpumemorydisknet 四个角度对任务进行分配,已经分配好的新任务,无需去抢占老任务的cpumemorydisknet

2JStormStorm调度更强大

1彻底解决了storm 任务分配不均衡问题

2)从4个维度进行任务分配:CPUMemoryDiskNet

3)可以随时更多的申请cpu、内存、disk

4)可以强制某个componenttask 运行在不同的节点上

5)可以强制topology运行在单独一个节点上

6)可以自定义任务分配,提前预约任务分配到哪台机器上,哪个端口,多少个cpu slot,多少内存,是否申请磁盘

7)可以预约上一次成功运行时的任务分配,上次task分配了什么资源,这次还是使用这些资源

3JStormStorm性能更好

后续了解后再补充

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-07-28
  • 2021-05-27
  • 2022-02-16
  • 2022-02-05
  • 2021-05-09
  • 2021-12-10
猜你喜欢
  • 2021-08-17
  • 2021-12-07
  • 2021-09-04
  • 2022-12-23
  • 2021-07-12
  • 2021-09-28
相关资源
相似解决方案