07-storm

来源:互联网 发布:竞价优化 编辑:程序博客网 时间:2024/06/06 20:20

特点
低延迟、高可用、分布式、可扩展、数据不丢失。提供简单容易理解的接口,便于开发。

场景

  • 日志分析
    从海量日志中分析出特定的数据,并将分析的结果存入外部存储器用来辅佐决策。
  • 管道系统
    将一个数据从一个系统传输到另外一个系统,比如将数据库同步到Hadoop
  • 消息转化器
    将接受到的消息按照某种格式进行转化,存储到另外一个系统如消息中间件

案列

  • 一淘-实时分析系统
    实时分析用户的属性,并反馈给搜索引擎
    最初,用户属性分析是通过每天在云梯上定时运行的MR job来完成的。为了满足实时性的要求,希望能够实时分析用户的行为日志,将最新的用户属性反馈给搜索引擎,能够为用户展现最贴近其当前需求的结果。
  • 携程-网站性能监控
    实时分析系统监控携程网的网站性能
    利用HTML5提供的performance标准获得可用的指标,并记录日志。Storm集群实时分析日志和入库。使用DRPC聚合成报表,通过历史数据对比等判断规则,触发预警事件。
  • 阿里妈妈-用户画像
    实时计算用户的兴趣数据
    为了更加精准投放广告,阿里妈妈后台计算引擎需要维护每个用户的兴趣点(理想状态是,你对什么感兴趣,就向你投放哪类广告)。用户兴趣主要基于用户的历史行为、用户的实时查询、用户的实时点击、用户的地理信息而得,其中实时查询、实时点击等用户行为都是实时数据。考虑到系统的实时性,阿里妈妈使用Storm维护用户兴趣数据,并在此基础上进行受众定向的广告投放。

Topology
Storm中运行的一个实时应用程序的名称。(拓扑)

Spout
在一个topology中获取源数据流的组件。
通常情况下spout会从外部数据源中读取数据,然后转换为topology内部的源数据。

Bolt
接受数据然后执行处理的组件,用户可以在其中执行自己想要的操作。

Tuple
一次消息传递的基本单元,理解为一组消息就是一个Tuple。

常用操作命令

提交任务
storm jar 【jar路径】 【拓扑包名.拓扑类名】 【拓扑名称】

bin/storm jar examples/storm-starter/storm-starter-topologies-0.9.6.jar storm.starter.WordCountTopology wordcount

杀死任务
storm kill 【拓扑名称】 -w 10(执行kill命令时可以通过-w [等待秒数]指定拓扑停用以后的等待时间)

storm kill topology-name -w 10

停用任务
storm deactivte 【拓扑名称】

storm deactivte topology-name

我们能够挂起或停用运行中的拓扑。当停用拓扑时,所有已分发的元组都会得到处理,但是spouts的nextTuple方法不会被调用。
销毁一个拓扑,可以使用kill命令。它会以一种安全的方式销毁一个拓扑,首先停用拓扑,在等待拓扑消息的时间段内允许拓扑完成当前的数据流。

启用任务
storm activate【拓扑名称】

storm activate topology-name

重新部署任务
storm rebalance 【拓扑名称】

        storm rebalance topology-name

再平衡使你重分配集群任务。这是个很强大的命令。比如,你向一个运行中的集群增加了节点。
再平衡命令将会停用拓扑,然后在相应超时时间之后重分配工人,并重启拓扑。

Storm里面有7种类型的stream grouping

  • Shuffle Grouping
    随机分组, 随机派发stream里面的tuple,保证每个bolt接收到的tuple数目大致相同。
  • Fields Grouping
    按字段分组,比如按userid来分组,具有同样userid的tuple会被分到相同的Bolts里的一个task,而不同的userid则会被分配到不同的bolts里的task。
  • All Grouping
    广播发送,对于每一个tuple,所有的bolts都会收到。
  • Global Grouping
    全局分组, 这个tuple被分配到storm中的一个bolt的其中一个task。再具体一点就是分配给id值最低的那个task。
  • Non Grouping
    不分组,这stream grouping个分组的意思是说stream不关心到底谁会收到它的tuple。目前这种分组和Shuffle grouping是一样的效果, 有一点不同的是storm会把这个bolt放到这个bolt的订阅者同一个线程里面去执行。
  • Direct Grouping
    直接分组, 这是一种比较特别的分组方法,用这种分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。
    只有被声明为Direct Stream的消息流可以声明这种分组方法。而且这种消息tuple必须使用emitDirect方法来发射。
    消息处理者可以通过TopologyContext来获取处理它的消息的task的id (OutputCollector.emit方法也会返回task的id)。
  • Local or shuffle grouping
    如果目标bolt有一个或者多个task在同一个工作进程中,tuple将会被随机发生给这些tasks。否则,和普通的Shuffle Grouping行为一致。

概念

  • Workers (JVMs)
    在一个物理节点上可以运行一个或多个独立的JVM 进程。
    一个Topology可以包含一个或多个worker(并行的跑在不同的物理机上), 所以worker process就是执行一个topology的子集,
    并且worker只能对应于一个topology
  • Executors (threads)
    在一个worker JVM进程中运行着多个Java线程。一个executor线程可以执行一个或多个tasks。
    但一般默认每个executor只执行一个task。一个worker可以包含一个或多个executor, 每个component (spout或bolt)至少对应于一个executor,
    所以可以说executor执行一个compenent的子集, 同时一个executor只能对应于一个component。
  • Tasks(bolt/spout instances)
    Task就是具体的处理逻辑对象,每一个Spout和Bolt会被当作很多task在整个集群里面执行。
    每一个task对应到一个线程,而stream grouping则是定义怎么从一堆task发射tuple到另外一堆task。
    你可以调用TopologyBuilder.setSpout和TopBuilder.setBolt来设置并行度 — 也就是有多少个task。

配置并行度
对于并发度的配置, 在storm里面可以在多个地方进行配置, 优先级为:
defaults.yaml < storm.yaml < topology-specific configuration
< internal component-specific configuration < external component-specific configuration

  • worker processes的数目
    可以通过配置文件和代码中配置, worker就是执行进程, 所以考虑并发的效果, 数目至少应该大亍machines的数目
    • executor的数目
      component的并发线程数,只能在代码中配置(通过setBolt和setSpout的参数), 例如, setBolt(“green-bolt”, new GreenBolt(), 2)
  • tasks的数目
    可以不配置, 默认和executor1:1, 也可以通过setNumTasks()配置

Topology的worker数通过config设置,即执行该topology的worker(java)进程数。它可以通过 storm rebalance 命令任意调整。

原创粉丝点击