阅读更多

5顶
0踩

开源软件

原创新闻 从Apache Storm学到的经验教训

2014-10-14 09:26 by 副主编 mengyidan1988 评论(5) 有7903人浏览
Apache Storm是一个免费、开源的分布式实时计算系统。除了用于实时分析外,Storm也可用于在线机器学习、持续计算、分布式远程调用和ETL等领域。Storm简单易用,支持多种编程语言。Storm也是少有的几个使用Clojure编写的开源项目之一,Clojure是一个在JVM平台运行的动态函数式编程语言。国内的几个公司也在大规模使用Storm,比如百度、淘宝,在Storm的官网也能看到他们的商标。





在Storm升级为Apache基金会顶级项目后,Storm主工程师Nathan Marz就Storm的由来和项目心得撰写了本文。Nathan Marz表示,Storm的成功离不开开源,打造一个成功的项目不仅是能帮助人们解决实际问题,还必需兼顾文档,推广,支持社区等方方面面。

译文如下:

Storm的由来

首先,任何成功的项目需要做到两点:

  • 成功解决了一个实际问题
  • 能够说服大量的用户使用你的项目,证明你的项目是他们的最佳解决方案。
我想,第二点是开发者在项目工作中普遍忽略的一点,但其实这关系到项目的成败,我希望下述的Storm历史能够使大家对此引起足够的重视。

Storm的前身是BackYype,用来帮助商家分析和研究他们的产品在社交网络中的影响力,可以处理历史或实时的数据。使用的方法是标准队列和线程(worker)方法,但是这个方案不太令人满意。首先它并不友好,所有的队列和线程都必须确保可用,这样相对来说显得冗长。大部分逻辑处理用于进行收发和序列/反序列消息,一个应用的某个逻辑将会遍及所有线程。

在2010年12月,我想到了“流(Stream)”的分布式抽取方法,最后演变为“喷嘴(spout)”和“bolts(螺拴)”的思想。这两个概念的特点是内在并行处理的,类似于Hadoop。Bolts对于需要处理的流进行订阅,然后指出之后的流该如何进行分区处理。进行一番实践后,我决定在这基础上进行进一步改进,于是我在推特上发布了新的构建思路--Storm,结果反应非常热烈。

随后,对中间消息的依赖让我觉得,如果有个更好的办法,消除对中间消息传递的依赖,会更能提高工作效率。于是我尝试使用一种基于随机数和异或逻辑的算法,它仅需要20个字节的长度来跟踪每个spout数组。至此,Storm的雏形基本成型,我隐约感觉这将是一项伟大的工程。

第一个版本

接下来的5个月时间里,Storm的第一个版本诞生了。从一开始,开源是我觉得应该去做的事情。我用Java进行Storm API的编写,而部署端使用Clojure。事实证明,这会带来更高的软件生产力和工作效率。此外,考虑到兼容性和便利性,我希望Storm平台是能与主流编程语言无缝工作的,这样人们使用Storm时,可以使用自己熟悉的语言,而不必重写代码。

作为Hadop的重度使用者,Hadoop的僵尸worker模式会浪费不少资源。于是,在Storm设计中,我把累赘的使用完毕的worker在其首次出现的地方就直接销毁。另外,一旦Hadoop的JobTracker出现问题,正在运行的作业将会被终止。如果有一项作业已经运行了多天却因此而被迫终止,这无疑是非常令人沮丧的。所以在Storm中我引入了“process fault-tolerant(进程容错)”机制,简单说,就是即使Storm守护进程被销毁,重启该进程不会对正在运行的拓扑产生影响。

在Jason Jackson的帮助下,在AWS上我们创建了Storm自动部署机,这对Storm的开发过程带来极好的帮助,同时使得我可以在不同大小和配置的机器集群中进行测试。

开源Storm

2011年7月,与Twitter就收购事宜达成一致,我们正式加入Twitter这个大品牌。同时,我马上着手推出Storm。

要想成功发布开源软件,方法有两个。一是把事情“搞大”,尽可能地增加作品的曝光度与关注度,不过缺点是一旦与人们预期不符合,进一步合作意愿可能从此消失。二是静悄悄地发布,慢慢地培养用户群,不足之处是如果人们发现不过如此,很可能从此不再关注。对这两点进行分析论证后,我决定透过开交流会的方式进行宣传和发布。事后证明,这是正确的做法。在正式发布当天,Github上的浏览和关注数很快就超过了1000次,同时成为Hacker New上排名首位的项目。

Storm的技术演变

初创企业的需求与大型成熟企业的需求截然不同,加入Twitter后,我们对此有越来越深刻的认识。在Twitter中,人们希望能够直接使用Storm,而把其他的运营工作交给别人。这意味着,我们需要打造一个大型的共享集群,能够独立运行大量的程序,并确保程序间不会成为彼此的资源争夺者,这一般被称为“多用户架构”。

由于共享的性质,我们发现人们喜欢获取最大程度的资源来运行程序,而实际上很多时候是供大于求。于是,我开发了“isolation scheduler(分离调度表)”。这个机制一来鼓励人们更有效地使用资源,二来允许单个集群共享负载量。

随着Twitter平台的发力,越来越多的开发者成为Storm的用户。出于对系统性能监控需求的考虑,我们提供了相应的指标API,方便人们把相关指标数据与自己喜好的监控系统进行整合。

另外一个较大的技术进步是开发了Trident(三叉戟),一个基于Storm的微批处理API,提供了精确的一次性语义处理能力,提高了对新用例的处理能力。

离开Twitter,投入Apache怀抱

在2013年,我离开Twitter发展自己的创业公司,但对于Storm,我始终是开发环节和发展的中心。接下来的数月里,在再次认识以个人为中心模式的种种不足后,我想是时候采用共识驱动的开发模式了。我希望Storm能成为一项长久的有活力的工程。争取Apache基金会的帮助,投入Apache的怀抱,是非常合适的选择。Apache有足够的品牌影响力,是个强大的合法的基金会,最关键的是能最大程度帮助Storm过渡到共识驱动模式。随着我作为发展瓶颈的问题完美解决后,Storm驶入发展的快车道。Storm开发社区活跃度与日俱增,越多越多的新想法新思路被发掘被采纳,在其哇哇坠地的三年后,在2014年9月成为官方的顶级项目,这就是群众的力量。

写在最后

Storm的成功让我深刻认识到,打造一个成功的项目不仅仅要能帮助人们解决实际问题,还必需兼顾文档,推广,支持社区等方方面面。特别是项目初期,我们需要有自己的创造性思维,来确保项目被成功推广。此外,自己也需要充分利用时间,来为人们解答疑难,编写支持文档,形成良好的交流氛围。最后,我们有时候需要做个清醒的旁观者,看有什么会制约项目发展,在适当的时候做出果断的选择,该抽离就抽离,群众的力量总比一个人战斗来得高效长效。
  • 大小: 65.2 KB
  • 大小: 16.8 KB
来自: CSDN
5
0
评论 共 5 条 请登录后发表评论
5 楼 IamSungod 2014-10-21 19:12
期待发展更好
4 楼 tony_0529 2014-10-17 14:37
storm成长史  呵呵
3 楼 zixu4728 2014-10-15 10:47
mark,学习
2 楼 ljmomo 2014-10-14 15:05
淘宝好像用storm 主要做实时日志记录。以前有过了解。一天日志处理好像是上亿级别。
1 楼 makemyownlife 2014-10-14 12:28
这是 storm核心开发的表述么?

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • .NET链接Redis类库

    .NET链接Redis类库,支持.net4.0以上。包含源文件,下载即用。

  • .Net Redis基本使用

    在开发项目时,我们为了提高效率和性能,我们有时候会选择使用Redis中间件来进行临时的存储,再用。所以有些情况我们选择用Redis还是非常好的,特别是在的时候,我们可以先提到缓存上,每隔一段时间去更新缓存,用户从缓存提取,就会特别快。

  • .NET中使用Redis大全

    安装:Install-Package StackExchange.Redis。

  • .net中使用Redis(一)

    前言 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 Redis支持数据的备份,即master-slave模式的数据备份。 最近项目中需要使用Redis,这里简单记录一下Redis的

  • .Net全网最简Redis操作

    支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac。Redis作为一款主流的缓存数据库在业内已广受欢迎。本文将会介绍操作Redis的一种最简单的方法。本文假定你身边已有安装好的Redis应用,该应用的网络地址为(ip+port):132.294.52.135:6379,访问密码为:Admin123下面直接给出一个在Re...

  • .Net中Redis的使用,详细讲解

    一、测试服务器是否工作正常 redis-cli -h 10.0.0.7 -p 6379 -a "qwe123456" 二、超时时间设置 PSETEX key1 EXPIRY_IN_MILLISECONDS value1时间是毫秒,不绝对 PSETEX testvalue 30000 "2312" 超时请求数据就没了 三、建立测试项目并安装依赖 使用NuGet安装ServiceStack.Redis,这是微软提供已经封装好的对redis操作类 1、String使用,设置过期 ..

  • 在.Net中操作redis

    可视化工具:Another Redis Desktop Manager。这样就把list数据存入了redis中。配置redis连接信息。

  • .Net中Redis的应用

    Redis在.NET应用程序中的应用非常广泛,可以用于提高应用性能、实现分布式缓存、消息队列等多种场景。StackExchange.Redis是一个功能丰富、性能优异的.NET Redis客户端,能够满足大多数应用程序的需求。

  • 【C#】Redis在net core下使用教程

    Remote DIctionary Server(Redis远程字典服务器) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

  • .Net Redis 入门到熟练

    所以,这种内存型的缓存,内存是越大越好,我是见过几百G的内存做的缓存服务,更大的,目前我还没有见到。网上有教程,可以参考,安装地址 : https://github.com/MicrosoftArchive/redis/releases也可以注册官网的 https://redis.com/try-free/ 免费资源,大概一百M左右好像,支持的功能多,测试用很方便。我安装此类服务直接就是Docker Desktop ,直接就部署了。方便的很。所以,建议,可以搜一下,安装个Docker Desktop,安装,

  • .NET中Redis安装部署及使用方法简介

     录(?)[+]  一Redis服务端以服务方式运行 修改端口压缩文件中配置的是6488修改密码修改库的数量 工具配置安装后如下图  二Redis服务端以控制台方式运行   第一步配置本地服务第二部安装和配置客户端 三C访问Redis 下载ServiceStackRedis NET项目中使用RedisRedis公共类库参考   

  • .net框架中使用redis

    总体而言,使用 Redis 可以显著提高应用程序的性能和可扩展性。但是,必须小心使用 Redis,因为它使用的是内存存储,而过度使用 Redis 可能会导致内存问题和性能问题。可以在程序中使用如上的 Redis 连接和访问方式,并且可以根据具体的业务场景进行相应的操作,例如存储数据、读取数据、删除数据等。然后获取了 Redis 数据库实例,并使用。一旦安装了 Redis 客户端库,就可以创建 Redis 客户端实例并对 Redis 进行操作。使用这些命令,我们可以以多种不同的方式使用 Redis。

  • .NET中的Redis

    1.什么是Redis Redis全称:Remote Dictionary Server(远程数据服务),是一款内存高速缓存数据库。它使用c语言编写的遵守BSD协议的key-value数据库系统。 2.Redis特点 Redis以内存作为存储介质,所以有高效的内存读写,远远超过数据库。 存储在Redis中的数据是持久化的,断电或重启后,数据也不会丢失。因为Redis的存储分为内存存储、...

  • Net调用Redis缓存示例

    ServiceStack.Redis操作Redis内容,包括存取String、Hash、List、Set、ZSet.

  • .net 使用Redis发布订阅

    订阅,取消订阅和发布实现了发布/订阅消息范式(引自wikipedia),发送者(发布者)不是计划发送消息给特定的接收者(订阅者)。而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅。订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的。这种发布者和订阅者的解耦合可以带来更大的扩展性和更加动态的网络拓扑。 订阅信道 消息推送   在这里我就不介绍...

  • .NET 中使用redis(四)

    1,应用场景: 订单过期时间可以通过redis缓存进行存放,然后redis过期之后,处理订单超时可以使用redis 的键过期触发事件通知! redis在 2.8.0(4.0以后就开始收费了)以后的版本提供了,KeySpace Notification功能,允许客户订阅pub/Sub频道,以便以某种方式接收影响redis数据集事件。 接下来实际操作: 先看看自己的redis版本: 我这是3.0的版...

  • .NET分布式缓存Redis从入门到实战

    一、课程介绍今天阿笨给大家带来一堂NOSQL的课程,本期的主角是Redis。希望大家学完本次分享课程后对redis有一个基本的了解和认识,并且熟悉和掌握 Redis在.NET中的使用。本次分享课程包含以下知识点:1、StackExchange.Redis(简称:SE)驱动在C#中Redis几种数据结构学习和使用。2、ServiceStack.Redis( 简称: SS) 驱动在C#中Redi...

  • .net redis数据缓存(二) redis操作List集合带分页

    redis net

  • .NET中Redis安装部署及使用方法简介附->开源Redis操作辅助类

    Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博、Github、StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/。   Redis 是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和

  • .Net Core使用Redis的一个入门简单Demo

    本例子讲述一个在.Net core环境中对Redis数据库进行增删改查操作。 首先,要安装好Redis数据库,至于怎么安装,本文不再赘述,可以自行百度,有很详细的教程。 安装好之后,在CMD中输入 redis-cli 就会...

Global site tag (gtag.js) - Google Analytics