分享

NoSQL

 懒人葛优瘫 2018-09-26

流式数据处理与Spark

技术产生背景

随着信息时代的到来,数据开始急剧膨胀,业务也变得很复杂,我们每个人都是个数据源,每时每刻都在产生着数据与个性化、实时化的需求,原本的人力以及服务器已经不足以支撑数据处理平台的业务。由此,流式数据处理便应运而生。

在我们的普遍认知中,数据的价值会随着时间的流逝而降低,所以在事件出现后必须尽快对它进行处理,最好是数据出现时便立刻对其进行处理,发生一个事件处理一次,而不是缓存起来进行批处理。

批处理 流处理
数据范围 对数据集中的所有或大部分数据进行查询或处理 对滚动时间窗口内的数据或仅对最近的数据记录进行查询或处理
数据大小 大批量数据 单条记录或包含几条记录的微批量数据
性能 几分钟至几小时的延迟 只需大约几秒或几毫秒的延迟
分析 复杂分析 简单的响应函数、聚合和滚动指标

流式数据处理是针对流式数据的实时处理(计算)。既然要处理流式数据,那么首先要搞明白的该是处理对象本身,既流式数据是什么呢?流式数据是指由数千个数据源持续生成的数据,通常也同时以数据记录的形式发送,规模较小(约几千字节)。

流数据包括多种数据,例如客户使用您的移动或 Web 应用程序生成的日志文件、网购数据、游戏内玩家活动、社交网站信息、金融交易大厅或地理空间服务,以及来自数据中心内所连接设备或仪器的遥测数据。[1]

它具有数据实时持续不断到达、到达次序独立、数据来源众多格式复杂、数据规模大且十分关注存储、注重数据的整体价值而不关注个别数据等特点。

具体而言,流式数据处理一般有三个流程:数据实时采集,数据实时处理,实时查询服务。而这个过程也就对高性能、海量式、实时性、分布式以及可靠性提出了需求,并且,流式数据处理需要两个层:存储层和处理层。存储层需要支持记录定序和高度一致性,以便以快速、便宜且可重复的方式读取和写入大型数据流。处理层负责处理存储层中的数据,基于该数据运行计算,然后通知存储层删除不再需要的数据。除此之外,还必须为存储层和处理层制定可扩展性、数据持久性和容错规划。因此,满足以上性能的流式数据处理系统便炙手可热,随后出现了可提供构建流数据应用程序所需的基础设施的多种平台,Apache Spark便是其中之一。

下面,我们以Spark为例,将会从技术基本原理,应用特点与应用场景这三个方面作以介绍。

技术基本原理

Spark是一个Apache项目,它被标榜为“快如闪电的集群计算”。它拥有一个繁荣的开源社区,并且是目前最活跃的Apache项目。它是基于内存计算的大数据并行计算框架.Spark基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量的廉价硬件之上,形成集群。

Spark诞生于加州大学伯利克分校AMPLab,AMPLab开发以Spark为核心的BDAS时提出的目标是:one stack to rule them all,也就是说在一套软件栈内完成各种大数据分析任务。[2]

Spark生态圈

Spark的整个生态圈如下图所示,最底层为资源管理器,采用Mesos、Yarn等资源管理集群或者Spark自带的Standalone模式,底层存储为文件系统或者其他格式的存储系统如HBase。Spark作为计算框架,为上层多种应用提供服务。Graphx和MLBase提供数据挖掘服务,如图计算和挖掘迭代计算等。Shark提供SQL查询服务,兼容Hive语法,性能比Hive快3-50倍,BlinkDB是一个通过权衡数据精确度来提升查询晌应时间的交互SQL查询引擎,二者都可作为交互式查询使用。Spark Streaming将流式计算分解成一系列短小的批处理计算,并且提供高可靠和吞吐量服务。

Spark Core

Spark Core是一个基本引擎,用于大规模并行和分布式数据处理。它主要负责:

  1. 内存管理和故障恢复
  2. 在集群上安排、分布和监控作业
  3. 和存储系统进行交互

Spark引入了一个称为弹性分布式数据集的概念,它是一个不可变的、容错的、分布式对象集合,我们可以并行的操作这个集合。RDD可以包含任何类型的对象,它在加载外部数据集或者从驱动应用程序分发集合时创建。

RDD支持两种操作类型:[3]

  1. 转换是一种操作(例如映射、过滤、联接、联合等等),它在一个RDD上执行操作,然后创建一个新的RDD来保存结果。
  2. 行动是一种操作(例如归并、计数、第一等等),它在一个RDD上执行某种计算,然后将结果返回。

在Spark中,转换是“懒惰”的,也就是说它们不会立刻计算出结果。相反,它们只是“记住”要执行的操作以及要操作的数据集(例如文件)。只有当行为被调用时,转换才会真正的进行计算,并将结果返回给驱动器程序。这种设计让Spark运行得更有效率。例如,如果一个大文件要通过各种方式进行转换操作,并且文件被传递给第一个行为,那么Spark只会处理文件的第一行内容并将结果返回,而不会处理整个文件。

默认情况下,当你在经过转换的RDD上运行一个行为时,这个RDD有可能会被重新计算。然而,你也可以通过使用持久化或者缓存的方法,将一个RDD持久化从年初在内存中,这样,Spark就会在集群上保留这些元素,当你下一次查询它时,查询速度会快很多。

Spark架构

Spark架构采用了分布式计算中的Master-Slave模型。Master是对应集群中的含有Master进程的节点,Slave是集群中含有Worker进程的节点。Master作为整个集群的控制器,负责整个集群的正常运行;Worker相当于是计算节点,接收主节点命令与进行状态汇报;Executor负责任务的执行;Client作为用户的客户端负责提交应用,Driver负责控制一个应用的执行,如下图所示。

Spark集群部署后,需要在主节点和从节点分别启动Master进程和Worker进程,对整个集群进行控制。在一个Spark应用的执行过程中,Driver和Worker是两个重要角色。Driver程序是应用逻辑执行的起点,负责作业的调度,即Task任务的分发,而多个Worker用来管理计算节点和创建Executor并行处理任务。在执行阶段,Driver会将Task和Task所依赖的file和jar序列化后传递给对应的Worker机器,同时Executor对相应数据分区的任务进行处理。

Spark的整理运行流程为:Client提交应用时,Master找到一个Worker启动Driver,Driver向Master或者资源管理器申请资源,之后将应用转化为RDD Graph,再由DAGScheduler将RDD Graph转化为Stage的有向无环图提交给TaskScheduler,由TaskScheduler提交任务给Executor执行。在任务执行的过程中,其他组件协同工作,确保整个应用顺利执行。[4]

Spark运行逻辑

如下图所示,在Spark应用中,整个执行流程在逻辑上会形成有向无环图(DAG)。Action算子触发之后,将所有累积的算子形成一个有向无环图,然后由调度器调度该图上的任务进行运算。Spark的调度方式与MapReduce有所不同。Spark根据RDD之间不同的依赖关系切分形成不同的阶段(Stage),一个阶段包含一系列函数执行流水线。图中的A、B、C、D、E、F分别代表不同的RDD,RDD内的方框代表分区。数据从HDFS输入,Spark形成RDD A和RDD C,RDD C上执行map操作,转换为RDD D,RDD B和RDDE执行join操作,转换为F,而在B和E连接转化为F的过程中又会执行Shuffle,最后RDD F通过函数saveAsSequenceFile输出并保存到HDFS中。

技术的特点与应用场景

技术特点

今天,Spark已经被很多巨头使用,包括Amazon、eBay以及Yahoo!。很多组织都在拥有成千上万节点的集群上运行Spark。

根据Spark FAQ,已知的最大的Spark集群拥有超过8000个节点,且已经有1000个组织在生产中使用Spark。[5]

Spark的特点可概括为以下几点:

  • 高效易用,拥有Java、Scala、Python和R APIs。
  • 可扩展至超过8000个结点。
  • 能够在内存内缓存数据集以进行交互式数据分析。
  • 与Hadoop集成
  • Scala或Python中的交互式命令行接口可降低横向扩展数据探索的反应时间。
  • Spark Streaming对即时数据流的处理具有可扩充性、高吞吐量、可容错性等特点。
  • Spark SQL支持结构化和和关系式查询处理(SQL)。
  • MLlib机器学习算法[6]和Graphx图形处理算法的高级库。

应用场景分析

Spark是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。需要反复操作的次数越多,所需读取的数据量越大,受益越大,数据量小但是计算密集度较大的场合,受益就相对较小。由于RDD的特性,Spark不适用那种异步细粒度更新状态的应用,例如web服务的存储或者是增量的web爬虫和索引。就是对于那种增量修改的应用模型不适合。数据量不是特别大,但是要求近实时统计分析需求。

参考文献:

[1] https:///cn/streaming-data/

[2] https://zh./wiki/Apache_Spark

[3] http://blog./89446/

[4] http://www.jianshu.com/p/eb2bc8d8ebc0

[5] Apache Spark FAQ. apache.org. Apache Software Foundation. [5 December 2014].

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接(http://www.cnblogs.com/Echo-41/p/7685142.html)。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多