征途漫漫,惟有奋斗;梦想成真,惟有实干。 ——人民日报
Spark概述
什么是Spark
1、定义
Spark是一种基于内存的快速、通用、可扩展的大数据分析引擎。
2、历史
2009年诞生于加州大学伯克利分校AMPLab, 项目采用Scala编写;
2010年开源;
2013年6月成为Apache孵化项目;
2014年2月成为Apache顶级项目。
xubatian解析:
1 | 在Scala当中的map ,reduce这些方法在spark当中同样也有这些方法。 |
Spark内置模块
Spark Core:实现了Spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark Core中还包含了对弹性分布式数据集(Resilient Distributed DataSet,简称RDD)的API定义;
Spark SQL:是Spark用来操作结构化数据的程序包。通过Spark SQL,我们可以使用 SQL或者Apache Hive版本的SQL方言(HQL)来查询数据。Spark SQL支持多种数据源,比如Hive表、Parquet以及JSON等;
Spark Streaming:是Spark提供的对实时数据进行流式计算的组件。提供了用来操作数据流的API,并且与Spark Core中的 RDD API高度对应;
Spark MLlib:提供常见的机器学习(ML)功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据 导入等额外的支持功能;
集群管理器:Spark 设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计 算。为了实现这样的要求,同时获得最大灵活性,Spark支持在各种集群管理器(Cluster Manager)上运行,包括Hadoop YARN、Apache Mesos,以及Spark自带的一个调度器,叫作独立调度器。
Spark得到了众多大数据公司的支持,这些公司包括Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、腾讯、京东、携程、优酷土豆。当前百度的Spark已应用于大搜索、直达号、百度大数据等业务;阿里利用GraphX构建了大规模的图计算和图挖掘系统,实现了很多生产系统的推荐算法;腾讯Spark集群达到8000台的规模,是当前已知的世界上最大的Spark集群。
Spark特点(DAG)
快
与Hadoop的MapReduce相比,Spark基于内存的运算要快100倍以上,基于硬盘的运算也要快10倍以上。Spark实现了高效的DAG执行引擎,可以通过基于内存来高效处理数据流。计算的中间结果是存在于内存中的。易用
Spark支持Java、Python和Scala的API, 还支持超过80种高级算法,使用户可以快速构建不同的应用。而且Spark支持交互式的Python和Scala的Shell,可以非常方便地在这些Shell中使用Spark集群来验证解决问题的方法。
- 通用
Spark提供了统一的解决方案。Spark可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming) 、机器学习 (Spark MLlib)和图计算(GraphX).这些不同类型的处理都可以在同一个应用中无缝使用。减少了开发和维护的人力成本和部署平台的物力成本。
- 兼容性
Spark可以非常方便地与其他的开源产品进行融合。比如, Spark可以使用Hadoop的YARN和Apache Mesos作为它的资源管理和调度器,并且可以处理所有Hadoop支持的数据,包括HDFS、HBase等。这对于已经部署Hadoop集群的用户特别重要,因为不需要做任何数据迁移就可以使用Spark的强大处理能力。
博主补充
Spark实现了高效的DAG执行引擎。DAG是有向无环图即多个任务之间通过内存来做交互。
多个任务之间直接通过内存来做交互。它可以直接将他们串联起来。而我们之前可能需要用到MR1,MR2,MR3进行落盘操作。
另一个spark快的原因是:
对于MR来说,你整个Map任务和Reduce任务是计算的核心。而map任务和reduce任务你用jps能看到进程吗?不能。也看不到spark当中的maptask和reducetask。这也是spark比mr快的一个比较核心的一个点。一个呢,对于hadoop来说他是使用进程来调度的。我启动一个单独的task都是一个单独的进程。你能jps看到的是进程号。而在spark当中启动一个任务他是线程。你说是调用进程快呢还是线程快呢?我线程我可以事先启动好一个线程池。我要的时候去取一下就完了。嘿嘿~~阴险。这也是spark比mr快的一个很重要的一个点。
Spark运行模式
重点local模式,和yarn模式,为什么不掌握spark自己的呢?
第一重点:
本地模式主要是用于教学和测试.公司当中的一些demo级别的测试也是用本地模式.因为他相对来说,资源消耗等等都比较简单一点.local模式相对来说简单一点.不需要启动很多进程去占用额外的资源
第二重点:
Yarn模式,这个是应用于公司的生产环境.为什么公司的生产环境会用到yarn模式呢?稍微结合standlone模式思考一下.standlone是spark他自己来管理这一套资源.而公司当中其实并不愿意采用standlone模式,而是采用yarn模式比较多.为什么公司当中不用呢?既然spark自己有一套独立的调度资源系统,那你说他和standlone模式兼容性更好还是yarn模式兼容性更好呢?肯定是standlone。因为这是他自己的。那为什么兼容性更好却不用呢?说明他两又有区别,而且区别在公司当中standlone模式比yarn模式更严重一点。我们的mapreduce是yarn分配资源的,我们学过的tez也是yarn分配资源的。Storm也是yarn分配资源的。如果说我们spark也用yarn分配调度资源有什么好处呢?是不是统一的资源调度呢呀!
如果说我们spark当中使用独立的一套呢?会产生资源争抢。因为yarn认为这块资源是我独有的,而spark的standlone也认为这块资源是我独有的,那我分配的时候有可能两个任务就冲突了。但是我交给某一个人统一的安排这个资源,不行就等待,就不会产生资源争抢的问题。这个就是公司当中用yarn模式做的一个点。
Yarn模式在生产环境中用的比较多。主要体现在中小型公司。他整个集群资源规模不大,他整个MR任务,spark任务,或者其他任务都是运行在同一套资源上的。如果告诉你你公司比较有钱,你的spark集群是独立的spark集群。那么我们就用spark的standlone模式。
但是绝大多数公司他的整个集群都是资源混布的。这就比较依赖与统一的资源管理了。这样就不至于产生资源争抢。
我们所讲的几种模式都是在Liunx环境当中开一个shell窗口。类似于之前写的hive,在里面写sql操作。但是实际生产当中,他更多的对于spark来说还是要写代码,打jar包来运行。所以最后是我们写的一个wordcount程序,打jar包来提交到集群上去运行。
Spark安装地址
1.官网地址
http://spark.apache.org
2.文档查看地址
https://spark.apache.org/docs
3.下载地址
https://spark.apache.org/downloads.html
集群角色
注意: 不是standlone模式就没有Master和Worker
Master和Worker
Master和Worker: 负责资源的,具体运行,哪个的代码他不管.用户客户端提交代码后,你告诉我分配3G内存,2核CPU我给你分配就完了. Master和Worker: 是standlone模式所独有的. yarn模式没有. Applicationmaster提交任务前,master和work一定是启动状态.
1)Master
1 | Spark特有资源调度系统的Leader。掌管着整个集群的资源信息,类似于Yarn框架中的ResourceManager,主要功能: |
2)Worker
1 | Spark特有资源调度系统的Slave(奴隶,随从),有多个。每个Slave掌管着所在节点的资源信息,类似于Yarn框架中的NodeManager,主要功能: |
Driver和Executor
Driver和Executor: 负责具体执行的任务.他和具体提执行的任务相关.驱动器和执行器.驱动器是主,执行器是从.M任务的resourcemanager和nodemanager是负责管理资源, 资源申请下来之后他先启动的是Applicationmaster,是当前这个任务的小组长. Driver类似于MR的Applicationmaster . Applicationmaster来了之后,他去执行执行相应的具体的任务.就是mapTask,ReduceTask等.这些task就executer中去运行. Driver和Executer是线程级别的任务.
1)Driver(驱动器)
1 | Spark的驱动器是执行开发程序中的main方法的线程。它负责开发人员编写的用来创建SparkContext (sc)、创建RDD,以及进行RDD的转化操作和行动操作代码的执行。如果你是用Spark Shell,那么当你启动Spark shell的时候,系统后台自启了一个Spark驱动器程序,就是在Spark shell中预加载的一个叫作 sc的SparkContext对象。如果驱动器程序终止,那么Spark应用也就结束了。 |
2)Executor(执行器)
1 | Spark Executor是一个工作节点,负责在 Spark 作业(Job)中运行任务(Task),任务间相互独立。Spark 应用启动时,Executor节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。如果有Executor节点发生了故障或崩溃,Spark 应用也可以继续执行,会将出错节点上的任务调度到其他Executor节点上继续运行。 |
总结
Master和Worker是Spark的守护进程(什么叫守护进程?即一直都在的),即Spark在特定模式下正常运行所必须的进程。
Driver和Executor是临时程序,当有具体任务提交到Spark集群才会开启的程序。其实Driver和Executor是线程. 而Master和Worker是进程.
博主补充
Driver(驱动器) 和 Executer(执行器) 有主从关系, Driver是主,Executer是从.
Driver可以这样理解,MR中资源准备好了之后,要启一个ApplicationMaster,即当前这个任务的守护者,相当于Driver(驱动器). ApplicationMaster启动好了之后,启动相应的任务, 如mapTask,ReduceTask等. 具体的一个个Task去运行,这就相当于Executer里面运行的内容
1.只要你用的是StandLone模式,master和worker将一直都有.如果你是yarn模式就不需要.
- 对于Driver和Executer只有等任务来了才有. 而Driver和Executer,无论本地模式和yarn模式都有, 他和模式没有关系
以下是Spark的几个模式, 它运行的位置可能不一样. standlone的Drive和Executor是由master和Worker来决定位置的.
如果是yarn模式就有ResourceManager来决定位置.
Local模式
本地模式:解压完了就等于安装好了。就和Hadoop一样,解压完了,什么都没改,直接就可以运行jar包了。这个也一样的,直接可以运行jar包
概述
Local模式就是运行在一台计算机上的模式,通常就是用于在本机上练手和测试。它可以通过以下集中方式设置Master。
local: 所有计算都运行在一个Core当中,没有任何并行计算,通常我们在本机执行些测试代码, 或者练手, 就用这种模式;
local[K]: 指定使用K个Core来运行计算,比如local[4]就是运行4个Core来执行;
local[*]: 这种模式直接使用最大Core数。
master叫资源管理器. 我们统称为master.
我们将standlone里面的master, yarn里面的ResourceManager. 以及这里上图的资源管理器都成为master.
安装使用
1)上传并解压spark安装包
1 | [shangbaishuyao@hadoop102 sorfware]$ tar -zxvf spark-2.1.1-bin-hadoop2.7.tgz -C /opt/module/ |
2)官方求PI案例(类似java jar)
1 | [shangbaishuyao@hadoop102 spark]$ bin/spark-submit \ |
(1)基本语法
1 | bin/spark-submit \ |
(2)参数说明
1 | --master 指定Master的地址; |
3)结果
该算法是利用蒙特·卡罗算法求PI
4)准备文件
1 | [shangbaishuyao@hadoop102 spark]$ mkdir input |
5)启动spark-shell
1 | [shangbaishuyao@hadoop102 spark]$ bin/spark-shell |
6)结果图示
7)运行WordCount程序
1 | scala>sc.textFile("input").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect |
可登录hadoop102:4040查看程序运行
提交流程
1)提交任务分析
博主补充解析
因为是Local模式,没有master和worker. 我们在提交任务之前,没有启动任何程序. 所以资源管理者就是本身,就是spark-submit,即他自己管理计算,自己管理资源. 正常提交,提交之后就会运行一个Driver. 其实你在起动spark-shell的时候就已经有了这个Driver了. Driver去资源管理者里注册应用程序,然后启动Executor. 至此,这一套就在起动saprk-shell的时候就已经搞好了. 接下来过程就是我们自己写代码了. 就是Executor反向注册到Driver中产生通信. 然后写代码, 如初始化sparkContext, 任务划分,任务调度等. 调度完后给Executor中去运行.
数据流程
1 | textFile("input"): 读取本地文件input文件夹数据; |
案例分析
Standalone模式
Standalone模式有一组进程叫master和worker
单机模式,这里指的是spark自己来管理整个的计算资源,交给spark来管理了,他也是一个分布式的。但是这个计算资源不跟其他的mapreduce呀或者storm等程序所共用的,他自己来管理的。意思就是说,spark他自己玩自己的。他有一套独立的资源管理系统在里面此模式中有一组进程叫master和worker
概述
1 | 构建一个由Master+Slave构成的Spark集群,使Spark程序运行在集群中,且有Cluster与Client模式(默认是这种)两种。主要区别在于:Driver程序的运行节点不一样。 |
安装使用
1)进入spark安装目录下的conf文件夹
1 | [shangbaishuyao@hadoop102 module]$ cd spark/conf/ |
2)修改配置文件名称
1 | [shangbaishuyao@hadoop102 conf]$ mv slaves.template slaves |
3)修改slave文件,添加work节点
1 | [shangbaishuyao@hadoop102 conf]$ vim slaves |
4)修改spark-env.sh文件,添加如下配置
1 | [shangbaishuyao@hadoop102 conf]$ vim spark-env.sh |
5)分发spark包
1 | [shangbaishuyao@hadoop102 module]$ xsync spark/ |
6)启动
1 | [shangbaishuyao@hadoop102 spark]$ sbin/start-all.sh |
网页查看:hadoop102:8080
注意:如果遇到 “JAVA_HOME not set” 异常,可以在sbin目录下的spark-config.sh 文件中加入如下配置:
1 | export JAVA_HOME=/opt/module/jdk1.8.0_144 |
7)官方求PI案例
1 | [shangbaishuyao@hadoop102 spark]$ bin/spark-submit \ |
8)启动spark shell
1 | /opt/module/spark/bin/spark-shell \ |
JobHistoryServer配置 (查看历史用的,历史服务器)
1)修改spark-default.conf.template名称
1 | [shangbaishuyao@hadoop102 conf]$ mv spark-defaults.conf.template spark-defaults.conf |
2)修改spark-default.conf文件,开启Log (配置的是写)
1 | [shangbaishuyao@hadoop102 conf]$ vi spark-defaults.conf |
注意:HDFS上的目录需要提前存在。
3)修改spark-env.sh文件,添加如下配置 (配置的是读取)
1 | [shangbaishuyao@hadoop102 conf]$ vi spark-env.sh |
参数描述:
spark.eventLog.dir:Application在运行过程中所有的信息均记录在该属性指定的路径下
spark.history.ui.port=18080 WEBUI访问的端口号为18080
spark.history.fs.logDirectory=hdfs://hadoop102:9000/directory配置了该属性后,在start-history-server.sh时就无需再显式的指定路径,Spark History Server页面只展示该指定路径下的信息
spark.history.retainedApplications=30指定保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除。注意:这个是内存中的应用数,而不是页面上显示的应用数。
4)分发配置文件
1 | [shangbaishuyao@hadoop102 conf]$ xsync spark-defaults.conf |
5)启动历史服务
1 | [shangbaishuyao@hadoop102 spark]$ sbin/start-history-server.sh |
6)再次执行任务
1 | [shangbaishuyao@hadoop102 spark]$ bin/spark-submit \ |
7)查看历史服务
1 | hadoop102:18080 |
HA配置
我们worker有三个宕机一个还能用,但是master只有一个,我发高可用,所以我们要将master依赖zookeeper,由zookeeper来选举master,不能让我们直接指定
1)zookeeper正常安装并启动
2)修改spark-env.sh文件,添加如下配置
1 | [shangbaishuyao@hadoop102 conf]$ vi spark-env.sh |
3)分发配置文件
1 | [shangbaishuyao@hadoop102 conf]$ xsync spark-env.sh |
4)在hadoop102上启动全部节点
1 | [shangbaishuyao@hadoop102 spark]$ sbin/start-all.sh |
5)在hadoop103上单独启动master节点
1 | [shangbaishuyao@hadoop103 spark]$ sbin/start-master.sh |
6)spark HA集群访问,一般先连接前面的master,前面挂掉了再连接后面的
1 | /opt/module/spark/bin/spark-shell \ |
Yarn模式
他不需要部署spark集群,我只需要部署yarn集群,因为我所解压的spark只是作为本地客户端,只是提交用,当然你也可以分发, 分发后的目的也就是hadoop102,hadoop103,hadoop104都是可以提交任务而已. 因为yarn模式,我们解压的spark仅仅作为客户端来用的
生产环境当中用的最多的一种模式,就是说spark他有一个计算任务。任务呢,我来执行,但是运行任务的CPU,还有内存这些东西交给yarn来管理。交给yarn来管理其实就是交给resourcemanager和nodemanager来管理。
概述
Spark客户端直接连接Yarn,不需要额外构建Spark集群。有yarn-client和yarn-cluster两种模式,主要区别在于:Driver程序的运行节点。
yarn-client:Driver程序运行在客户端,适用于交互、调试,希望立即看到app的输出
yarn-cluster:Driver程序运行在由RM(ResourceManager)启动的AM(APPMaster)适用于生产环境。
Yarn-cluster提交流程图:
https://www.cnblogs.com/shi-qi/articles/12174206.html
博主解析
安装使用
1)修改hadoop配置文件yarn-site.xml,添加如下内容
[shangbaishuyao@hadoop102 hadoop]$ vi yarn-site.xml
1 | <!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true --> |
2)修改spark-env.sh,添加如下配置
1 | [shangbaishuyao@hadoop102 conf]$ vi spark-env.sh |
3)分发配置文件,只是分发这个配置文件,我spark-yarn要分发吗?不需要.因为我们不需要额外去构建spark集群,yarn是分布式的,而本地的spark-yarn仅仅是做提交任务的客户端,所以
Spark-yarn不许要分发
1 | [shangbaishuyao@hadoop102 conf]$ xsync /opt/module/hadoop-2.7.2/etc/hadoop/yarn-site.xml |
4)执行一个程序
1 | [shangbaishuyao@hadoop102 spark]$ bin/spark-submit \ |
注意:在提交任务之前需启动HDFS以及YARN集群。
Yarn 模式读取的文件是HDFS里面的
日志查看
1)修改配置文件spark-defaults.conf,添加如下内容
1 | spark.yarn.historyServer.address=hadoop102:18080 |
2)重启Spark历史服务
1 | [shangbaishuyao@hadoop102 spark]$ sbin/stop-history-server.sh |
3)提交任务到Yarn执行
1 | [shangbaishuyao@hadoop102 spark]$ bin/spark-submit \ |
4)Web页面查看日志
Mesos模式
(这种很少用,几乎没有公司在用。Mesos也是apache的一个资源调度框架,就和yarn是类似的东西)
Spark客户端直接连接Mesos;不需要额外构建Spark集群。国内应用比较少,更多的是运用yarn调度。
几种模式对比
模式 | Spark安装机器数 | 需启动的进程(提交任务前) | 所属者 |
---|---|---|---|
Local | 1 | 无 | Spark |
Standalone | 3 | Master及Worker | Spark |
Yarn | 1 | Yarn及HDFS | Hadoop |
案例代码
WordCount案例代码:
整个Spark学习案例代码:
https://github.com/ShangBaiShuYao/bigdata
调试补充:
- 本文作者: xubatian
- 本文链接: http://xubatian.cn/spark基础解析/
- 版权声明: 本博客所有文章除特别声明外均为原创,采用 CC BY 4.0 CN协议 许可协议。转载请注明出处:https://www.xubatian.cn/