https://www.zhihu.com/question/20098507
为什么 Storm 比 Hadoop 快?是由哪几个方面决定的?修改
按投票排序
按时间排序
17 个回答
这里的快主要是指的
时延。
storm的网络直传、内存计算,其时延必然比hadoop的通过hdfs传输低得多;当计算模型比较适合流式时,storm的流式处理,省去了批处理的收集数据的时间;因为storm是服务型的作业,也省去了作业调度的时延。所以从时延上来看,storm要快于hadoop。
说一个典型的场景,几千个日志生产方产生日志文件,需要进行一些ETL操作存入一个数据库。
假设利用hadoop,则需要先存入hdfs,按每一分钟切一个文件的粒度来算(这个粒度已经极端的细了,再小的话hdfs上会一堆小文件),hadoop开始计算时,1分钟已经过去了,然后再开始调度任务又花了一分钟,然后作业运行起来,假设机器特别多,几钞钟就算完了,然后写数据库假设也花了很少的时间,这样,从数据产生到最后可以使用已经过去了至少两分多钟。
而流式计算则是数据产生时,则有一个程序去一直监控日志的产生,产生一行就通过一个传输系统发给流式计算系统,然后流式计算系统直接处理,处理完之后直接写入数据库,每条数据从产生到写入数据库,在资源充足时可以在毫秒级别完成。
当然,跑一个大文件的wordcount,本来就是一个批处理计算的模型,你非要把它放到storm上进行流式的处理,然后又非要让等所有已有数据处理完才让storm输出结果,这时候,你再把它和hadoop比较快慢,这时,其实比较的不是时延,而是比较的 吞吐了。
storm的网络直传、内存计算,其时延必然比hadoop的通过hdfs传输低得多;当计算模型比较适合流式时,storm的流式处理,省去了批处理的收集数据的时间;因为storm是服务型的作业,也省去了作业调度的时延。所以从时延上来看,storm要快于hadoop。
说一个典型的场景,几千个日志生产方产生日志文件,需要进行一些ETL操作存入一个数据库。
假设利用hadoop,则需要先存入hdfs,按每一分钟切一个文件的粒度来算(这个粒度已经极端的细了,再小的话hdfs上会一堆小文件),hadoop开始计算时,1分钟已经过去了,然后再开始调度任务又花了一分钟,然后作业运行起来,假设机器特别多,几钞钟就算完了,然后写数据库假设也花了很少的时间,这样,从数据产生到最后可以使用已经过去了至少两分多钟。
而流式计算则是数据产生时,则有一个程序去一直监控日志的产生,产生一行就通过一个传输系统发给流式计算系统,然后流式计算系统直接处理,处理完之后直接写入数据库,每条数据从产生到写入数据库,在资源充足时可以在毫秒级别完成。
当然,跑一个大文件的wordcount,本来就是一个批处理计算的模型,你非要把它放到storm上进行流式的处理,然后又非要让等所有已有数据处理完才让storm输出结果,这时候,你再把它和hadoop比较快慢,这时,其实比较的不是时延,而是比较的 吞吐了。
首先要明白Storm和Hadoop的应用领域,注意加粗、标红的关键字。
Hadoop是基于Map/Reduce模型的,处理海量数据的 离线分析工具。
Storm是分布式的、 实时数据流分析工具,数据是源源不断产生的,例如Twitter的Timeline。
再回到你说的速度问题,只能说Storm更适用于实时数据流,Map/Reduce模型在实时领域很难有所发挥,不能简单粗暴的说谁快谁慢。
Hadoop是基于Map/Reduce模型的,处理海量数据的 离线分析工具。
Storm是分布式的、 实时数据流分析工具,数据是源源不断产生的,例如Twitter的Timeline。
再回到你说的速度问题,只能说Storm更适用于实时数据流,Map/Reduce模型在实时领域很难有所发挥,不能简单粗暴的说谁快谁慢。
最主要的方面:Hadoop使用磁盘作为中间交换的介质,而storm的数据是一直在内存中流转的。
两者面向的领域也不完全相同,一个是批量处理,基于任务调度的;另外一个是实时处理,基于流。
以水为例, Hadoop可以看作是 纯净水,一桶桶地搬;而Storm是用 水管,预先接好(Topology),然后打开水龙头,水就源源不断地流出来了。
两者面向的领域也不完全相同,一个是批量处理,基于任务调度的;另外一个是实时处理,基于流。
以水为例, Hadoop可以看作是 纯净水,一桶桶地搬;而Storm是用 水管,预先接好(Topology),然后打开水龙头,水就源源不断地流出来了。
“快”这个词是不明确的,专业属于点有两个层面:
1. 延时 , 指数据从产生到运算产生结果的时间,题主的“快”应该主要指这个。
2. 吞吐, 指系统单位时间处理的数据量。
首先明确一点,在消耗资源相同的情况下,一般来说storm的延时低于mapreduce。但是吞吐也低于mapreduce。 @张云聪已经给了比较好的介绍,我再补充一下。storm是典型的流计算系统,mapreduce是典型的批处理系统。下面对流计算和批处理系统流程
真个数据处理流程来说大致可以分三个阶段:
1. 数据采集与准备
2. 数据计算(涉及计算中的中间存储), 题主中的“那些方面决定”应该主要是指这个阶段处理方式。
3. 数据结果展现(反馈)
1)数据采集阶段,目前典型的处理处理策略:数据的产生系统一般出自页面打点和解析DB的log,流计算将数据采集中消息队列(比如kafaka,metaQ,timetunle)等。批处理系统一般将数据采集进分布式文件系统(比如HDFS),当然也有使用消息队列的。我们暂且把消息队列和文件系统称为预处理存储。二者在延时和吞吐上没太大区别,接下来从这个预处理存储进入到数据计算阶段有很大的区别,流计算一般在实时的读取消息队列进入流计算系统(storm)的数据进行运算,批处理一系统一般会攒一大批后批量导入到计算系统(hadoop),这里就有了延时的区别。
2)数据计算阶段,流计算系统(storm)的延时低主要有一下几个方面(针对题主的问题)
A: storm 进程是常驻的,有数据就可以进行实时的处理
mapreduce 数据攒一批后由作业管理系统启动任务,Jobtracker计算任务分配,tasktacker启动相关的运算进程
B: stom每个计算单元之间数据之间通过网络(zeromq)直接传输。
mapreduce map任务运算的结果要写入到HDFS,在于reduce任务通过网络拖过去运算。相对来说多了磁盘读写,比较慢
C: 对于复杂运算
storm的运算模型直接支持DAG(有向无环图)
mapreduce 需要肯多个MR过程组成,有些map操作没有意义的
3)数据结果展现
流计算一般运算结果直接反馈到最终结果集中(展示页面,数据库,搜索引擎的索引)。而mapreduce一般需要整个运算结束后将结果批量导入到结果集中。
实际流计算和批处理系统没有本质的区别,像storm的trident也有批概念,而mapreduce可以将每次运算的数据集缩小(比如几分钟启动一次),facebook的puma就是基于hadoop做的流计算系统。
1. 延时 , 指数据从产生到运算产生结果的时间,题主的“快”应该主要指这个。
2. 吞吐, 指系统单位时间处理的数据量。
首先明确一点,在消耗资源相同的情况下,一般来说storm的延时低于mapreduce。但是吞吐也低于mapreduce。 @张云聪已经给了比较好的介绍,我再补充一下。storm是典型的流计算系统,mapreduce是典型的批处理系统。下面对流计算和批处理系统流程
真个数据处理流程来说大致可以分三个阶段:
1. 数据采集与准备
2. 数据计算(涉及计算中的中间存储), 题主中的“那些方面决定”应该主要是指这个阶段处理方式。
3. 数据结果展现(反馈)
1)数据采集阶段,目前典型的处理处理策略:数据的产生系统一般出自页面打点和解析DB的log,流计算将数据采集中消息队列(比如kafaka,metaQ,timetunle)等。批处理系统一般将数据采集进分布式文件系统(比如HDFS),当然也有使用消息队列的。我们暂且把消息队列和文件系统称为预处理存储。二者在延时和吞吐上没太大区别,接下来从这个预处理存储进入到数据计算阶段有很大的区别,流计算一般在实时的读取消息队列进入流计算系统(storm)的数据进行运算,批处理一系统一般会攒一大批后批量导入到计算系统(hadoop),这里就有了延时的区别。
2)数据计算阶段,流计算系统(storm)的延时低主要有一下几个方面(针对题主的问题)
A: storm 进程是常驻的,有数据就可以进行实时的处理
mapreduce 数据攒一批后由作业管理系统启动任务,Jobtracker计算任务分配,tasktacker启动相关的运算进程
B: stom每个计算单元之间数据之间通过网络(zeromq)直接传输。
mapreduce map任务运算的结果要写入到HDFS,在于reduce任务通过网络拖过去运算。相对来说多了磁盘读写,比较慢
C: 对于复杂运算
storm的运算模型直接支持DAG(有向无环图)
mapreduce 需要肯多个MR过程组成,有些map操作没有意义的
3)数据结果展现
流计算一般运算结果直接反馈到最终结果集中(展示页面,数据库,搜索引擎的索引)。而mapreduce一般需要整个运算结束后将结果批量导入到结果集中。
实际流计算和批处理系统没有本质的区别,像storm的trident也有批概念,而mapreduce可以将每次运算的数据集缩小(比如几分钟启动一次),facebook的puma就是基于hadoop做的流计算系统。
您好,我是Jstorm的committer 延年(目前创业创办 延云YDB,
http://ycloud.net.cn/)
我们阿里的团队将Storm的开发语言更换为java版本,阿里的Jstorm目前已经正式被Apache所接受,成为apache Storm的子版本。本人对storm还是有一定的了解的。下面说说我本人的看法。
首先快是相对的,您说的hadoop不快,应该知的是hadoop下的mapreduce慢,因为还有很多跑在hadoop之上的业务他也快,比如说Hbase,以及我们的延云YDB。
另这个快其实您的本意是时效性好,而不是说计算速度快。这个地方要加以区分。
因为如果从计算速度上来看,mapreduce的计算速度不见得就慢,比如说算一个pi.
首先第一点:storm的数据在内存中,不落地,IO消耗很小。
storm因为本身是流式计算的特性,数据从产生到最终能看到结果,也就是秒,甚至是毫秒的延迟。流计算,您可以想象成一个流水线,各种数据在流水线上源于流动,而其中的Bolt就是流水线上的工人,不同的Bolt负责不同流程上产品的处理,每条数据经过一个人处理完毕后,会交给第二个作业的人去处理,这期间数据不会落地,而是直接在流水线上传输着,也就是说,数据一直在内存里面,不会像mapreduce在计算的过程中,map的处理结果,落地到磁盘上,reduce在去下载map的结果,计算完毕后还要放到磁盘上,多次mapreduce要反反复复的多次数据落地,IO肯定特别大。
第二点:他时效性好,是因为是预计算-不留原始数据,只能看特定的维度、粒度。
如果数据经过预先汇总,原始数据没有保留,在未来某一时间如果想查看其它维度或者粒度的数据数据将无法实现。
hadoop则保存了原始数据的明细,可以根据任何需要,来来回回的反复查询,但是他的mapreduce属于,暴力扫描的方式,不用多说,性能很差,需要狂堆机器,成本也太高。而这类系统一般的并发也不大,如果数据量在百亿级别,千台的集群规模,一天也就能进行几十万次的查询而已。
顺便说下我得创业项目,YDB则采用大索引技术,通过索引技术直接定位到相关记录,避免记录的逐条扫描,即使只有50几台的机器,百亿数据也能查询个几百万次。所以通过索引来拟补mapreduce的不足。YDB也是保存数据明细,查询的时候根据大索引技术以及独特的标签技术,在几秒的时间,返回任意维度,任意筛选条件的结果,灵活性很好,多维钻取,全文检索都是YDB的强项。
第三,hadoop上文件时效性较差,因为namenode不能有太多的小文件,数据要经过聚集几分钟,甚至一小时,一天,集中导入到hdfs里面,也就导致了数据时效性很差。流系统数据时实时流入的,时效性本身就好。
同时也PS下,上面吐槽storm稳定性的同学。
storm真的很稳定,阿里的jstorm每天处理超过万亿条的消息,这个是真的。但是有一定的开发成本,所以想写好,不是特别的容易。
我们阿里的团队将Storm的开发语言更换为java版本,阿里的Jstorm目前已经正式被Apache所接受,成为apache Storm的子版本。本人对storm还是有一定的了解的。下面说说我本人的看法。
首先快是相对的,您说的hadoop不快,应该知的是hadoop下的mapreduce慢,因为还有很多跑在hadoop之上的业务他也快,比如说Hbase,以及我们的延云YDB。
另这个快其实您的本意是时效性好,而不是说计算速度快。这个地方要加以区分。
因为如果从计算速度上来看,mapreduce的计算速度不见得就慢,比如说算一个pi.
首先第一点:storm的数据在内存中,不落地,IO消耗很小。
storm因为本身是流式计算的特性,数据从产生到最终能看到结果,也就是秒,甚至是毫秒的延迟。流计算,您可以想象成一个流水线,各种数据在流水线上源于流动,而其中的Bolt就是流水线上的工人,不同的Bolt负责不同流程上产品的处理,每条数据经过一个人处理完毕后,会交给第二个作业的人去处理,这期间数据不会落地,而是直接在流水线上传输着,也就是说,数据一直在内存里面,不会像mapreduce在计算的过程中,map的处理结果,落地到磁盘上,reduce在去下载map的结果,计算完毕后还要放到磁盘上,多次mapreduce要反反复复的多次数据落地,IO肯定特别大。
第二点:他时效性好,是因为是预计算-不留原始数据,只能看特定的维度、粒度。
如果数据经过预先汇总,原始数据没有保留,在未来某一时间如果想查看其它维度或者粒度的数据数据将无法实现。
hadoop则保存了原始数据的明细,可以根据任何需要,来来回回的反复查询,但是他的mapreduce属于,暴力扫描的方式,不用多说,性能很差,需要狂堆机器,成本也太高。而这类系统一般的并发也不大,如果数据量在百亿级别,千台的集群规模,一天也就能进行几十万次的查询而已。
顺便说下我得创业项目,YDB则采用大索引技术,通过索引技术直接定位到相关记录,避免记录的逐条扫描,即使只有50几台的机器,百亿数据也能查询个几百万次。所以通过索引来拟补mapreduce的不足。YDB也是保存数据明细,查询的时候根据大索引技术以及独特的标签技术,在几秒的时间,返回任意维度,任意筛选条件的结果,灵活性很好,多维钻取,全文检索都是YDB的强项。
第三,hadoop上文件时效性较差,因为namenode不能有太多的小文件,数据要经过聚集几分钟,甚至一小时,一天,集中导入到hdfs里面,也就导致了数据时效性很差。流系统数据时实时流入的,时效性本身就好。
同时也PS下,上面吐槽storm稳定性的同学。
storm真的很稳定,阿里的jstorm每天处理超过万亿条的消息,这个是真的。但是有一定的开发成本,所以想写好,不是特别的容易。
Storm的主工程师Nathan Marz表示: Storm可以方便地在一个计算机集群中编写与扩展复杂的实时计算, Storm之于实时处理,就好比 Hadoop之于批处理。 Storm保证每个消息都会得到处理,而且它很快——在一个小集群中,每秒可以处理数以百万计的消息。更棒的是你可以使用任意编程语言来做开发。
Storm的主要特点如下:
-
简单的编程模型。类似于MapReduce降低了并行批处理复杂性, Storm降低了进行实时处理的复杂性。
-
可以使用各种编程语言。你可以在 Storm之上使用各种编程语言。默认支持Clojure、Java、Ruby和Python。要增加对其他语言的支持,只需实现一个简单的 Storm通信协议即可。
-
容错性。 Storm会管理工作进程和节点的故障。
-
水平扩展。计算是在多个线程、进程和服务器之间并行进行的。
-
可靠的消息处理。 Storm保证每个消息至少能得到一次完整处理。任务失败时,它会负责从消息源重试消息。
-
快速。系统的设计保证了消息能得到快速的处理,使用ØMQ作为其底层消息队列。
-
本地模式。 Storm有一个“本地模式”,可以在处理过程中完全模拟 Storm集群。这让你可以快速进行开发和单元测试。
个人总结:
- Hadoop M/R基于HDFS,需要切分输入数据、产生中间数据文件、排序、数据压缩、多份复制等,效率较低。
- Storm 基于ZeroMQ这个高性能的消息通讯库,不持久化数据。
@kenny 的水的例子很形象,我再发挥一下。例如给纯净水消毒需要经过27道工序,hadoop差不多是每一道工序都把桶装水倒出来消毒,完了再装回去,下一道工序再倒出来;而storm相当于把水倒入管道中,流经不同的消毒池,完成所有工序,然后再流回桶里。所以storm比hadoop快,尤其是需要多次迭代的场景,不用每次都把中间数据写回磁盘。
差点看成spark的问题,最近拿spark和hadoop比的问题太多了。
差点看成spark的问题,最近拿spark和hadoop比的问题太多了。
两者属于不同的计算范式,批处理v.s.实时,不存在可比性。相反,对于一个大型的大数据系统,要兼顾批处理和实时性要求,在架构上会将Hadoop和Storm结合起来。在Storm主工程师Nathan Marz的Big Data一书中,有介绍。
我不讲你能知道么?你还以为Storm能解决过车查询和在线实时统计分析呢!
但实际上storm和hadoop的根本完全就是不同的应用领域。
storm只能处理 数据入库、超速判断、网站在线用户特别多 之类的问题,与大数据查询毫无关系。
它所能处理的“大”是指 实时在线请求量的 “大”。
我认为这两个东西 就不应该做对比。是不同领域的东西。它们之间快慢比较根本没有意义。
引用一段话:
爬犁和宝剑哪个快?要看是用来耕地,还是砍人——hadoop像个爬犁,耕地很凶悍;storm像把宝剑,砍人锋利无比。
但实际上storm和hadoop的根本完全就是不同的应用领域。
storm只能处理 数据入库、超速判断、网站在线用户特别多 之类的问题,与大数据查询毫无关系。
它所能处理的“大”是指 实时在线请求量的 “大”。
我认为这两个东西 就不应该做对比。是不同领域的东西。它们之间快慢比较根本没有意义。
引用一段话:
爬犁和宝剑哪个快?要看是用来耕地,还是砍人——hadoop像个爬犁,耕地很凶悍;storm像把宝剑,砍人锋利无比。
孙膑、yunxing wang 赞同
其实
@张云聪 的回答已经说明了原因。
这里再次强调根本原因,Hadoop是磁盘级计算,进行计算时,数据在磁盘上,需要读写磁盘;Storm是内存级计算,数据直接通过网络导入内存。读写内存比读写磁盘速度快n个数量级。根据Harvard CS61课件,磁盘访问延迟约为内存访问延迟的75000倍。所以Storm更快。
这里再次强调根本原因,Hadoop是磁盘级计算,进行计算时,数据在磁盘上,需要读写磁盘;Storm是内存级计算,数据直接通过网络导入内存。读写内存比读写磁盘速度快n个数量级。根据Harvard CS61课件,磁盘访问延迟约为内存访问延迟的75000倍。所以Storm更快。