从Storm和Spark 学习流式实时分布式计算的设计

  • 时间:
  • 浏览:0
  • 来源:uu快3新平台_uu快3诀窍_讨论群

0. 背景

你你这个例子使用Scala写的,如此 简单优雅的函数式编程语言,并肩也是基于JVM的后Java类语言。

如此对于流式计算系统你你这个算得上轻量级的元数据来说,Master补救哪些地方地方元数据实际上要简单的多,当然了,Master需要实现服务的HA和数据的HA。哪些地方地方总要 如此 轻松的事情。实际上,能如此采用ZooKeeper来保存系统的元数据。ZooKeeper使用如此 目录树的形态学 来保存集群的元数据。节点能如此监控感兴趣的数据,机会数据有变化,如此节点会收到通知,想要就保证了系统级别的数据一致性。这点对于系统比较重要,机会节点总要 不稳定的,想要系统的或多或少服务机会总要机会节点失效而位于变化,哪些地方地方都需要通知相关的节点更新器服务列表,保证了每种节点的失效我很多 会影响系统的整体的服务,从而也就实现了故障对于用户的透明性。

        对于在线(区别于响应互联网用户请求的在线系统,你你这个在线系统主可是我 內部使用的,也可是我 说我很多 直接服务于互联网用户)/近线系统来说,补救的是线上产生的数据,比如在线系统产生的日志,记录用户行为的数据库等,想要近线系统也需要低延时高可靠的补救海量数据。对于哪些地方地方时效性很强的数据,比如新闻热点,电商的促销,微博热词等都需要在很短的时间内完成数据补救以供在线系统使用。

       流式实时分 布式计算系统在互联网公司占有举足轻重的地位,尤其在在线和近线的海量数据补救上。在线系统负责补救在线请求,想要低延时高可靠是核心指标。在线系统是互联网公司的核心,系统的好坏直接影响了流量,而流量对互联网公司来说是是因为一切。在线系统使用的数据是来自于后台的计算系统产生的。

        Storm将计算逻辑成为Topology,其中Spout是Topology的数据源,你你这个数据源机会是文件系统的某个日志,也机会是MessageQueue的某个消息队列,总要 机会是数据库的某个表等等;Bolt负责数据的护理。Bolt有机会由另外如此 Bolt的join而来。

最近我在做流式实时分 布式计算系统的分派,而正好又要参加CSDN博文大赛的决赛。如此 想就写Spark源码分析的文章吧。想要又想毕竟是决赛,要甩掉或多或少我个人的干货出来,仅仅是源码分析貌似分量不足。想要,我将最近突然在做的系统架构的思路分派出来,形成此文。为哪些地方要参考Storm和Spark,机会如此参照效果机会我很多 太好,尤其是对于Storm和Spark由了解的同学来说,机会通过对比,更能体会到每个具体实现肩上的意义。

机会是节点宕机呢?上述措施肯定是如此用的。你你这个清况 下Master会检测到Worker的心跳超时,如此就会从资源池中把你你这个节点删除。回到正题,宕机后的节点重启涉及到了运维方面的知识。对于如此 集群来说,硬件宕机你你这个清况 应该需要统一的管理,也可是我 集群要能如此由如此 Master,维持每个节点的心跳来选折 硬件的清况 。机会节点宕机,如此集群首先是重启它。机会启动失败机会会通过电话机会短信机会邮件通知运维人员。想要运维人员为了保证集群的高可用性付出了很多很多的努力,尤其是大型互联网公司的运维人员,非常值得点赞。当然了你你这个机会总要 Storm机会Spark所能中有 的了。

现在很多很多公司每天总要产生数以TB级的大数据,怎么可以对哪些地方地方数据进行挖掘,分析成了很重要的课题。比如:

       对于实现的逻辑来说,它们总要 有向无环图的如此 节点,如此怎么可以设计它们之间的消息传递呢?机会说数据怎么可以流动的?机会对于分布式系统来说,或多或少人 如此假定整个运算总要 在同如此 节点上(事实上,对于闭源软件来说,这是能如此的,比如可是我 满足如此 特定运算下的计算,计算平台可是我 需要做的如此通用,如此对于如此 运算逻辑让我在如此 节点完成也是能如此了,毕竟节省了调度和网络传输的开销)。机会说,对于如此 通用的计算平台来说,或多或少人 如此假定任何事情。

除了哪些地方地方Master的HA,还有每个Worker的HA。机会说Worker的HA说法不太准确,想要对于集群里的工作节点来说,它能如此非常容易失败的。这里的HA能如此说是怎么可以让Worker失败后快速重启,重新提供服务。实现措施要能如此由很多很多种。如此 简单的措施可是我 使用如此 容器(Container)启动Worker想要监控Worker的清况 ,机会Worker异常退出,如此就重新启动它。你你这个措施很简单也很有效。

正文开始了了:

本文对流式系统出現的背景,特点,数据HA,服务HA,节点间和计算逻辑间的消息传递,存储模型,计算模型,和联 产环境融合总要 涉及。希望对或多或少人 的工作和学习有所帮助。机会本文对您有所帮助,别忘了投一票!点我投票 (机会机会在投票页面,请接着向下看)

流式实时分 布式计算系统可是我 要补救上述大问題的。哪些地方地方系统的并肩形态学 是哪些地方?

消息队列现在是模块之间通信的非常通用的补救方案了。消息队列使得应用应用任务管理器间的通信能如此跨越物理机,这对于分布式系统尤为重要,毕竟或多或少人 如此假定应用应用任务管理器究竟是部署在同一台物理机上还是部署到不同的物理机上。RabbitMQ是应用比较广泛的MQ,关于RabbitMQ能如此看我的如此 专栏:RabbitMQ

Storm和Spark的设计,绝对总要 一篇文章所能补救的。它后面 由非常多的哲学需要或多或少人 仔细去学习。它们能如此说是或多或少人 进行系统设计的良好的范例。本博客在接下来的四天会通过Spark的源码来学习Spark的系统架构。敬请期待!

Storm的你你这个使用ZK的措施还是很值得借鉴的。

HA是分布式系统的必要属性。机会如此HA,人太好系统是不可用的。如此机会实现HA?对于Storm来说,它认为Master节点Nimbus是无清况 的,无清况 是是因为能如此快速恢复,想要Nimbus并如此实现HA(我不知道想要 的Nimbus算是会实现HA,实际上使用ZooKeeper实现节点的HA是开源领域的通用做法)。为哪些地方说Nimbus是无清况 的呢?机会集群所有的元数据都保存到了ZooKeeper(ZK)中。Nimbus定时从ZK获取信息,想要通过向ZK写信息来控制Worker。Worker也是通过从ZK中获取信息,通过你你这个措施,Worker执行从Nimbus传递过来的命令。

回到系统设计你你这个,实际上流式计算系统主可是我 为了离线和近线的机器学习和数据挖掘,想要肯定要保证数据的补救速度:合适系统能如此补救一天的新增数据,想要数据堆积如此大。想要即使有的数据补救丢失了数据,能如此让源头重新发送数据。

      本文主要探讨流式计算系统的设计要点,想要通过对Spark和Storm的实现来给出实例。通过对于系统设计要点的梳理,要能如此帮助或多或少人 更好的学习哪些地方地方系统的实现。最后,看一下国内互联网公司对于哪些地方地方流式系统的应用(仅限于公开发表的内容)。

       而Storm最核心的抽象Streaming可是我 连接Spout,Bolt以及Bolt与Bolt之间的数据流。而数据流的组成单位可是我 Tuple(元组),你你这个Tuple机会由多个Fields构成,每个Field的含义总要 Bolt的定义的想要 制定。也可是我 说,对于如此 Bolt来说,Tuple的格式是定义好的。

当然了,开源社区的闪光点也会影响到闭源产品,闭源产品也会影响开源产品,你你这个相互影响是良性的,能如此推动技术向前发展。

       Spark Streaming是将流式计算分解成一系列短小的批补救作业。这里的批补救引擎是Spark,也可是我 把Spark Streaming的输入数据按照batch size(如1秒)分成一段一段的数据,每一段数据都转加上Spark中的RDD,想要将Spark Streaming中对DStream的Transformation操作变为针对Spark中对RDD的Transformation操作,将RDD经过操作变成后面 结果保位于内存中。整个流式计算根据业务的需求能如此对后面 的结果进行叠加,机会存储到內部设备。下图显示了Spark Streaming的整个流程。

机会本文对您有所帮助,别忘了投一票!点我投票 机会机会在投票页面,如此点击下面吧!

当然了,能如此使用日志的措施。想要日志说说对于错误恢复的时间又是不太能接受的。流式计算系统的特点可是我 要快,机会错误恢复时间太长,如此机会不如直接replay来的快,想要系统设计还更为简单。

对于Storm来说,他的消息分派机制是在定义Topology的想要 就显式定义好的。也可是我 说,应用应用任务管理器的开发者需要清楚的定义各个Bolts之间的关系,下游的Bolt是以哪些地方样的措施获取上游的Bolt发出的Tuple。Storm有六种消息分派模式:

WordCount的例子:

也是通过ZK的leader 选举实现的。Spark使用了百行代码的级别实现了Master的HA,由此可见ZK的功力。

包括Spark和Storm,在国内著名的互联网公司比如百度,淘宝和阿里巴巴总要 应用,想要它究竟贡献了十几条 流量是不得而知的。我了解到的是实际上大每种的流量,尤其是核心流量还是走公司的老架构的。著名的博主陈皓在微博上关于闭源软件和开源软件“特点”之争算是引起了轩然大波,具体讨论能如此见知乎。好的反义词引用你你这个争论也是为了切合本小节的主题:怎么可以与公司已有的生产环境进行融合。

人太好互联网公司的产品迭代调快,想要公司的核心算法和架构基本上改动我很多 如此多,想要公司不机会为了推动Storm和Spark你你这个开源产品而进行大规模的重新开发。如此如此后起的项目,从零开始了了的项目,比如小规模的调研项目才机会用哪些地方地方产品。当然了开源产品首先是如此 通用的平台,想要通用有机会产生的代价可是我 不如此高效,对于或多或少特殊地方的如此根据特殊的应用场景进行优化。机会对你你这个开源平台进行二次开发,使得性能方面满足我个人的需求,首先不管法务上的大问題,对于我个人私有版本和社区版本进行merge也是个很大的challenge。就像现在很多很多公司对于Linux进行了二次裁剪,开发我个人需要的Linux一样。都需要或多或少对于哪些地方地方架构非常熟悉,想要非常熟悉社区动态的人去做哪些地方地方事情。而哪些地方地方在互联网公司,基本上是不机会的。想要大每种想要 ,总要 我个人做如此 系统,去非常高效切合的去满足自身的需求。

      消息传递和分派是取决于系统的具体实现的。通过对比Storm和Spark,你就明白我为哪些地方如此说了。

当然了还有所谓的性能大问題,具体能如此访问Netty作者的blog。结论可是我 Netty的性能比ZMQ(在默认配置下)好两倍。我不知道所谓的ZMQ的默认配置是哪些地方。反正我对你你这个结果挺惊讶。当然了,Netty使用Java实现的确方便了在Worker之间的通信加上授权和认证机制。你你这个使用ZMQ的确是不太好做。

对于Spark来说,数据流是在通过将用户定义的一系列的RDD转化成DAG图,想要DAG Scheduler把你你这个DAG转化成如此 TaskSet,而你你这个TaskSet就能如此向集群申请计算资源,集群把你你这个TaskSet部署到Worker中去运算了。当然了,对于开发者来说,他的任务是定义或多或少RDD,在RDD上做相应的转化动作,最后系统会将你你这个系列的RDD投放上去Spark的集群中去运行。

        而补救哪些地方地方海量数据的,可是我 实时流式计算系统。Spark是实时计算的系统,支持流式计算,批补救和实时查询。它使用如此 通用的stack补救了很多很多大问題,毕竟任何公司都想要Unified的平台去补救遇到的大问題,能如此减少开发和维护的人力成本和部署平台的物力成本。除了Spark,流式计算系统最有名的可是我 Twitter的Storm和Yahoo的S4(人太好Spark的流式计算还是要弱于Storm的,我个人认为互联网公司对于Storm的部署还是多于Spark的)。

还有另外如此 话题,可是我 系统的元数据信心怎么可以保存,机会系统的路由信息等需可是我 全局可见的,需要保存例如的哪些地方地方数据以供集群查询。当然了Master节点保持了和所有节点的心跳,它删改能如此保存哪些地方地方数据,想要在心跳中能如此返回哪些地方地方数据。实际上HDFS的NameNode可是我 如此做的。HDFS的NN你你这个设计非常合理,为哪些地方如此说?HDFS的元数据中有 了非常多的数据:

        Hadoop定义了Map和Reduce,使得应用者只需要实现MR就能如此实现数据补救。而流式系统的特点,允许它们能如此进行更加具体或多或少的原语设计。流式的数据的特点可是我 数据时源源不断进入系统的,而哪些地方地方数据的补救一般都需要十几条 阶段。拿普通的日志补救来说,或多或少人 机会仅仅关注Error的日志,如此系统的第如此 计算逻辑可是我 进行filer。接下来机会需要对你你这个日志进行分段,分段后机会交给不同的规则补救器进行补救。想要,数据补救一般是分阶段的,能如此说是如此 有向无环图,机会说是如此 拓扑。实际上,Spark抽象出的运算逻辑可是我 由RDD(Resilient Distributed Dataset)构成DAG(Directed Acyclic Graph),而Storm则有Spout和Blot构成Topology(拓扑)。

流式系统的原语设计,要关注一下几点:

提到MQ,不得不提的是ZeroMQ。ZeroMQ封装了Socket,引用官方的说法: “ZMQ (以下 ZeroMQ 简称 ZMQ)是如此 简单好用的传输层,像框架一样的如此 socket library,他使得 Socket 编程更加简单、简洁和性能更高。是如此 消息补救队列库,可在多个应用任务管理器、内核和主机盒之间弹性伸缩。ZMQ 的明确目标是“成为标准网络协议栈的一每种,想要 进入 Linux 内核”。现在还未看多它们的成功。想要,它无疑是极具前景的、想可是我或多或少人 更加需要的“传统”BSD 套接字之上的一层封装。ZMQ 让编写高性能网络应用应用任务管理器极为简单和有趣。”

想要, ZeroMQ总要 传统意义上的MQ。它比较适用于节点之间和节点与Master之间的通信。Storm在0.8想要 的Worker之间的通信可是我 通过ZeroMQ。想要为哪些地方0.9可是我 用Netty替代了ZeroMQ呢?说替代不大合适,可是我 0.9的默认的Worker之间的通信是使用了Netty,ZeroMQ还是支持的。Storm官方认为ZeroMQ有以下缺点:

人太好,数据不丢失有想要 和补救速度是矛盾的。为了数据不丢失就要进行数据持久化,数据持久化是是因为要写硬盘,在固态硬盘还如此成为标配的今天,硬盘的IO速度永远是系统的痛点。当然了能如此在另外节点的内存上进行备份,想要这涉及到了集群的如此 稀缺资源:内存和网络。机会机会备份而占用了大量的网络速度说说,那必将影响系统的性能,吞吐量。

人太好机会总要 为了追求200%的数据丢失,能如此使用checkpoint的机制,允许如此 时间窗口内的数据丢失。

Spark是怎么可以实现HA的?我的另外一篇文章分析过Spark的Master是怎么能实现HA的:Spark技术内幕:Master基于ZooKeeper的High Availability(HA)源码实现 。