Jstorm的性能测试
JStorm 大概是Apache Storm 4倍, Apache Flink 1.5 倍, Twitter Heron 2 ~ 10 倍

Jstorm是一个分布式实时计算引擎
Jstorm是一个类似Hadoop Mapreduce的系统。
7*24小时运行
其中一个worker发生失败,调度器立即分配一个新的worker替换这个失效的worker
从系统角度,JStorm类似MapReduce的调度系统
从数据角度,JStorm是一套基于流水线的消息处理机制

jstorm的优点:
1、扩展性好 (并发数设置)
2、健壮性 (worker失效后,worker会进行故障转移)
3、数据准确性 (Ack机制)
4、实时性高

应用场景:
JStorm处理数据的方式是基于消息的流水线处理,特别适合无状态计算(计算单元的依赖的数据全部在接收的消息中找到),并且最好的是一个数据流不依赖另外一个数据流
日志分析:从日志中分析出特定的数据,并将分析的结果存储到外部存储器例如数据库
管道系统:将一个数据从一个系统传输到另外一个系统, 比如将数据库同步到Hadoop
消息转化器, 将接受到的消息按照某种格式进行转化,存储到另外一个系统如消息中间件
统计分析器, 从日志或消息中,提炼出某个字段,然后做count或sum计算,最后将统计值存入外部存储器
实时推荐系统, 将推荐算法运行在jstorm中,达到秒级的推荐效果

JStorm架构
一个典型的调度系统
nimbus:作为调度器的角色
supervisor:作为worker的代理角色,负责杀死worker和运行worker
worker:task运行容器
task:真正任务的执行者
zk:整个系统中协调者

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 slot

一个worker就消耗一个Port slot, 默认一个task会消耗一个CPU slot和一个Memory slot
当task执行任务较重时,可以申请更多的CPU slot,
当task需要更多内存时,可以申请更多的内存slot,
当task 磁盘读写较多时,可以申请磁盘slot,则该磁盘slot给该task独享

注意点:

1、我们默认是如果用户设置的worker数小于10个,那么__topology_master 只是作为一个task存在,不独占worker;
如果用户设置的worker数量大于等于10个,那么__topology_master作为一个task将独占一个worker

Jstorm集群维护

1、总worker数
即总的进程数。举例来说,我提交一个topology,指定worker数为3,那么最后可能会有3个进程在执行。之所以是可能,是因为根据配置,
JStorm有可能会添加内部的组件,如__acker或者__topology_master(这两个组件都是特殊的bolt),这样会导致最终执行的进程数大于用户指定的进程数。
我们默认是如果用户设置的worker数小于10个,那么__topology_master 只是作为一个task存在,不独占worker;
如果用户设置的worker数量大于等于10个,那么__topology_master作为一个task将独占一个worker

2、配置$JSTORM_HOME/conf/storm.yaml
storm.zookeeper.root: 表示JStorm在zookeeper中的根目录,当多个JStorm共享一个zookeeper时,需要设置该选项,默认即为“/jstorm”
nimbus.host: 表示nimbus的地址, 填写ip
storm.local.dir: 表示JStorm临时数据存放目录,需要保证JStorm程序对该目录有写权限

3、关于kryo序列化
这要求传输的对象(及其所有非static及transient变量)需要有无参构造函数

4、修改pom.xml

<dependency>
<groupId>com.alibaba.jstorm</groupId>
<artifactId>jstorm-core</artifactId>
<version>2.2.</version>
<!-- keep jstorm out of the jar-with-dependencies -->
<!-- <scope>provided</scope> -->
</dependency>

注意要注释掉jstorm依赖中的`<scope>provided</scope>`,**而提交的时候必须记得将这行改回来!** 否则会报多个`defaults.yaml`的错误。

5、问题:控制台没有任何输出
有几个原因可能导致这个问题:
1.如果在2.2.0中依赖了slf4j-log4j12,会跟jstorm自带的log4j-over-slf4j冲突,需要将slf4j-log4j12排除掉。
2.确认你打的日志是用slf4j-api打的,即LoggerFactory而不是log4j的Logger

6、性能
按照性能来说,
trident < transaction < 使用ack机制普通接口 < 关掉ack机制的普通接口
因此,首先要权衡一下应该选用什么方式来完成任务。
如果“使用ack机制普通接口”时, 可以尝试关掉ack机制,查看性能如何,如果性能有大幅提升,
则预示着瓶颈不在spout, 有可能是Acker的并发少了,或者业务处理逻辑慢了

增加并发
可以简单增加并发,查看是否能够增加处理能力

7、运维经验总结
1、启动supervisor或nimbus最好是以后台方式启动, 避免终端退出时向jstorm发送信号,导致jstorm莫名其妙的退出
nohup jstorm supervisor 1>/dev/null 2>&1 &
2、推荐使用admin用户启动所有的程序, 尤其是不要用root用户启动web ui,

3、创建软链接
在安装目录下,建议使用jstorm-current链接, 比如当前使用版本是jstorm 0.9.4, 则创建链接指向jstorm-0.9.4,
当以后升级时, 只需要将jstorm-current链接指向新的jstorm版本。
ln -s jstorm-0.9.4 jstorm-current

4、将JStorm的本地目录和日志配置到一个公共目录下, 比如/home/admin/jstorm_data 和/home/admin/logs,
不要配置到$JSTORM_HOME/data和$JSTORM_HOME/logs,当升级时,替换整个目录时, 容易丢失所有的本地数据和日志。

5、建议不超过1个月,强制重启一下supervisor, 因为supervisor是一个daemon进程, 不停的创建子进程,
当使用时间过长时, 文件打开的句柄会非常多,导致启动worker的时间会变慢,因此,建议每隔一周,强制重启一次supervisor

6、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

7、Jvm GC 需要使用CMS GC 方式, JStorm默认已经设置, 使用Storm的朋友需要类似的设置,
worker.childopts: "-Xms1g -Xmx1g -Xmn378m -XX:SurvivorRatio=2 -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=65"

8、对于一些重要的应用,可以对大集群进行分组, 修改配置文件的 “storm.zookeeper.root” 和 “nimbus.host”

9、对于应用使用ZK较频繁的,需要将JStorm的ZK 和应用的ZK 隔离起来,不混在一起使用

10、nimbus节点上建议不运行supervisor, 并建议把nimbus放置到ZK 所在的机器上运行

11、推荐slot数为 ”CPU 核 - 1“, 假设24核CPU, 则slot为23

12、配置cronjob,定时检查nimbus和supervisor,一旦进程死去,自动重启

13、ZK 的maxClientCnxns=500

14、Linux对外连接端口数限制,TCP client对外发起连接数达到28000左右时,就开始大量抛异常,需要
  # echo "10000 65535" > /proc/sys/net/ipv4/ip_local_port_range

8、开发经验
推荐一个worker运行2个task

JStorm文档的更多相关文章

  1. C#给PDF文档添加文本和图片页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...

  2. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  3. ABP文档 - Javascript Api - AJAX

    本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...

  4. ABP文档 - EntityFramework 集成

    文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...

  5. ABP文档 - SignalR 集成

    文档目录 本节内容: 简介 安装 服务端 客户端 连接确立 内置功能 通知 在线客户端 帕斯卡 vs 骆峰式 你的SignalR代码 简介 使用Abp.Web.SignalR nuget包,使基于应用 ...

  6. ABP文档 - 通知系统

    文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发 ...

  7. ABP文档 - Hangfire 集成

    文档目录 本节内容: 简介 集成 Hangfire 面板授权 简介 Hangfire是一个综合的后台作业管理器,可以在ABP里集成它替代默认的后台作业管理器,你可以为Hangfire使用相同的后台作业 ...

  8. ABP文档 - 后台作业和工作者

    文档目录 本节内容: 简介 后台作业 关于作业持久化 创建一个后台作业 在队列里添加一个新作业 默认的后台作业管理器 后台作业存储 配置 禁用作业执行 Hangfire 集成 后台工作者 创建一个后台 ...

  9. ABP文档 - Javascript Api

    文档目录 本节内容: AJAX Notification Message UI Block & Busy Event Bus Logging Other Utility Functions A ...

随机推荐

  1. 开源作品ThinkJDBC—一行代码搞定数据库操作

    1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...

  2. String中的“equal方法”和“==”

    二话不说,先来说下重写的事情: 在Java中,String .Math.还有Integer.Double....等这些封装类重写了Object中的equals()方法,让它不再比较其对象在内存中的地址 ...

  3. Visual Studio中的/MD, /MT, /MDd, /MTd 选项

    Visual Studio中/MD, /MT, /MDd, /MTd表示多线程模块是否为dll.对于这几个选项我的理解如下: /MD: 定义了_MT和_DLL,让程序用多线程和dll版本的运行库. / ...

  4. Linux下目录的权限详解

    在Linux文件系统模型中,每个文件都有一组9个权限位用来控制谁能够读写和执行该文件的内容.普通文件大家都了解,这里说说目录的情况. 对于目录来说,执行位的作用是控制能否进入或者通过该目录,而不是控制 ...

  5. 转:Java NIO

    Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.本系列教程将有助于你学习和理解Java NIO.感谢并发编程网的翻译和投递 ...

  6. java IO的字节流和字符流及其区别

    1. 字节流和字符流的概念    1.1 字节流继承于InputStream    OutputStream,    1.2 字符流继承于InputStreamReader    OutputStre ...

  7. 小Z爱划水(NOIP信(sang)心(bin)赛)From FallDream

    题目: 小Z在机房.他和其它机房同学都面临一个艰难的抉择,那就是 要不要划水? 每个人都有自己的一个意见,有的人想做题,有的人想划水. 当然,每个人只能选择一个事情做.如果一个人做的事情和他想做的不同 ...

  8. 戴文的Linux内核专题:03 驱动程序【转】

    转自:http://www.lai18.com/content/432194.html 驱动程序是使内核能够沟通和操作硬件或协议(规则和标准)的小程序.没有驱动程序,内核不知道如何与硬件沟通或者处理协 ...

  9. Kotlin来了

    kotlin优点(主要是代码简洁度) 1.避免空指针异常,其次在一个文件中java方法必须写在class里面,而kotlin则没要求 2.在同一个文件中,有class a则不允许在class外的方法( ...

  10. ros结合catkin_make和qtcreator

    首先是ros官网关于IDE的教程: http://wiki.ros.org/IDEs#QtCreator 1.qtcreator安装 从官网上下载.run文件, https://info.qt.io/ ...