jstorm和spark-streaming的区别

大部分时候大家在选择技术方案的时候还是比较迷茫,是该选择JStorm还是Spark Streaming?


一般会流于一些并不重要问题的讨论,最后做出目光非常短浅的选择,几个月之后再改变技术方案。造成严重的开发量的浪费,甚至拖延关键产品的上线,或者上线后问题层出不穷,不断和业务方妥协谈判。所以,明确这两个最主流的流计算框架的应用场景至关重要,下面我说下经验之谈,避免更多的人走弯路。

Spark Streaming和JStorm的本质区别是想要解决的问题不同:

Spark Streaming是批量处理的Spark向流计算多迈了一步;

JStorm是真正的流式流水线计算向批量计算(trident可以有部分的批量处理)多迈出了一步。

使得看似毫不相关的两个问题有了交集。这个交集让很多人困惑。其实根本的问题是真正理解流计算本质的项目负责人少之又少。流计算不是实时计算。实时计算和离线计算对应,是计算的场景,是需求。流计算和批量计算对应是计算的方式。流计算的本质是:无状态性!批量计算的本质是有状态计算,或者说没有状态性的批量计算根本就是流计算只是把时间维度的计算变成了空间维度的计算。而有状态的流计算本质也是批量计算,只是把状态的需求藏在流式之外的闭包中。这么看了,一切了然,根本没什么交集,判断自己的项目使用哪种技术方案根本不需要问询需求方:你要多少的延迟?如果你只是需要低延迟,那你只是在挑战现在计算机的计算能力。真正你要关心的是业务计算的逻辑是不是主要是无状态的。

下面举一个使用流计算的主要场景:

用户行为log的基本sum,count,distinct需求: 这里的log数据量巨大,如果技术方案不对,将对公司资源造成极大浪费。这个需求中,sum,count都是无状态的计算,但是distinct确是有状态的计算,所以最好的解决方案是sum,count在JStorm中计算,distinct在Spark中计算。但是两个系统同时存在会带来很多问题,数据落地拉起的延迟,这在阿里还是很大的瓶颈。但如果不考虑数据落地拉起,那么Storm接Spark是最好的技术方案之一。

其实还有很多项目都存在大量的状态保存的需求,都是需要使用Spark Streaming来计算的。其实就算使用Spark和Storm的混合架构,数据两次进内存(进程间数据流)也是对网络带宽的浪费,所以如果在不考虑很高的实时要求的情况下,对于有状态运算的项目完全可以用Spark Streaming取代掉Storm。对于没有状态的项目,当然可以完全用JStorm了。,

你可能感兴趣的:(jstorm和spark-streaming的区别)