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.1</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

 

posted @ 2018-01-06 15:53  一心行走  阅读(495)  评论(0编辑  收藏  举报