Storm 编程入门及内部原理介绍


淘宝-产品技术部-综合业务平台 吉剑南 2012-7-12 Storm编程入门及内部原理介绍 关于我 • 11年7月进入支付宝实习 • 淘宝数据平台-基础架构组 – 云梯1(Hadoop)、Storm • 淘宝综合业务平台 – Storm、分布式实时计算 • 开源软件爱好者、关注分布式实时计算 • 新浪微博 –@吉剑南 分布式计算 • 如何利用各个节点的资源(磁盘、cpu等)将操作 作用于对应的数据 • 操作: – partition、match、transfer • 对象: – data、operation、mixture MapReduce模型 • 分发操作 – 移劢计算优于移劢数据( map阶段) • 仅在需要的时候移动数据(reduce阶段) Storm Storm • 基本概念 • 典型模式 • 关键组件 • 如何解决分布式计算的问题 • 一些建议 … tuple tuple … 由计算节点和流劢的 tuple 组成的拓扑结构 以tuple为基本单位组成的 一条有向无界的数据流 名词解释 Spout tuple tuple tuple tuple tuple tuple tuple tuple Queues Web logs API calls Event data 名词解释 Bolt tuple tuple tuple tuple tuple tuple tuple tuple tuple tuple tuple tuple 名词解释 [How 1] [? 1] [do 2] [you 1] How do you do ? WordCount Spout Bolt Bolt Bolt Bolt Bolt How do you do ? [How 1] [? 1] [do 2] [you 1] WordCount Spout Bolt Bolt Bolt Bolt Bolt How do you do ? WordCount Spout Bolt Bolt Bolt Bolt Bolt How do you do ? WordCount Spout Bolt Bolt Bolt Bolt Bolt How do you do ? [How 1] [? 1] [do 2] [you 1] WordCount Spout Bolt Bolt Bolt Bolt Bolt [How 1] [? 1] [do 2] [you 1] How do you do ? WordCount Spout Bolt Bolt Bolt Bolt Bolt [How 1] [? 1] [do 2] [you 1] How do you do ? WordCount Bolt Bolt [How 1] [? 1] [do 2] [you 1] Bolt Bolt [How 1] [do 1] [? 1] [do 1] [you 1] WordCount Spout Bolt Bolt Bolt Bolt Bolt How do you do ? [How 1] [? 1] [do 2] [you 1] Grouping WordCount boltA boltA boltA boltA boltB boltB boltB boltB Grouping Grouping • Shuffing – 数据倾斜严重 – 应用对分组字段丌敏感 • All – 多个下游同时消费一组数据 • Field – 应用对分组字段敏感(UV) • Global – 一般用于计数 典型模式 Spout Spout Bolt Bolt Bolt Bolt Bolt Streaming Processing Spout Spout Bolt Bolt Bolt Bolt Bolt Streaming Processing Spout Spout Bolt Bolt Bolt Bolt Bolt Streaming Processing Spout Bolt Bolt Continues Computation Distributed RPC Storm中的关键组件 • Nimbus • Supervisor • Worker • Task • Zookeeper Nimbus Supervisor Worker Master Node Worker Node Zookeeper Coordinator 运行状态图 ZeroMQ 组件简介 • Nimbus – 类似Hadoop里面的JobTracker。Nimbus负责在集群里面发布代码, 分配工作给机器, 并且监控Topology状态。 • Supervisor – 每一个工作节点上面运行一个叫做Supervisor的节点。Supervisor会 监听分配给它那台机器的工作,根据需要 启劢 /关闭Worker。 • Worker – 每个Supervisor可以适用的worker是固定的 – 单个Worker可以运行一个或多个Task • Task – 运行用户计算逻辑的线程 分布式计算的问题 • 高可用 • 易扩展 • 低延时 • 高吞吐 Fault Tolerance • 原理 – 用Zookeeper来存储Nimbus和Supervisor的元数据。 保证Nimbus进程和Supervisor都是快速失败(fail- fast)和无状态的。所有的状态要么在Zookeeper里面, 要么在本地磁盘上。 Fault Tolerance • 节点宕机 – 宕机节点的任务由于长时间未发送心跳导致超时, Nimbus将重新分配该任务。 • Nimbus or Supervisor 进程出错 – Worker将继续工作。由于任务重跑需要Nimbus的支持, 此时若出现worker失败,则导致失败。 – DaemonTools or monit • Worker 进程出错 – Supervisor进程将重启Worker进程 如何保证不丢数据 • Spout • Bolt • Acker 如何保证不丢数据 • Spout – MessageID • 64位long型整数,用于标记message以及Ack – Tree of tuples • 被该spout发出的tuple以及其经过的计算节点 – Ack • 当一个tuple的所有tuple tree被成功消费时调用 – Fail • 当一个tuple中某个tuple tree在指定时间内没有被成功消费时调 用 如何保证不丢数据 • Bolt – Anchoring • 将该tuple作为一个锚点添加到原tuple上 – Multi-anchoring • 如果该tuple有两个原tuple,则为每个原tuple添加一个锚点 – Ack • 通知AckerTask,该tuple已被当前bolt成功消费 – Fail • 通知AckerTask,该tuple在当前bolt消费失败 Acker 机制 • Acker Spout Bolt Bolt Acker [spout-tuple-id, task-id] {spout-tuple-id {task-id ack-val)} [spout-tuple-id, tmp-ack-val] Acker 机制 Spout Task: 1 Bolt Task: 2 Bolt Task: 3 Bolt Task: 4 Acker Spout Task: 1 Bolt Task: 2 Bolt Task: 3 Bolt Task: 4 Acker Emit ”TaoBao” msgId:10 { key:10 , value: <1,1010> } Acker 机制 Emit ”TaoBao” msgId:10 Acker 机制 • Example Spout Task: 1 Bolt Task: 2 Bolt Task: 3 Bolt Task: 4 Acker { key:10 , value: <1,1010> } Emit ”Tao” spoutIds: 10 msgId: 2 Ack “TaoBao” { key:10 , value: <1,1000> } Emit ”TaoBao” msgId:10 Spout Task: 1 Bolt Task: 2 Bolt Task: 3 Bolt Task: 4 Acker { key:10 , value: <1,1000> } Emit ”Tao” spoutIds: 10 msgId: 2 { key:10 , value: <1,0001> } Ack “TaoBao” Emit ”Bao” spoutIds: 10 msgId: 3 Acker 机制 Emit ”TaoBao” msgId:10 Spout Task: 1 Bolt Task: 2 Bolt Task: 3 Bolt Task: 4 Acker { key:10 , value: <1,0001> } Emit ”Tao” spoutIds: 10 msgId: 2 { key:10 , value: <1,0011> } Ack “TaoBao” Emit ”Bao” spoutIds: 10 msgId: 3 Ack “Tao” Acker 机制 Emit ”TaoBao” msgId:10 Spout Task: 1 Bolt Task: 2 Bolt Task: 3 Bolt Task: 4 Acker { key:10 , value: <1,0011> } Emit ”Tao” spoutIds: 10 msgId: 2 { key:10 , value: <1,0000> } Ack “TaoBao” Emit ”Bao” spoutIds: 10 msgId: 3 Ack “Tao” Ack “Bao” Acker 机制 Acker 机制 • Ack失败 调用发送该tuple的原始spout的fail方法,用户可以在fail方 法中选择重发或其他操作 • 几种失败的情形 – 执行tuple的task失败 – AckerTask 进程失败 • 所有该Acker进行ack的tuple超时失败 – Spout Task 失败 • 保证该spout已经发送的tuple会被正常消费,此时若下游bolt失 败,则无法成功调用spout的fail方法 Ack的问题 • 重发导致多次消费 • 采用锚点将导致失败概率递增 Spout Task: 1 Bolt Task: 2 Bolt Task: 3 Spout Task: 1 Bolt Task: 2 Bolt Task: 3 Spout Task: 1 Bolt Task: 2 Bolt Task: 3 Spout Task: 1 Bolt Task: 2 Bolt Task: 3 多次消费问题 1、如何区分同一条消息的丌同版本? 2、如何保证多条消息消费的事务性? Exactly-once Processing ”… transactional topologies, which enable you to get exactly once messaging semantics for pretty much any computation … “ TransactionTopology TransactionTopology • Batch – 一组消息 – 两种状态:processing、committing • BasicBolt • BatchBolt – 在一组batch的消息执行完成后调用finishBatch方法 • BatchBolt As Committer – 只在Committing阶段执行finishBatch方法 • Coordinater TransactionTopology • TransactionAttempt – Transaction id • 每个transactionId对应单独的一组batch – Attempt id • 每个Attempt对应一个独立的bolt引用 注意 提供数据落地时 保证只消费一次的语义 而不是保证消息只消费一次 扩展性 • 动态增减机器 – storm supervisor – kill -15 pid • 动态负载均衡 – 自劢 VS 手劢 – storm rebalance 高吞吐与低延时 • 高效的序列化工具 – Kryo • 足够快的轻量级消息系统 – 0MQ 性能 • 单条记录消费的响应时间 – 应用逻辑 – 并行度 – Acker数量 • 吞吐量/消息风暴 – 是否可以按时间维度聚合 – 选择适合应用的方式 • 加机器 • 多个Topology并行 一些建议 • 保证应用的计算节点可以快速失败(无状态) • 选择合适的数据落地方案 • 根据数据量和计算量合理分配资源 • 优化关键路径会很大程度的提高效率 Storm 生态圈 • RedStorm (JRuby+Storm) – https://github.com/colinsurprenant/redstorm • Storm-contrib (Kafka,Cassandra …) – https://github.com/nathanmarz/storm-contrib • Storm-esper – https://github.com/tomdz/storm-esper • Storm SQL – https://github.com/epfldata/squall Learn More • Wiki –(https://github.com/nathanmarz/storm/wiki) • 邮件组 –(http://groups.google.com/group/storm-user) • 徐明明的博客 –(http://xumingming.sinaapp.com/category/storm/) • Ali-Storm 旺旺 – 134740591
还剩55页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 58 人已下载

下载pdf

pdf贡献者

religiose

贡献于2012-07-31

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf