jstorm学习总结

整体架构

jstorm是基于内存的计算,实时性远优于MapReduce。

从应用的角度,jstorm应用是一种遵循某种编程规范的分布式应用。
从系统的角度,jstorm是一套类似MapReduce的调度系统。
从数据的角度,是一套基于流水线的消息处理机制

jstorm处理数据都是基于流水线式的处理,所以比较适合无状态计算,无状态的意思是单个计算单元(spout/bolt)所依赖的数据都可以在本单元获得,应用场景包括:

日志分析:logagent收集日志,存入消息中间件,jstorm拉取消息中间件,分析处理,计算结果放入queue供前端拉取,另一部分写入ELK供查询

管道系统:将数据从一个系统传输到另一个系统,比如数据库转到mr。

消息转化器:logagent收集,存入queue,jstorm转化。

统计分析器:类似wordcount。

DRPC:实时性高,分布式远程过程调用。

逻辑概念

stream

是一个不间断的无界的连续tuple。

tuple

流中的数据被抽象为tuple,拓扑中的节点要声明发射数据的name,接收节点可以根据name获取数据

spout

stream的源头,连接消息中间件或者其他源。

bolt

bolt是stream中间处理过程的抽象,接收spout/bolt数据,处理完发送给下一个bolt或结束。

topology

spout和bolt之间的订阅关系,可以得到一张有向无环图。

stream grouping

规定了tuple的发送方式:

  shuffle:轮训方式发送;
  field : 指定字段发送,相同字段会发送到同一个bolt中。
  AllGroup: 同一个tuple会发给每一个订阅者。
  DirectGroup:直接分组,消息的发送指定消息的接收。
  GlobalGroup:tuple分配给task id 最低的task
  localOrShuffleGrouping:本地的worker里有相应task,则随机在本地选择,如果没有则shuffle

物理概念

nimbus:

管理作业资料,处理用户请求,资源分配,任务调度,failover

supervisor:

守护进程,负责运行或者关闭worker。

worker

worker是运行在supervisor节点上,实际干活的进程。topology运行多个worker,每个worker承担部分任务。

task

jstorm的执行单元,一个task对应一个线程,task各节点进行group。

slot

cpu的资源分为四种:cpu,memory,disk,port, 一个worker消费一个port,一个task消费一个cpu slot和memory slot

receiver

task内部线程:反序列化queue中的数据,并放入queue中。

executor ###:

该queue对于executor可见。

transfer ###:

根据接收方是否在同一个worker:决定emit的数据要不要不序列化。不在一个worker,则序列化,网络发送
worker之间数据传输采用netty通信。

批处理:按时间或者数量进行cache,批量处理

Disruptor

解决多线程之间传递数据,比如receive和executor之间。

经典解决方案是,BlockingQueue来put和take。阻塞访问。

Disruptor采用RingBuffer设施来协调多线程共享数据。
高性能的原因:lazySet 保证可见,stores-store barrier。

acker机制

保证数据的处理完整性,
spout发送完,发送一条acker消息给acker线程,每个bolt处理完都要acker下,发送一个异或值给acker。当acker线程收到所有的acker值后,把所有值
发送给spout,spout根据所有acker值进行求异或,如果为0则所有几点都处理完。

问题1:

jstorm processlaucher 
在执行 system.out.println 阻塞****
解决办法:
应为properties太长,注释掉

问题2:

log4j 与 log4j-over-slf4j

解决办法:
冲突 用exclude-jars 排掉冲突jar log4j-over-slf4j

wget http://10.4.65.35:8080/hdpSoftware/rocketmq-mysql-pack.tar.gz

jstorm jar rocketmqToDiamond-1.0-SNAPSHOT-jar-online com.lenovo.arcloud.jstorm.DiamondTopology