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