JStorm文档
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文档的更多相关文章
- C#给PDF文档添加文本和图片页眉
页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...
- dotNET跨平台相关文档整理
一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...
- ABP文档 - Javascript Api - AJAX
本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...
- ABP文档 - EntityFramework 集成
文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...
- ABP文档 - SignalR 集成
文档目录 本节内容: 简介 安装 服务端 客户端 连接确立 内置功能 通知 在线客户端 帕斯卡 vs 骆峰式 你的SignalR代码 简介 使用Abp.Web.SignalR nuget包,使基于应用 ...
- ABP文档 - 通知系统
文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发 ...
- ABP文档 - Hangfire 集成
文档目录 本节内容: 简介 集成 Hangfire 面板授权 简介 Hangfire是一个综合的后台作业管理器,可以在ABP里集成它替代默认的后台作业管理器,你可以为Hangfire使用相同的后台作业 ...
- ABP文档 - 后台作业和工作者
文档目录 本节内容: 简介 后台作业 关于作业持久化 创建一个后台作业 在队列里添加一个新作业 默认的后台作业管理器 后台作业存储 配置 禁用作业执行 Hangfire 集成 后台工作者 创建一个后台 ...
- ABP文档 - Javascript Api
文档目录 本节内容: AJAX Notification Message UI Block & Busy Event Bus Logging Other Utility Functions A ...
随机推荐
- RDM原始设备映射
在一个存储区域网络(SAN)上,有两种方法为虚拟机配置存储.一种方法是使用VMFS,这是VMware Infrastructure(VI)提供的专有高性能集群文件系统.对大多数企业应用来说,在VMFS ...
- HTTP Basic 机制
package com.enation.app.shop.component.payment.plugin.cod; import java.io.IOException; import java.u ...
- 解决hibernate向mysql插入中文乱码问题(更改MySQL字符集)
1.首先需要修改mysql数据库的配置文件my.ini,此文件放在mysql根目录下.在此文件下查找default-character-set属性,并将其值更改为utf8(注意:不是utf-8,也要注 ...
- sublime text常用快捷键及多行列模式批量操作教程
列模式 苹果:OS X -鼠标左键+Option -或者鼠标中键 -增加选择:Command,减少选择:Command+Shift 2 Windows: -鼠标右键+Shift -或者鼠标中键 -增加 ...
- poj 2187 Beauty Contest(二维凸包旋转卡壳)
D - Beauty Contest Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- 结构型设计模式之桥接模式(Bridge)
结构 意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 适用性 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换. ...
- [ CodeVS冲杯之路 ] P1501
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1501/ 水题一道 直接dfs,记录上当前深度,到了叶子节点就更新答案,并且每个节点将当前深度的计数+1,答案即为ma ...
- 关于"implicit declaration of function 'gettimeofday' is invalid in c99"的解决
http://blog.csdn.net/macmini/article/details/10503799 当我们使用 gettimeofday(&time, NULL);时,会出现这样一个W ...
- 非常好的博客!!!linux内存管理概述【转】
转自:http://blog.csdn.net/bullbat/article/details/7166140 inux内存管理建立在基本的分页机制基础上,在linux内核中RAM的某些部分将会永久的 ...
- SQL 并发-转
脏读.不可重复读 共享锁.悲观锁 和 事务五种隔离级别 一.脏读.不可重复读.幻读1.脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个 ...