zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    MongoDB+Lucence.net
    hubble+sqlserver
    C# 设计模式 1 接口模式 1.1 适配器模式 IT
    SQLServer2005 中 XML类型方法中 XQuery中变量的参数化匆忙整理 IT
    DoNET 类库设计准则01 名称规则 IT
    GMRES在matlab中的描述
    矩阵良态与病态
    调试vc++的一点感悟
    基于GramSchmidt正交法的广义极小残量法(GMRES)
    VC6 vs2003 vs2005 使用技巧(转)
  • 原文地址:https://www.cnblogs.com/atomicbomb/p/8214450.html
Copyright © 2011-2022 走看看