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

  • 相关阅读:
    771. Jewels and Stones
    706. Design HashMap
    811. Subdomain Visit Count
    733. Flood Fill
    117. Populating Next Right Pointers in Each Node II
    250. Count Univalue Subtrees
    94. Binary Tree Inorder Traversal
    116. Populating Next Right Pointers in Each Node
    285. Inorder Successor in BST
    292. Nim Game Java Solutin
  • 原文地址:https://www.cnblogs.com/atomicbomb/p/8214450.html
Copyright © 2011-2022 走看看