Jstorm的性能测试
JStorm 大概是Apache Storm 4倍, Apache Flink 1.5 倍, Twitter Heron 2 ~ 10 倍web
Jstorm是一个分布式实时计算引擎
Jstorm是一个相似Hadoop Mapreduce的系统。
7*24小时运行
其中一个worker发生失败,调度器当即分配一个新的worker替换这个失效的worker
从系统角度,JStorm相似MapReduce的调度系统
从数据角度,JStorm是一套基于流水线的消息处理机制算法
jstorm的优势:
一、扩展性好 (并发数设置)
二、健壮性 (worker失效后,worker会进行故障转移)
三、数据准确性 (Ack机制)
四、实时性高数据库
应用场景:
JStorm处理数据的方式是基于消息的流水线处理,特别适合无状态计算(计算单元的依赖的数据所有在接收的消息中找到),而且最好的是一个数据流不依赖另一个数据流
日志分析:从日志中分析出特定的数据,并将分析的结果存储到外部存储器例如数据库
管道系统:将一个数据从一个系统传输到另一个系统, 好比将数据库同步到Hadoop
消息转化器, 将接受到的消息按照某种格式进行转化,存储到另一个系统如消息中间件
统计分析器, 从日志或消息中,提炼出某个字段,而后作count或sum计算,最后将统计值存入外部存储器
实时推荐系统, 将推荐算法运行在jstorm中,达到秒级的推荐效果apache
JStorm架构
一个典型的调度系统
nimbus:做为调度器的角色
supervisor:做为worker的代理角色,负责杀死worker和运行worker
worker:task运行容器
task:真正任务的执行者
zk:整个系统中协调者api
Worker/Task
worker和task是jstorm中任务执行单元,一个worker表示一个进程,一个task表明一个线程,一个worker能够运行多个task
backtype.storm.Config.setNumWorkers(int workers)是设置worker数目,表示这个Topology运行在多个个jvm(一个jvm是一个进程,即一个worker);
backtype.storm.topology.TopologyBuilder.setSpout(String id, IRichSpout spout, Number parallelism_hint)和setBolt(String id, IRichBolt bolt,Number parallelism_hint)中的参数
parallelism_hint表示这个spout或bolt有多少个实例,即对应多少个线程执行,一个实例对应一个线程。
资源slot
在JStorm中,资源类型分为4种, CPU, Memory,Disk, Port, 再也不局限于Storm的port。
即一个supervisor能够提供多少个CPU slot,多少个Memory slot, 多少个Disk slot, 多少个Port slottomcat
一个worker就消耗一个Port slot, 默认一个task会消耗一个CPU slot和一个Memory slot
当task执行任务较重时,能够申请更多的CPU slot,
当task须要更多内存时,能够申请更多的内存slot,
当task 磁盘读写较多时,能够申请磁盘slot,则该磁盘slot给该task独享架构
注意点:并发
一、咱们默认是若是用户设置的worker数小于10个,那么__topology_master 只是做为一个task存在,不独占worker;
若是用户设置的worker数量大于等于10个,那么__topology_master做为一个task将独占一个worker运维
Jstorm集群维护jvm
一、总worker数
即总的进程数。举例来讲,我提交一个topology,指定worker数为3,那么最后可能会有3个进程在执行。之因此是可能,是由于根据配置,
JStorm有可能会添加内部的组件,如__acker或者__topology_master(这两个组件都是特殊的bolt),这样会致使最终执行的进程数大于用户指定的进程数。
咱们默认是若是用户设置的worker数小于10个,那么__topology_master 只是做为一个task存在,不独占worker;
若是用户设置的worker数量大于等于10个,那么__topology_master做为一个task将独占一个worker
二、配置$JSTORM_HOME/conf/storm.yaml
storm.zookeeper.root: 表示JStorm在zookeeper中的根目录,当多个JStorm共享一个zookeeper时,须要设置该选项,默认即为“/jstorm”
nimbus.host: 表示nimbus的地址, 填写ip
storm.local.dir: 表示JStorm临时数据存放目录,须要保证JStorm程序对该目录有写权限
三、关于kryo序列化
这要求传输的对象(及其全部非static及transient变量)须要有无参构造函数
四、修改pom.xml
<dependency> <groupId>com.alibaba.jstorm</groupId> <artifactId>jstorm-core</artifactId> <version>2.2.1</version> <!-- keep jstorm out of the jar-with-dependencies --> <!-- <scope>provided</scope> --> </dependency>
注意要注释掉jstorm依赖中的`<scope>provided</scope>`,**而提交的时候必须记得将这行改回来!** 不然会报多个`defaults.yaml`的错误。
五、问题:控制台没有任何输出
有几个缘由可能致使这个问题:
1.若是在2.2.0中依赖了slf4j-log4j12,会跟jstorm自带的log4j-over-slf4j冲突,须要将slf4j-log4j12排除掉。
2.确认你打的日志是用slf4j-api打的,即LoggerFactory而不是log4j的Logger
六、性能
按照性能来讲,
trident < transaction < 使用ack机制普通接口 < 关掉ack机制的普通接口
所以,首先要权衡一下应该选用什么方式来完成任务。
若是“使用ack机制普通接口”时, 能够尝试关掉ack机制,查看性能如何,若是性能有大幅提高,
则预示着瓶颈不在spout, 有多是Acker的并发少了,或者业务处理逻辑慢了
增长并发
能够简单增长并发,查看是否可以增长处理能力
七、运维经验总结 一、启动supervisor或nimbus最好是之后台方式启动, 避免终端退出时向jstorm发送信号,致使jstorm莫名其妙的退出 nohup jstorm supervisor 1>/dev/null 2>&1 & 二、推荐使用admin用户启动全部的程序, 尤为是不要用root用户启动web ui, 三、建立软连接 在安装目录下,建议使用jstorm-current连接, 好比当前使用版本是jstorm 0.9.4, 则建立连接指向jstorm-0.9.4, 当之后升级时, 只须要将jstorm-current连接指向新的jstorm版本。 ln -s jstorm-0.9.4 jstorm-current 四、将JStorm的本地目录和日志配置到一个公共目录下, 好比/home/admin/jstorm_data 和/home/admin/logs, 不要配置到$JSTORM_HOME/data和$JSTORM_HOME/logs,当升级时,替换整个目录时, 容易丢失全部的本地数据和日志。 五、建议不超过1个月,强制重启一下supervisor, 由于supervisor是一个daemon进程, 不停的建立子进程, 当使用时间过长时, 文件打开的句柄会很是多,致使启动worker的时间会变慢,所以,建议每隔一周,强制重启一次supervisor 六、JStorm web ui推荐使用apache tomcat 7.x, 默认的端口是8080, 若是须要将80 端口重定向到8080时, 能够用root执行命令: iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 七、Jvm GC 须要使用CMS GC 方式, JStorm默认已经设置, 使用Storm的朋友须要相似的设置, worker.childopts: "-Xms1g -Xmx1g -Xmn378m -XX:SurvivorRatio=2 -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=65" 八、对于一些重要的应用,能够对大集群进行分组, 修改配置文件的 “storm.zookeeper.root” 和 “nimbus.host” 九、对于应用使用ZK较频繁的,须要将JStorm的ZK 和应用的ZK 隔离起来,不混在一块儿使用 十、nimbus节点上建议不运行supervisor, 并建议把nimbus放置到ZK 所在的机器上运行 十一、推荐slot数为 ”CPU 核 - 1“, 假设24核CPU, 则slot为23 十二、配置cronjob,定时检查nimbus和supervisor,一旦进程死去,自动重启 1三、ZK 的maxClientCnxns=500 1四、Linux对外链接端口数限制,TCP client对外发起链接数达到28000左右时,就开始大量抛异常,须要 # echo "10000 65535" > /proc/sys/net/ipv4/ip_local_port_range 八、开发经验 推荐一个worker运行2个task