Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
概述
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的四大特点
1) 快:与Hadoop得MR相比,Spark基于内存的运算快100倍(官网说的),基于硬盘也要快10倍以上。Spark实现了高效的DAG执行引擎,可以通过基于内存来高效处理数据流。计算的中间结果存在于内存中;
2) 易用: Spark支持Java,Python和Scala的API,还支持超过80种高级算法,使用户可以快速构建不同应用、而且Spark支持交互式的Python和Scala的shell。可以非常方便的在这些shell中使用Spark集群来验证解决问题。
3) 通用: Spark提供了统一的解决方案。Spark可以用于批处理,交互式查询(SparkSQL),实时流处理(SparkStreaming),机器学习和图计算。
4)兼容性: Spark可以非常方便的和其他的开源产品进行融合。比如说,Spark可以使用Hadoop的YARN和Apache Mesos作为它的资源管理和调度器,并且处理所有Hadoop支持的数据,包括HDFS和HBase等。
Spark的运行模式
重要角色
Driver(驱动器)
Spark的驱动器是执行开发程序中的main方法的进程。它负责开发人员编写的用来创建SparkContext、创建RDD,以及进行RDD的转化操作和行动操作代码的执行。如果你是用spark shell,那么当你启动Spark shell的时候,系统后台自启了一个Spark驱动器程序,就是在Spark shell中预加载的一个叫作 sc的SparkContext对象。如果驱动器程序终止,那么Spark应用也就结束了。主要负责:
1)把用户程序转为作业(JOB)
2)跟踪Executor的运行状况
3)为执行器节点调度任务
4)UI展示应用运行状况
Executor(执行器)
Spark Executor是一个工作进程,负责在 Spark 作业中运行任务,任务间相互独立。Spark 应用启动时,Executor节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。如果有Executor节点发生了故障或崩溃,Spark 应用也可以继续执行,会将出错节点上的任务调度到其他Executor节点上继续运行。主要负责:
1)负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程;
2)通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储。RDD是直接缓存在Executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
Spark的三种安装模式(在Spark内核中,我们在具体说)
Local模式
也就是我们所谓的本地模式,这种模式主要就是我们用来测试用的,这个没什么说明的。基本上将安装包加压后就可以用的。
Standalone模式
这是一个集群模式,构建一个有Master+Slave的Spark集群
在spark-env.sh中,我们修改如下:
1 | SPARK_MASTER_HOST=hadoop101 |
再在我们的slaves中,我们修改如下:
1 | hadoop101 |
然后把我们的Spark包分发到各个集群节点。在启动我们扥集群
1 | xsync spark-2.3.3 |
我们可以看下我们的程序后台:
1 | ===============hadoop101 后台进程=============== |
可以看到的是,我们的master,worker都已经正常启动了。网页查看:hadoop101:8080就可以看到我们的Spark页面了。
JobHistoryServer配置
修改我们的spark-default.conf
1 | spark.eventLog.enabled true |
Note 这里的路径在HDFS上需要存在
修改spark-env.sh文件
1 | export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 |
参数描述
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历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数。
分发我们的配置文件,再重新启动就好了。
HA配置
修改spark-env.sh文件
1 | 注释掉如下内容: |
Yarn模式
Spark客户端直接连接Yarn,不需要额外构建Spark集群。有yarn-client和yarn-cluster两种模式,主要区别在于:Driver程序的运行节点。
yarn-client:Driver程序运行在客户端,适用于交互、调试,希望立即看到app的输出
yarn-cluster:Driver程序运行在由RM(ResourceManager)启动的AP(APPMaster)适用于生产环境。
配置
首先,我们需要在hadoop配置的yarn-site.xml配置中:
1 | <!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true --> |
在修改 spark-env.sh
1 | YARN_CONF_DIR=/opt/module/hadoop-2.7.2/etc/hadoop |
最后分发出去,重启我们的Hadoop集群和Spark.这样,我们就可以去提交我们的程序了。后期会对这个工程做详细说明,在这里就不做太多的介绍。