(一)Spark简介
1、什么是spark
Spark是一种基于内存计算的开源框架。它于2009年诞生于美国加州大学伯克利分校AMPLab,它最初属于研究项目,后来在2010年正式开源,2013年成立apache基金项目,到2014年成为apache基金顶级项目,2014年5月30日,spark1.0正式上线
Spark项目组核心成员在2013年创建了DataBricks公司,到目前为止已经在San Francisco连续举办了从2013年到2015年的spark峰会,会议得到大数据主流数据商
Hortonworks、IBM、cloudrera、MAPR、Pivotal等公司的支持和大数据方案解决商Amazon、DATASTAX和SAP等公司的合作。截止2015年参与开发的已经达到730位,国内参与贡献的公司有阿里巴巴、百度、网易、腾讯和搜狐等公司。代码行数也由2014年的17万行增加到2015年的40万行。Spark最大的集群来自腾讯—8000个节点,单个job最大分别是阿里巴巴和Databricks—1PB
2、spark的特点
(1)轻量级的快速处理
Spark采用Scala语言编写,底层采用了Actor 模型的akka作为通讯框架,并发操作容易实现、功能强大;基于DAG图的执行引擎,减少多次计算之间中间结果写到Hdfs的开销RDD(分布式内存抽象)以基本一致的方式应对不同的大数据处理场景,spark2.0以后又完善DataSet等功能;提供Cache机制来支持需要反复迭代的计算或者多次数据共享,减少数据读取的IO开销;与Hadoop的MapReduce相比,Spark基于内存的运算比MR要快100倍;而基于硬盘的运算也要快10倍
(2)易于使用
Spark支持多种语言,包括Java、Scala、Python、R(1.4版本以后支持),这允许更多的开发者在自己熟悉的语言环境下进行工作,扩大了spark的应用范围。它自带80以上高级操作符,允许在shell中进行交互查询
(3)提供大数据整体解决方案
以其RDD模型的强大表现能力,逐渐形成了一套自己的生态圈,提供了整体的解决方案:主要包括Spark内存中批处理,Spark SQL交互式查询,Spark Streaming流式计算, GraphX和MLlib提供的常用图计算和机器学习算法
(4)实时的流处理(spark Streaming)
Spark支持实时的流处理,spark Streaming有简单、轻量、强大的API、容错能力强、集成性好的特点
(5)与Hadoop无缝衔接
Spark可以使用YARN作为它的集群管理器读取HDFS,Hbase等一切Hadoop的数据,这个特性可以让用户轻而易举的迁移已有的hadoop应用
3、spark的整体架构
(1)Spark的整体架构如下图所示:
Spark提供了多种高级工具: Shark SQL应用于即时查询、Spark Streaming应用于流式计算、 MLlib应用于机器学习、GraphX应用于图处理
Spark可以基于自带的standalone集群管理器独立运行,也可以部署在Apache Mesos 和 Hadoop YARN 等集群管理器上运行
Spark可以访问存储在HDFS、 Hbase、Cassandra、Amazon S3、本地文件系统等等上的数据,Spark支持文本文件,序列文件,以及任何Hadoop的InputFormat
(2)Spark 架构设计
Spark应用在集群上作为独立的进程组来运行,在main程序中通过SparkContext来协调(称之为驱动程序)。具体的说,为了在集群上运行,SparkContext 可以连接至几种类型的Cluster Manager ( 既可以用Spark自己的独立的Cluster Manager, 或者Mesos, 也可以使用YARN),它们会分配应用的资源。一旦连接上,Spark 获得集群中节点上的Executor,这些进程可以运行计算并且为应用存储数据。接下来,它将发送应用代码(通过JAR或者Python文件定义传递给SparkContext) 至Executor最终,SparkContext将发送任务到Executor运行。Spark 运行架构如图10.9所示。
图10.9 Spark运行架构图
关于这个架构有几个需要注意的地方。
第一、每个应用获取到自己的Executor 进程,会在整个应用的生命周期中保持并且在多个线程中运行任务。这样做的优点是在调度方面(每个驱动程序调度自己的任务)和Executor方面( 来自不同应用的任务运行在不同的JVM中)把应用互相隔离。然而这也意味着若不把数据写到外部的存储系统中,数据就不能够在不同的Spark应用SparkContext 的实例)之间共享。
第二、 Spark 是不知道底层的Cluster Manager到底是什么类型的。只要它能够获得Executor进程,并且它们彼此之间可以通信,那么即使是在一个也 支持其他应用的Cluster Manager (例如,Mesos/YARN) 上运行, 也是相对简单的。
第三、driver程序必须在自己的生命周期内监听和接受来自它的Executor的连接请求同样的,driver 程序也必须可以从Worker Node上进行网络寻址。
第四、因为driver 调度了集群上的task, 更好的方式应该是在相同的局域网中靠近Worker Node运行。如果不喜欢发送请求到远程的集群,不如打开一个RPC到diver并让它就近提交操作,而不是从很远的Worker Node上运行个driver。
(3)Spark 运行模式
系统当前支持3种Cluster Manager
第一、独立模式: 包含在Spark中使得它更容易安装集群的一个简单的Cluster Manager。
第二、 Mesos: 一个通用的Cluster Manager,它也可以运行Hadoop MapReduce和其他服务应用。
第三、Hadoop YARN Hadoop 2中的resource manager (资源管理器)。
不管采用什么运行模式,代码都是一样的,只是在提交的时候使用参数指定即可,具体在Spark应用程序开发案例中讲解。
4、Spark2.0版本新特性
第一:更容易的SQL和Streamlined APIs:
Spark 2.0主要聚焦于两个方面:对标准的SQL支持;统一Dataframe和Dataset API。
在SQL方面,Spark 2.0已经显著地扩大了它的SQL功能,比如引进了一个新的ANSI SQL解析器和对子查询的支持。现在Spark 2.0已经可以运行TPC-DS所有的99个查询,这99个查询需要SQL 2003的许多特性。因为SQL是Spark应用程序的主要接口之一,Spark 2.0 SQL的扩展大幅减少了应用程序往Spark迁移的代价
在编程API方面,我们对API进行了精简:
(1) 统一Scala和Java中Dataframes和Datasets的API
从Spark 2.0开始,Dataframe仅仅是Dataset的一个别名。有类型的方法(typed methods)(比如:map, filter, groupByKey)和无类型的方法(untyped methods)(比如:select, groupBy)目前在Dataset类上可用。同样,新的Dataset接口也在Structured Streaming中使用。因为编译时类型安全(compile-time type-safety)在Python和R中并不是语言特性,所以Dataset的概念并不在这些语言中提供相应的API。而Dataframe仍然作为这些语言的主要编程抽象
(2)SparkSession
一个新的切入点,用于替代旧的SQLContext和HiveContext。对于那些使用Dataframe API的用户,一个常见的困惑就是我们正在使用哪个context?现在我们可以使用SparkSession了,其涵括了SQLContext和HiveContext,仅仅提供一个切入点。需要注意的是为了向后兼容,旧的SQLContext和HiveContext目前仍然可以使用
(3)简单以及性能更好的Accumulator API
Spark 2.0中设计出一种新的Accumulator API,它拥有更加简洁的类型层次,而且支持基本类型。为了向后兼容,旧的Accumulator API仍然可以使用
(4)基于Dataframe的Machine Learning API可以作为主要的ML API了:
在Spark 2.0中, spark.ML包以其pipeline API将会作为主要的机器学习API了,而之前的spark.mllib仍然会保存,将来的开发会聚集在基于Dataframe的API上
(5)Machine learning pipeline持久化
现在用户可以保存和加载Spark支持所有语言的Machine learning pipeline和models。
(6)R的分布式算法
在R语言中添加支持了Generalized Linear Models (GLM), Naive Bayes, Survival Regression, and K-Means。
根据以往的调查,91%的用户认为Spark的最重要的方面就是性能,结果性能优化在Spark开发中都会看的比较重。
第二、速度更快:
Spark 2.0中附带了第二代Tungsten engine,这一代引擎是建立在现代编译器和MPP数据库的想法上,并且把它们应用于数据的处理过程中。主要想法是通过在运行期间优化那些拖慢整个查询的代码到一个单独的函数中,消除虚拟函数的调用以及利用CPU寄存器来存放那些中间数据。
第三、更智能:
作为首个尝试统一批处理与流处理计算的工具,Spark Streaming一直是大数据处理的领导者。首个流处理API叫做DStream,在Spark 0.7中初次引入,它为开发者提供了一些强大的特性,包括:只有一次语义,大规模容错,以及高吞吐
然而,在处理了数百个真实世界的Spark Streaming部署之后,我们发现需要在真实世界做决策的应用经常需要不止一个流处理引擎。他们需要深度整合批处理堆栈与流处理堆栈,整合内部存储系统,并且要有处理业务逻辑变更的能力。因此,各大公司需要不止一个流处理引擎,并且需要能让他们开发端对端"持续化应用"的全栈系统
Spark 2.0使用一个新的API:Structured Streaming模块来处理这些用例,与现有流系统相比,Structured Streaming有三个主要的改进:
(1)与批处理作业集成的API
想要运行流数据计算,开发者可针对Dataframe/Dataset API编写批处理计算,过程非常简单,而Spark会自动在流数据模式中执行计算,也就是说在数据输入时实时更新结果。强大的设计令开发者无需费心管理状态与故障,也无需确保应用与批处理作业的同步,这些都由系统自动解决。此外,针对相同的数据,批处理任务总能给出相同的结果
(2)与存储系统的事务交互
Structured Streaming会在整个引擎及存储系统中处理容错与持久化的问题,使得程序员得以很容易地编写应用,令实时更新的数据库可靠地提供、加入静态数据或者移动数据
(3)与Spark的其它组件的深入集成
Structured Streaming支持通过Spark SQL进行流数据的互动查询,可以添加静态数据以及很多已经使用Dataframes的库,还能让开发者得以构建完整的应用,而不只是数据流管道。未来,我们希望能有更多与MLlib及其它libraries的集成出现
(二)Spark的主要概念和整体运行过程
1、spark的主要概念
Spark任务提供多层分解的概念,Spark组件将用户的应用程序分解为内部执行任务并提供执行容器,资源管理器为spark组件提供资源管理和调度
2、spark的整体流程
Spark端到端流程如下图所示:
(1)Spark的Driver Program (简称Driver)包含用户的应用程序
(2)Driver完成task的解析和生成
(3)Driver向Cluster Manager(集群资源管理器)申请运行task需要的资源
(4)集群资源管理器为task分配满足要求的节点,并在节点按照要求创建Executor
创建的Executor向Driver注册
(5)Driver将spark应用程序的代码和文件传送给分配的executor
(6)executor运行task,运行完之后将结果返回给Driver或者写入HDFS或其他介质
3、Spark的安装
(1)在 官网下载Spark