目录
第一部分:认识Spark
一.Spark概述
Spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。
是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发的通用内存并行计算框架Spark得到了众多大数据公司的支持,这些公司包括Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、阿里、腾讯、京东、携程、优酷土豆。当前百度的Spark已应用于大搜索、直达号、百度大数据等业务;阿里利用GraphX构建了大规模的图计算和图挖掘系统,实现了很多生产系统的推荐算法;腾讯Spark集群达到8000台的规模,是当前已知的世界上最大的Spark集群。
二.Spark内置模板
(1)Spark Core:实现了Spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark Core中还包含了对弹性分布式数据集(Resilient Distributed DataSet,简称RDD)的API定义。
(2)Spark SQL:是Spark用来操作结构化数据的程序包。通过Spark SQL,我们可以使用 SQL或者Apache Hive版本的HQL来查询数据。Spark SQL支持多种数据源,比如Hive表、Parquet以及JSON等。
(3)Spark Streaming:是Spark提供的对实时数据进行流式计算的组件。提供了用来操作数据流的API,并且与Spark Core中的 RDD API高度对应。
(4)Spark MLlib:提供常见的机器学习功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据 导入等额外的支持功能。
(5)Spark GraphX:主要用于图形并行计算和图挖掘系统的组件。
三.Spark特点
1.快速:
逻辑回归算法一般需要多次迭代。分别使用HadoopMapReduce和Spark 运行逻辑回归算法,Spark的运行速度是HdoopMapReduce运行速度的100多倍 。一般情况下,对于迭代次数较多的应用程序,Spark在内存中的运行速度是HadoopMapReduce运行速度的100多倍,Spark在磁盘上的运行速度是HadoopMapReduce运行速度的10多倍。
Spark 与 HadoopMapReduce的运行速度差异较大的原因是,Spark的中间数据存放于内存中,有更高的迭代运算效率,而HadoopMapReduce每次迭代的中间数据存放于HDFS中,涉及硬盘的读写,运算效率相对较低。
2.易用:
Spark 支持使用Scala、Python、Java、R等语言快速编写应用。此外,Spark提供超过80个高阶算子,使得编写并行应用程序变得容易。并且Spark提供Scala、Python和R等语言的交互模式界面,使得Spark编程的学习更加简便。
3.通用:
Spark可以与SQL语句、实时计算及其他复杂的分析计算进行良好的结合。Spark 框架包含多个紧密集成的组件,包括Spark SQL(即席查询)、Spark Streaming(实时流处理)、 Spark MLlib(机器学习库)、Spark GraphX(图计算),并且Spark支持在一个应用中同时使用这些组件。相较于Hadoop的MapReduce框架,Spark无论在性能还是在方案统一性等方面,都有着极大的优势。Spark全栈统一的解决方案非常具有吸引力,可极大地减少平台部署、开发和维护的人力和物力成本。
4.随处运行:
用户可以使用Spark的独立集群模式运行Spark,也可以在亚马逊弹性计算云(Amazon Elastic Compute Cloud, Amazon EC2)、HadoopYARN资源管理器或Apache Mesos上运行 Spark。Spark 作为一个分布式计算框架,本身并没有存储功能但是Spark可以从HDFS、 Cassandra、HBase、Hive、Alluxio(Tachyon)等数据源中读取数据。
5.代码简洁:
Spark 支持使用Scala、Python等语言编写代码。Scala和Python的代码相对Java的代码而言比较简洁,因此,在Spark中一般都使用Scala或Python编写应用程序,这也比在 MapReduce中编写应用程序简单方便。例如,MapReduce实现单词计数可能需要60多行代码,而Spark使用Scala语言实现只需要一行。
四.Spark部署与安装
(1)上传并解压安装Spark安装包
(2)设置环境变量
(3)修改配置文件
加一些环境变量:
修改从节点ip
vi slaves 修改内容为slave1 slave2(我的子机分别为是slave1 slave2)
(4)分发文件
(5)分别在slave1 slave2上设置环境变量
(6)启动集群:spark目录下:./start-all.sh
查看节点:
Slave1:
Slave2:
在主节点master上出现Master 在s1上出现Worker在s2上出现Worker
Spark-shell
浏览器查看192.168.10.100:8080
第二部分:扩展
一.核心-RDD
1.设计背景
(1)许多迭代式算法《比如机器学习、图算法等》和交互式数据挖掘工具,共同之处是,不同计算阶段之间会重用中间结果
(2)目前的MapReduce框架都是把中间结果写入到磁盘中,带来大量的数据复制、磁盘Io和序列化开销
(3)RDD就是为了满足这种需求而出现的,它提供了一个抽象的数据结构
(4)我们不必担心底层数据的分布式持性,只需将具体的应用逻辑表达为一系列转换处理
(5)不同RDD之间的转换操作形成依赖关系,可以实现管道化,避免中间数据存储
2.RDD概念
(1)一个RDD就是一个分布式对象集合,本质上是一个只读的分区记录集合,不同节点上进行并行计算
(2)RDD提供了一种高度受限的共享内存模型,RDD是只读的记录分区集合,不能直接修改,只能通过在转换的过程中改
3.RDD特性
(1)高效的容错性
现有容错机制:数据复制或者记录日志RDD具有天生的容错性:血缘关系,重新计算丢失分区,无需回滚系统,重算过程在不同节点之间并行,只记录粗粒度的操作
(2)中间结果持久化到内存,数据在内存中的多个RDD操作直接按进行传递,避免了不必要的读写磁盘开销
(3)存放的数据可以是JAVA对象,避免了不必要的对象序列化和反序列化
4.RDD之间的依赖关系
(1)窄依赖指的是子RDD的一个分区只依赖于某个父RDD中的一个分区。
(2)宽依赖指的是子RDD的每一个分区都依赖于某个父RDD中一个以上的分区。
(3)理解宽、窄依赖的区别,需要先了解父RDD和子RDD。map()、filter()方法上方箭头左边的RDD是父RDD,而右边的RDD是子RDD。union()方法上方箭头左边的两个RDD均为右边RDD的父RDD, union()方法是有两个父RDD 的。
5.RDD运行过程
上述对RDD概念、依赖关系和Stage划分的介绍,结合之前介绍的Spark运行基本流程,再总结一下RDD在Spark架构中的运行过程:
(1)创建RDD对象
(2)SparkContext负责计算RDD之间的依赖关系,构建DAG
(3)DAGScheduler负责把DAG图分解成多个Stage,每个Stage中包含了多个Task,每个Task会被TaskScheduler分发给各个WorkerNode上的Executor去执行。