阅读更多

5顶
0踩

开源软件

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

2014-10-14 09:26 by 副主编 mengyidan1988 评论(5) 有7898人浏览
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(一)

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

  • .NET中使用Redis大全

    安装:Install-Package StackExchange.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 core 下使用StackExchange的Redis库访问超时解决

    目录问题:并发稍微多的情况下Redis偶尔返回超时给出了参考网址?结论小备注引用链接 问题:并发稍微多的情况下Redis偶尔返回超时 StackExchange的Redis类库,用的较多,但偶尔报的问题非常让人迷惑,访问超时,队列XXX… 问题出在Redis服务器吗?可是其他应用访问都正常啊,难道要把这个类库替换掉? 问题描述如下: Timeout performing GET keyName, ...

  • .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缓存实现单点登录SSO的解决方案

    一、基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享。 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 普通的登录是写入session,每次获取sessio...

  • C# Redis实战(一)

    一、初步准备 Redis 是一个开源的使用ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库。Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。 本文主要讲述的是如何使用C#语言来进行Redis分布式缓存的程序编写。首先,需要从github下载最新...

Global site tag (gtag.js) - Google Analytics