jstorm是基于内存的计算,实时性远优于MapReduce。
从应用的角度,jstorm应用是一种遵循某种编程规范的分布式应用。从系统的角度,jstorm是一套类似MapReduce的调度系统。从数据的角度,是一套基于流水线的消息处理机制jstorm处理数据都是基于流水线式的处理,所以比较适合无状态计算,无状态的意思是单个计算单元(spout/bolt)所依赖的数据都可以在本单元获得,应用场景包括:
日志分析:logagent收集日志,存入消息中间件,jstorm拉取消息中间件,分析处理,计算结果放入queue供前端拉取,另一部分写入ELK供查询
tuple
流中的数据被抽象为tuple,拓扑中的节点要声明发射数据的name,接收节点可以根据name获取数据
spoutstream的源头,连接消息中间件或者其他源。
bolt是stream中间处理过程的抽象,接收spout/bolt数据,处理完发送给下一个bolt或结束。
topologyspout和bolt之间的订阅关系,可以得到一张有向无环图。
stream grouping规定了tuple的发送方式:
shuffle:轮训方式发送; field : 指定字段发送,相同字段会发送到同一个bolt中。 AllGroup: 同一个tuple会发给每一个订阅者。 DirectGroup:直接分组,消息的发送指定消息的接收。 GlobalGroup:tuple分配给task id 最低的task localOrShuffleGrouping:本地的worker里有相应task,则随机在本地选择,如果没有则shufflenimbus:
管理作业资料,处理用户请求,资源分配,任务调度,failover
supervisor:守护进程,负责运行或者关闭worker。
workerworker是运行在supervisor节点上,实际干活的进程。topology运行多个worker,每个worker承担部分任务。
jstorm的执行单元,一个task对应一个线程,task各节点进行group。
cpu的资源分为四种:cpu,memory,disk,port, 一个worker消费一个port,一个task消费一个cpu slot和memory slot
receivertask内部线程:反序列化queue中的数据,并放入queue中。
executor ###:该queue对于executor可见。
transfer ###:根据接收方是否在同一个worker:决定emit的数据要不要不序列化。不在一个worker,则序列化,网络发送
worker之间数据传输采用netty通信。
批处理:按时间或者数量进行cache,批量处理
Disruptor解决多线程之间传递数据,比如receive和executor之间。
经典解决方案是,BlockingQueue来put和take。阻塞访问。
Disruptor采用RingBuffer设施来协调多线程共享数据。
高性能的原因:lazySet 保证可见,stores-store barrier。
保证数据的处理完整性,
spout发送完,发送一条acker消息给acker线程,每个bolt处理完都要acker下,发送一个异或值给acker。当acker线程收到所有的acker值后,把所有值
发送给spout,spout根据所有acker值进行求异或,如果为0则所有几点都处理完。
jstorm processlaucher 在执行 system.out.println 阻塞****解决办法:应为properties太长,注释掉
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