Spark是用来实现快速而通用的集群计算的平台。
在此之前我们学过了Hadoop中的MapReduce,那么就以这两个为例比较一下:
MapReduce:
仅仅只支持Map和Reduce两种模式
处理效率偏低,
1)具体体现在Map的中间结果是写入到磁盘中,Reduce写HDFS中,多个MapReduce与HDFS交互数据频繁,
认读调度较大。
2)没有办法充分的使用内存
3)Map和Reduce端都需要排序,编写不够灵活
Spark:
Spark支持的语言很多,这里仅仅以Scala(函数式编程)为例
Spark确实速度很快(最多比Hadoop MapReduce快100倍)。Spark还可以执行批量处理,然而它真正擅长的是处理流工作负载.
Spark有自己的页面,因为虽然它可以通过YARN(另一种资源协调者)在Hadoop集群中运行,但是它也有一种独立模式。它可以作为 Hadoop模块来运行,也可以作为独立解决方案来运行。
Spark之所以如此快速,原因在于它在内存中处理一切数据。它可以使用磁盘来处理未全部装入到内存中的数据。
笔者这里下载的版本为:spark-2.3.1-bin-hadoop2.7.tgz
放入文件夹后,我们解压即可。然后配置环境变量
export SPARK_HOME=/home/hadoop/spark-2.3.1-bin-hadoop2.7
#PATH
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$HIVE_HOME/bin:$SPARK_HOME/bin
然后配置好之后我们Scoure一下,我们就可以在bin/目录下启动Spark了
我们启动Spark的话需要先启动HDFS ,用来做存储
start -dfs.sh
我们现在可以启动Spark -shell了,启动成功如下:
我们现在看一下红圈中:
Spark中 Web ui端口号为:4040 可以通过主机名和端口访问
其中Sc 是帮我们初始化的一个 SparkContext
驱动器通过SparkContext对象来访问Spark,起名叫sc变量,这里shell可以认为是驱动器
我们可以通过输入Sc查看一下它的类型
scala> sc
res0: org.apache.spark.SparkContext = org.apache.spark.SparkContext@5f3f3d00
一旦有了SparkContext我们就可以创建RDD,这里暂时不详说,后面会有
(master = local[*] app id = local-1541493344996).) 这个代表着我们是本地模式, *是代表进程数用了多少个,
实际上这里应该写两个,一个跑你的任务,一个跑你的driver,但是我这里*代表和你的CPU的核有关
app id是我们启动的应用任务
如下图是 Spark的栈
由图所见,Spark支持Yarn任务调度器和 Other,我们可以打开官网查看,这些是下载了Spark就支持了这些,
实现的部分需要单独部署一套yarn集群 和这一些
由此可见我们知道了,Spark的执行环境分为两个部分 一个是本地,一个是其他(yarn Kubernetes Mesos)
Spark核心是(处理数据,结构是什么样子的):它的核心是数据合区并行
RDD:弹性分布式数据集,可以理解为List,一个RDD可以理解为一个超大的数组,这个数组被劫成一段一段的,因为要做并行化运行,每一段数据数据将来会运行一个进程,最终将运行的数据汇总,又产生了一个新的RDD,保存文件中或者输出到控制台,就是处理掉。
优势:数据不会丢失,是高可靠的
SparkSQL:早期是集成Hive,后来脱离了,自己做了一个SQL Context,这样的话在我们对数据进行统计的时候就不需要写编程代码了,大部分的人也都可以使用Spark了 因为提供的SQL。
Spark和Hadoop的思想是一样的,都是对批量数据进行处理,先准备数据,处理完程序就结束。
所以说又写了一个组件叫做:Spark Streaming,批处理数据和流处理数据:批处理数据不会随着时间的变化而变化,流数据结尾是没有终点的,实时就回来数据,
怎样定义流数据:把流数据切成一段一段的,它的流式数据就是一小段一小段连在一起,就成为了流处理,并不是真实时,
这里讲的都是(2.0和2.0之前的版本)
准,2.0之后Spark 加了一个 Structured Streaming功能,这是一个真实时,采用的式SQL实时来采集数据,造成了它的延迟达到了毫秒级,2.0之前延迟最低只能达到秒级,最短也是一秒得到一次数据,现在是一百毫秒就能得到一次数据。
Spark中还提供了类库做机器学习(MLib(机器学习)、GraphX(图计算),节点之间关系的计算)
以上就是介绍了Spark栈中的东西
那么Spark生态系统,指的是能跟其他东西共同协作,如何Hbase,关系数据库 ,kafka, flume, 非关系数据库,生态系统越丰富,说明它的生命周期越长。
那么这里说一下Spark的劣势: 为什么有同学说,有了Spark就不需要Hadoop了,这是不对了,他们各有各的好处,Spark之所以替换不掉Hadoop是因为,Haddop廉价性,因为它的计算靠磁盘完成的(处理一部分数据把数据放入磁盘而不是内存),而Spark(快速内存计算)处理完是放入到内存中的,虽然速度比Hadoop快了一百倍,但是你是以牺牲了一些东西,机器要求比较高。
1)Driver(具有Spark Context,Spark Session)
2)Worker(具有 Executor(Task))
Driver和Worker如何通讯和资源调度,需要有一个Manger
我们做一个Spark的应用程序,就叫做Application,运行的时候分成两部分 ,一部分是Driver部分,还有一部分是Worker部分 ,
所以我们写的应用代码不是在一个地方执行的,是在两个大类执行的,
Driver代码:你启动应用程序那台机器上执行的,也就是执行在Main方法上的代码,创建Spark Context Spark session sql Context, 创建会话的。
Worker代码:有几个Patition,worker就会启动多少个任务,就是Task, 一个Patition会产生一个Task进程
Job:代表一整个的工作,写一个应用程序就是一个Job
Manger:本地模式还是Yarn模式,还是其他模式,是一个集群管理器,
SparkContext
API无非就是使用某个对象内里面提供的方法,在shell中我们可以直接使用Sc变量.方法,SparkContext是一个会话,做Spark任务时的主要入口,SparkContext是一个非常笨重的对象,所以不要在你的应用程序中不要创建多个,只需要一个就好,
SparkSession:是推荐使用的,包含了SparkContext,和SQLContext,Spark Streaming,HiveContext,所以在Spark2.0之后推荐使用。
RDD:大数组,类型只能是Object
DataFrame:认为是一个RDD里面的数据类型是不强调的,数据类型只能是Row类型
DataSet:集合,支持泛型,支持类型的数组,自定义任何的实体类型
共同:他们都支持了SQL
Spark抽象标准: RDD:东西都是在RDD做出来的 DAG:有向无环图,主要描述操作之间的关系,能做任务的优化
RDD:
简单的概念就认为是一个大数组,是一段一段的,叫做partition,存在集群的内存中的,将来支持各种操作
复杂概念:数据转换的接口,RDD可以将引用的数据存储在HDFS上,宽列数据库中,也能存储在内存中,存储在另一个RDD中,实际上RDD可以引用存在任意位置上的数据,RDD实际上没有数据的,实际上是引用
RDD操作:首先我们要创建或者读入一个RDD,然后对RDD变换操作,处理完之后对数据进行持久化操作,也可能不做,最终将数据产出,这就是整个RDD的操作。
RDD中Partition:每一段成为一个Partition,每一个Partition都会执行一个任务(Task),分在不同的节点上存储的,建议有更多的Partition,程序在执行的过程中才能更好的并行化,但是别特别多!