• 流式大数据处理的三种框架:Storm,Spark和Samza


    很多分布式计算系统都能够实时或接近实时地处理大数据流。本文将对三种Apache框架分别进行简介。然后尝试高速、高度概述其异同。

    Apache Storm

    Storm中,先要设计一个用于实时计算的图状结构,我们称之为拓扑(topology)。

    这个拓扑将会被提交给集群。由集群中的主控节点(master node)分发代码,将任务分配给工作节点(worker node)运行。一个拓扑中包含spout和bolt两种角色,当中spout发送消息,负责将数据流以tuple元组的形式发送出去;而bolt则负责转换这些数据流,在bolt中能够完毕计算、过滤等操作。bolt自身也能够随机将数据发送给其它bolt。由spout发射出的tuple是不可变数组,相应着固定的键值对。


    Apache Spark

    Spark Streaming是核心Spark API的一个扩展,它并不会像Storm那样一次一个地处理数据流。而是在处理前按时间间隔预先将其切分为一段一段的批处理作业。

    Spark针对持续性数据流的抽象称为DStream(DiscretizedStream),一个DStream是一个微批处理(micro-batching)的RDD(弹性分布式数据集)。而RDD则是一种分布式数据集,可以以两种方式并行运作。各自是随意函数和滑动窗体数据的转换。


    Apache Samza

    Samza处理数据流时。会分别按次处理每条收到的消息。Samza的流单位既不是元组。也不是Dstream。而是一条条消息。在Samza中,数据流被切分开来,每一个部分都由一组仅仅读消息的有序数列构成,而这些消息每条都有一个特定的ID(offset)。该系统还支持批处理,即逐次处理同一个数据流分区的多条消息。Samza的运行与数据流模块都是可插拔式的。虽然Samza的特色是依赖Hadoop的Yarn(还有一种资源调度器)和Apache Kafka。


    共同之处

    以上三种实时计算系统都是开源的分布式系统,具有低延迟、可扩展和容错性诸多长处,它们的共同特色在于:同意你在执行数据流代码时。将任务分配到一系列具有容错能力的计算机上并行执行。

    此外。它们都提供了简单的API来简化底层实现的复杂程度。

    三种框架的术语名词不同,可是其代表的概念十分相似:


    对照图

    以下表格总结了一些不同之处:


    数据传递形式分为三大类:

    1. 最多一次(At-most-once):消息可能会丢失。这一般是最不理想的结果。

    2. 最少一次(At-least-once):消息可能会再次发送(没有丢失的情况,可是会产生冗余)。在很多用例中已经足够。
    3. 恰好一次(Exactly-once):每条消息都被发送过一次且只一次(没有丢失,没有冗余)。

      这是最佳情况。虽然非常难保证在全部用例中都实现。

    还有一个方面是状态管理:对状态的存储有不同的策略,Spark Streaming将数据写入分布式文件系统中(比如HDFS);Samza使用嵌入式键值存储;而在Storm中。或者将状态管理滚动至应用层面,或者使用更高层面的抽象Trident。

    用例

    这三种框架在处理连续性的大量实时数据时的表现均出色而高效,那么使用哪一种呢?选择时并没有什么硬性规定。最多就是几个指导方针。

    假设你想要的是一个同意增量计算的快速事件处理系统,Storm会是最佳选择。

    它能够应对你在client等待结果的同一时候,进一步进行分布式计算的需求。使用开箱即用的分布式RPC(DRPC)就能够了。

    最后但相同重要的原因:Storm使用Apache Thrift。你能够用不论什么编程语言来编写拓扑结构。假设你须要状态持续。同一时候/或者达到恰好一次的传递效果。应当看看更高层面的Trdent API。它同一时候也提供了微批处理的方式。


    使用Storm的公司有:Twitter,雅虎,Spotify还有The Weather Channel等。

    说到微批处理。假设你必须有状态的计算,恰好一次的递送。而且不介意高延迟的话,那么能够考虑Spark Streaming,特别假设你还计划图形操作、机器学习或者訪问SQL的话,Apache Spark的stack同意你将一些library与数据流相结合(Spark SQL,Mllib。GraphX),它们会提供便捷的一体化编程模型。尤其是数据流算法(比如:K均值流媒体)同意Spark实时决策的促进。

    使用Spark的公司有:亚马逊,雅虎,NASA JPL,eBay还有百度等。

    假设你有大量的状态须要处理,比方每一个分区都有很多十亿位元组,那么能够选择Samza。

    由于Samza将存储与处理放在同一台机器上。在保持处理高效的同一时候,还不会额外加载内存。这样的框架提供了灵活的可插拔API:它的默认execution、消息发送还有存储引擎操作都能够依据你的选择随时进行替换。此外,假设你有大量的数据流处理阶段,且分别来自不同代码库的不同团队,那么Samza的细颗粒工作特性会尤其适用。由于它们能够在影响最小化的前提下完毕添加或移除的工作。

    使用Samza的公司有:LinkedIn,Intuit。Metamarkets,Quantiply,Fortscale等。

    结论

    本文中我们仅仅对这三种Apache框架进行了简单的了解。并未覆盖到这些框架中大量的功能与很多其它细微的差异。

    同一时候。文中这三种框架对照也是受到限制的,由于这些框架都在一直不断的发展,这一点是我们应当牢记的。

  • 相关阅读:
    使用curl命令操作elasticsearch
    Elasticsearch + logstash + kibana 配置
    Solr6.2.0 + zookeeper 集群配置
    Elasticsearch + logstash中文指南
    ELK+kafka构建日志收集系统
    基于docker+etcd+confd + haproxy构建高可用、自发现的web服务
    mongodb配置
    Docker的私有仓库
    GitLab + Jenkins + Docker + Kubernetes。
    ansible 安装使用
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7112532.html
Copyright © 2020-2023  润新知