当前位置: 首页 > news >正文

Spark:学习笔记

目录

Spark特点

Spark的作用

Spark的体系结构

与现有分布式框架对比

批处理框架

流处理框架

Spark生态系统

1.5 本章小结


转:原文链接 http://blog.csdn.net/xwc35047/article/details/51072145

Spark是一个基于内存的开源计算框架,于2009年诞生于加州大学伯克利分校AMPLab(AMP:Algorithms,Machines,People),它最初属于伯克利大学的研究性项目,后来在2010年正式开源,并于 2013 年成为了 Apache 基金项目,到2014年便成为 Apache 基金的顶级项目,该项目整个发展历程刚过六年时间,但其发展速度非常惊人。正由于Spark来自于大学,其整个发展过程都充满了学术研究的标记,是学术带动Spark核心架构的发展,如

弹性分布式数据集(RDD,resilient distributed datasets)

流处理(Spark streaming)

机器学习(MLlib)

SQL分析(Spark SQL)

图计算(GraphX)

 

Spark特点

Spark之所以这么受关注,主要是因为其有与其他大数据平台不同的特点,主要如下。 
1.轻量级快速处理 
大数据处理中速度往往被置于第一位,Spark允许传统Hadoop集群中的应用程序在内存中以100倍的速度运行,即使在磁盘上运行也能快10倍。Spark通过减少磁盘IO来达到性能的提升,它们将中间处理数据全部放到了内存中。Spark使用了RDD(Resilient Distributed Datasets)数据抽象,这允许它可以在内存中存储数据,只在需要时才持久化到磁盘。这种做法大大的减少了数据处理过程中磁盘的读写,大幅度的降低了运行时间。

2.易于使用 
Spark支持多语言。Spark允许Java、Scala、Python及R(Spark 1.4版最新支持),这允许更多的开发者在自己熟悉的语言环境下进行工作,普及了Spark的应用范围,它自带80多个高等级操作符,允许在shell中进行交互式查询,它多种使用模式的特点让应用更灵活。

3.支持复杂查询 
除了简单的map及reduce操作之外,Spark还支持filter、foreach、reduceByKey、aggregate以及SQL查询、流式查询等复杂查询。Spark更为强大之处是用户可以在同一个工作流中无缝的搭配这些功能,例如Spark可以通过Spark Streaming(1.2.2小节对Spark Streaming有详细介绍)获取流数据,然后对数据进行实时SQL查询或使用MLlib库进行系统推荐,而且这些复杂业务的集成并不复杂,因为它们都基于RDD这一抽象数据集在不同业务过程中进行转换,转换代价小,体现了统一引擎解决不同类型工作场景的特点。有关Streaming技术以及MLlib库和RDD将会这之后几个章节进行详述。

4.实时的流处理 
对比MapReduce只能处理离线数据,Spark还能支持实时流计算。Spark Streaming主要用来对数据进行实时处理,当然在YARN之后Hadoop也可以借助其他的工具进行流式计算。对于Spark Streaming,著名的大数据产品开发公司Cloudera曾经对Spark Streaming有如下评价: 
1)简单、轻量且具备功能强大的API,Sparks Streaming允许用户快速开发流应用程序。 
2)容错能力强,不像其他的流解决方案,比如使用Storm需要额外的配置,而Spark无需额外的代码和配置,因为直接使用其上层应用框架Spark Streaming就可以做大量的恢复和交付工作,让Spark的流计算更适应不同的需求。 
3)集成性好,为流处理和批处理重用了同样的代码,甚至可以将流数据保存到历史数据中(如HDFS)。

5.与已存Hadoop数据整合 
Spark不仅可以独立的运行(使用standalone模式),还可以运行在当下的YARN管理集群中。它还可以读取已有的任何Hadoop数据,这是个非常大的优势,它可以运行在任何Hadoop数据源上,比如HBase、HDFS等。如果合适的话,这个特性让用户可以轻易迁移已有Hadoop应用。

6.活跃和不断壮大的社区 
Spark起源于2009年,当下已有超过50个机构730个工程师贡献过代码,与2014年6月相比2015年代码行数扩大了近三倍(数据源于Spark Summit 2015公布的数据),这是个惊人的增长。

 

 

Spark的作用

为什么现阶段Spark被如此众多的公司应用呢?从需求角度来看,信息行业数据量的不断积累膨胀,传统单机因本身软硬件限制无法处理,很需要能对大量数据进行存储和分析处理的系统,另一方面如Google、Yahoo等大型互联网公司因为业务数据量增长非常快,强劲的需求促进了数据存储和计算分析系统技术的发展,同时公司对大数据处理技术的高效实时性要求越来越高,Spark就是在这样一个需求导向的背景下出现,其设计的目的就是能快速处理多种场景下的大数据问题,能高效挖掘大数据中的价值,从而为业务发展提供决策支持。

目前Spark已经在电商、电信、视频娱乐、零售、商业分析和金融等领域有广泛应用,在本书第四部分的应用篇能看到这些领域公司在Spark方面的应用分享,读者能从中一窥Spark的强大能力。

 

 

 

Spark的体系结构

如图1-5所示,Spark的体系结构不同于Hadoop的MapReduce和HDFS,Spark主要包括Spark Core和在Spark Core基础之上建立的应用框架Spark SQL、Spark Streaming、MLlib和GraphX。

Core库中主要包括上下文(Spark Context)、抽象数据集(RDD)、调度器(Scheduler)、洗牌(shuffle)和序列化器(Serializer)等。Spark系统中的计算、IO、调度和shuffle等系统基本功能都在其中。

在Core库之上就根据业务需求分为用于交互式查询的SQL、实时流处理Streaming、机器学习Mllib和图计算GraphX四大框架,除此外还有一些其他实验性项目如Tachyon、BlinkDB和Tungsten等。这些项目共同组成Spark体系结构,当然Hadoop中的存储系统HDFS迄今仍是不可被替代,一直被各分布式系统所使用,它也是Spark主要应用的持久化存储系统。在1.3节和第四章可以更全面的学习到这四大应用框架的内容。

Spark 体系结构

与现有分布式框架对比

在讲述了关于Spark的背景、特点等内容后,还有一点值得提出的就是点燃大数据处理技术迅猛发展的技术平台应该是始于2004年的Hadoop,然而经过10多年的发展,传统以Hadoop为代表大数据处理技术因其当初设计目的缺陷,已经不能满足当前应用实时性以及迭代运算需求,一批新处理框架如雨后春笋般的出现,如流处理框架Storm、Samza、Spark Streaming和即席查询框架Spark SQL。本节将对他们进行对比,目的是让读者对新老框架的设计目的、应用及趋势有一定了解。

 

 

批处理框架

这里主要对比Hadoop与Spark在批处理方面的区别,他们在设计目的、计算模型和使用场景等方面进行对比,如表1-1所示。

Hadoop与Spark的区别

从表1-1中可以看出,发展10余年的Hadoop解决了处理大数据的问题,但因其设计之初没有考虑到效率,导致在面对迭代计算问题时效率很低,主要原因归结于其M/R计算模型太单一且计算过程中的Shuffle过程对本地硬盘的I/O消耗太大,不能适应复杂需求。不仅如此,当Hadoop要面对SQL交互式查询场景、实时流处理场景以及机器学习场景就力不从心,不得不跟其他第三方应用框架结合,导致不同类型业务(如流处理和SQL交互查询)在衔接过程中因涉及不同的数据格式,数据在共享和转换过程中要消耗大量资源。

大家都知道内存计算速度比机械硬盘快几个数量级,Spark作为基于内存计算大数据处理平台以其高速、多场景适用的特点逐渐脱颖而出,体现了一个堆栈来解决各种场景(One stack rule all)的宗旨。

 

 

流处理框架

storm是一个分布式的、容错的实时计算系统,它由Twitter公司开源,专门用于数据实时处理的平台。它与Spark streaming功能相似,都是将流数据分成一个个小块的批(batch)数据进行数据处理,但也有很多不同,下面主要从处理延迟和容错两个方面进行分析:

 

1.处理模型,延迟 虽然这两个框架都提供可扩展性和容错性,它们根本的区别在于他们的处理模型。Storm处理的是每次传入的一个事件,而Spark Streaming是处理某个时间段窗口内的事件流。因此,Storm处理一个事件可以达到秒内的延迟,而Spark Streaming则有秒级延迟。

2.容错、数据保证 
在容错数据保证方面,Spark Streaming提供了更好的支持容错状态计算。在Storm中,每个单独的记录当它通过系统时必须被跟踪,所以Storm能够至少保证每个记录将被处理一次,但是在从错误中恢复过来时候允许出现重复记录。这意味着可变状态可能被错误的更新两次。

另一方面,Spark Streaming只需要在批级别进行跟踪处理,因此即便一个节点发生故障,也可以有效地保证每个批处理过程的数据将完全被处理一次。实际上Storm的Trident library库也提供了完全一次处理,但它依赖于事务更新状态,这比较慢,通常必须由用户实现。

对于目前版本的Spark Streaming而言,最小选取的批数据量(Batch Size)可以在0.5-2秒钟之间(Storm目前最小的延迟是100ms左右),故Spark Streaming能够满足除对实时性要求非常高(如高频实时交易)之外的流式准实时(“准实时”表示数据延迟在秒级)计算场景。

简而言之,如果需要毫秒级的延迟,Storm是一个不错的选择,而且没有数据丢失。如果需要有状态的计算,计算的时延是秒级,Spark Streaming则更好。Spark Streaming编程逻辑也可能更容易,因为它类似于批处理模型MapReduce,此外Spark因为融合了多种业务模型,如果面对融合不同业务场景,考虑到人工维护成本和数据转换成本,Spark平台能更符合需求。

 

Spark生态系统

Spark设计目的是全栈式解决批处理、结构化数据查询、流计算、图计算和机器学习业务场景,此外其通用性还体现在对存储层(如HDFS、cassandra[ cassandra:最初由Facebook开发的分布式NoSQL数据库,于2008年开源。])和资源管理层(MESOS[ MESOS:AMPLab最初开发的一个集群管理器,提供了有效的、跨分布式应用或框架的资源隔离和共享。]、YARN[ YARN:是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统。])的支持。如图1-6是Spark生态系统,在Spark Core的上层有支持SQL查询的子项目Spark SQL、支持机器学习的MLlib库、支持图计算的GraphX以及支持流计算的Spark Streaming等。这样的生态圈让Spark的核心RDD抽象数据集能在不同应用中使用,大大减少数据转换的消耗和运维管理的资源。

Spark生态系统

图1-6所示的生态系统被AMPLab称为伯克利数据分析栈(BDAS:Berkeley Data Analytics Stack,),下面对BDAS中的主要项目进行介绍。

1.Spark 
作为Spark生态系统的核心,Spark主要提供基于内存计算的功能,不仅包含Hadoop的计算模型的MapReduce,还包含很多其他的如reduceByKey、groupByKey、foreach、join和filter等API。Spark将数据抽象为弹性分布式数据集,有效扩充了Spark编程模型,能让Spark成为多面手,能让交互式查询、流处理、机器学习和图计算的应用无缝交叉融合,极大的扩张了Spark的应用业务场景,同时Spark使用函数式编程语言Scala,让编程更简洁高效。

2.SQL/Shark 
Shark是为了将Hive应用移植到Spark平台下而出现的数据仓库。Shark在HQL(一般将Hive上对SQL支持的语言称为HQL)方面重用了Hive的HQL解析、逻辑计划翻译、执行计划优化等逻辑,可以认为仅将底层物理执行计划从Hadoop的MR作业转移到Spark作业,此外还赖Hive Metastore和Hive SerDe。这样做会导致执行计划过于依赖Hive,不方便添加新的优化策略,因此为了减少对Hive本身框架的依赖,引入Spark SQL解决上述问题。

Spark SQL仅依赖HQL Parser、Hive metastore和Hive SerDe,即说明在解析SQL生成抽象语法树(Abstract Syntax Tree,AST)后的部分都是由Spark SQL自身的Calalyst负责(图1-7所示为Spark SQL与Hive之间的关系),利用scala模式匹配等函数式语言的特性,让Catalyst开发的执行计划优化策略比Hive更简洁。除了HQL以外,Spark SQL还内建了一个精简的SQL parser,以及一套Scala特定领域语言(Domain Specific Language, DSL)。也就是说,如果只是使用Spark SQL内建的SQL方言或Scala DSL对原生RDD对象进行关系查询,用户在开发Spark应用时完全不需要依赖Hive的任何东西,因而日后的发展趋势重点在Spark SQL,对Shark的支持会逐渐淡化。

Spark SQL从Spark1.3开始支持提供一个抽象的编程结构DataFrames,能充当分布式SQL查询引擎。DataFrame本质就是一张关系型数据库中的表,但是底层有很多方面的优化,它能从多种数据源中转化而来,例如结构型数据文件(如Avro, Parquet, ORC, JSON和JDBC)、Hive表、外部数据库或已经存在的RDD。对于Spark SQL,本书将在之后的第4章4.1节对其展开进行更详细的介绍。

这里写图片描述

3.Spark Streaming 
Spark Streaming是基于Spark的上层应用框架,使用内建API,能像写批处理文件一样编写流处理任务,易于使用,它还提供良好的容错特性,能在节点宕机情况下同时恢复丢失的工作和操作状态。

在处理时间方面,Spark Streaming是基于时间片准实时处理,能达到秒级延迟,吞吐量比Storm大,此外还能和Spark SQL与Spark MLlib联合使用,构建强大的流状态运行即席(ad-hoc)查询和实时推荐系统。对于Spark Streaming,本书将在之后第4章4.2节对其展开进行更详细的介绍。

4.GraphX 
GraphX是另一个基于Spark的上层的分布式图计算框架,提供了类似Google图算法引擎Pregel的功能,主要处理社交网络等节点和边模型的问题。因为Spark能很好的支持迭代计算,故处理效率优势明显。GraphX的最新版(Spark 1.4.1)支持PageRank、SVD++和三角形计数等算法。目前国内的淘宝技术部在graphX方面的应用成果很多,可以参考http://rdc.taobao.org了解更多信息。对于GraphX,本书将在之后第4章4.3节对其展开进行更详细的介绍。

5.MLlib 
MLlib是Spark生态系统在机器学习领域的重要应用,它充分发挥Spark迭代计算的优势,能比传统MapReduce模型算法快100倍以上。 
MLlib 1.3实现了逻辑回归、线性SVM、随机森林、K-means、奇异值分解等多种分布式机器学习算法,充分利用RDD的迭代优势,能对大规模数据应用机器学习模型,并能与Spark Streaming、Spark SQL进行协作开发应用,让机器学习算法在基于大数据的预测、推荐和模式识别等方面应用更广泛。对于MLlib以及其中支持的算法,本书将在之后第4章4.4节对其展开进行更详细的介绍。

6.Tachyon 
Tachyon是基于内存的分布式文件系统。过去Spark的计算功能和内存管理都在JVM中,导致JVM负载较高,同时各任务共享数据也不方便,当JVM崩溃后很多缓冲数据也会丢失,为了解决上述问题,从而衍生出Tachyon技术。

其主要设计目的是分离Spark的计算功能和内存管理功能,让内存管理脱离JVM,专门设计Tachyon来在JVM外管理内存数据。这样做解决了Spark在数据共享、缓存数据丢失情况下效率较低的问题,还能减少JVM因为数据量过多导致经常的GC垃圾收集,有效提升了Spark的计算效率。从另一个角度看,Tachyon在Spark计算框架和基于磁盘HDFS之间可看成内存与硬盘之间的缓存,能有效提升数据读取速度。

7.Mesos 
Mesos是一个集群管理器,与YARN功能类似,提供跨分布式应用或框架的资源隔离与共享,上面运行Hadoop(一种类似Spark的分布式系统基础架构)、Hypertable(一种类似Google公司Bigtable的数据库)、Spark,。Mesos使用分布式应用程序协调服务Zookeeper实现容错,同时利用基于Linux的容器隔离任务,支持不同的资源分配计划。

8.YARN 
YARN(Yet Another Resource Negotiator)最初是为Hadoop生态设计的资源管理器,能在上面运行Hadoop、Hive、Pig(Pig是一种基于Hadoop平台的高级过程语言)、Spark等应用框架。在Spark使用方面,YARN与Mesos很大的不同是Mesos是AMPlab开发的资源管理器,对Spark支持力度很大,但国内主流使用仍是YARN,主要是YARN对Hadoop生态的适用性更好。

9.BlinkDB 
BlinkDB 是一个用于在海量数据上运行交互式SQL近似查询的大规模并行查询引擎。它允许用户在查询结果精度和时间上作出权衡,其数据的精度被控制在允许的误差范围内。BlinkDB达到这样目标的两个核心思想分别是提供一个自适应优化框架,从原始数据随着时间的推移建立并维护一组多维样本,另一个是使用一个动态样本选择策略,选择一个适当大小的示例,基于查询的准确性和响应时间来实现需求。

 

Spark的数据存储

Spark本身是基于内存计算的架构,数据的存储也主要分为内存和磁盘两个路径,Spark本身则根据存储位置、是否可序列化和副本数目这几个要素将数据存储分为多种存储级别。此外还可选择使用Tachyon来管理内存数据。

为了适应迭代计算,Spark将经常被重用的数据缓存到内存中以提升数据读取速度,当内存容量有限的时候则将数据存入磁盘中或根据最近最少使用页面置换算法(Least Recently Used,LRU)算法将内存中使用频率较低的文件空间收回,从而让新的数据进来。

Tachyon的出现主要是为了解决三个问题而设计。第一个是多应用数据共享问题,其次是JVM缓存数据丢失问题,再次是GC开销问题。它将过去的Spark中计算和内存管理两个部分分离,专门使用Tachyon在JVM堆外管理Spark计算所需要的数据,极大的减轻了Spark管理上的负担和JVM内存负担。这种设计思路能很好的解决以上三个问题并提升程序运行的稳定性和速度,在第5.4节能了解更多Tachyon的内容。

1.5 本章小结

本章首先对Spark进行概述,对Spark发展历程及目前应用态势进行详细说明,体现了Spark在全球和国内在大数据平台领域如火如荼的发展形势;然后对Spark平台与Hadoop平台在数据批处理以及流式处理方面进行对比分析,让读者知道大数据平台的来龙去脉和发展趋势。最后介绍了Spark的生态系统,Spark作为一个开源分析处理平台,为了应对现实环境中复杂的场景,必然要与不同的框架结合使用才能发挥更好的性能,其中的Spark SQL、Spark Streaming、MLlib和graphX被广泛的应用在工业界各领域,后面章节将对这些技术应用进行详细说明,下一章将学习Spark运行环境和源码阅读环境的搭建方法。

 

相关文章:

  • linux:常用基本命令
  • Spark:数据倾斜处理一般从什么地方入手
  • MapReduce:中map和reduce的数量设置问题
  • MapReduce: 计数器(Counter)
  • Hive:HiveQL中如何排查数据倾斜问题
  • Java:字符序列:String,StringBuilder,StringBuffer三者的区别
  • Hive:分区和分桶
  • sql:Oracle:驱动表是什么?
  • MapReduce:原理之Word Count 以及Java实现
  • Hive:数据倾斜调优/解决方案总结
  • Spark:对数据倾斜的八种处理方法
  • Spark:spark集群中什么是cpu-core 内核?RDD分区个数?集群的节点个数?及三者与并行度的关系
  • Spark:通过sample算子找出导致数据倾斜的key
  • MapReduce:用通俗易懂的大白话讲解MapReduce原理
  • Spark:任务中如何确定spark分区数、task数目、core个数、worker节点个数、excutor数量
  • [PHP内核探索]PHP中的哈希表
  • ES6指北【2】—— 箭头函数
  • 【css3】浏览器内核及其兼容性
  • 0x05 Python数据分析,Anaconda八斩刀
  • dva中组件的懒加载
  • go append函数以及写入
  • java概述
  • JS题目及答案整理
  • LintCode 31. partitionArray 数组划分
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • React中的“虫洞”——Context
  • spring security oauth2 password授权模式
  • 从输入URL到页面加载发生了什么
  • 飞驰在Mesos的涡轮引擎上
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 前端技术周刊 2019-01-14:客户端存储
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 微服务入门【系列视频课程】
  • 一些关于Rust在2019年的思考
  • HanLP分词命名实体提取详解
  • MyCAT水平分库
  • PostgreSQL之连接数修改
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​queue --- 一个同步的队列类​
  • ​人工智能书单(数学基础篇)
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (7)STL算法之交换赋值
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (笔试题)分解质因式
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (未解决)macOS matplotlib 中文是方框
  • (一) springboot详细介绍
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转载)Linux网络编程入门