0%

大数据计算引擎之Spark基础

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
2
3
4
SPARK_MASTER_HOST=hadoop101
# - SPARK_MASTER_PORT / SPARK_MASTER_WEBUI_PORT, to use non-default ports for the master
SPARK_MASTER_PORT=7077
SPARK_MASTER_WEBUI_PORT=8080

再在我们的slaves中,我们修改如下:

1
2
3
hadoop101
hadoop102
hadoop103

然后把我们的Spark包分发到各个集群节点。在启动我们扥集群

1
2
xsync spark-2.3.3
sbin/start-all.sh

我们可以看下我们的程序后台:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
===============hadoop101 后台进程===============
59424 YarnSessionClusterEntrypoint
53649 HMaster
53873 Elasticsearch
3156 NodeManager
53796 HRegionServer
15224 QuorumPeerMain
2715 NameNode
62907 Worker
62812 Master
2830 DataNode
===============hadoop102 后台进程===============
36336 Elasticsearch
10625 QuorumPeerMain
36279 HRegionServer
2412 ResourceManager
2301 DataNode
37854 Worker
2527 NodeManager
===============hadoop103 后台进程===============
2370 SecondaryNameNode
21652 Elasticsearch
2550 JobHistoryServer
2297 DataNode
23353 Worker
2458 NodeManager
21595 HRegionServer
7356 QuorumPeerMain

可以看到的是,我们的master,worker都已经正常启动了。网页查看:hadoop101:8080就可以看到我们的Spark页面了。

JobHistoryServer配置

修改我们的spark-default.conf

1
2
spark.eventLog.enabled           true
spark.eventLog.dir hdfs://hadoop101:9000/directory

Note 这里的路径在HDFS上需要存在

修改spark-env.sh文件

1
2
3
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 
-Dspark.history.retainedApplications=30
-Dspark.history.fs.logDirectory=hdfs://hadoop102:9000/directory"

参数描述

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
2
3
4
5
6
7
8
注释掉如下内容:
#SPARK_MASTER_HOST=hadoop102
#SPARK_MASTER_PORT=7077
添加上如下内容:
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=hadoop102,hadoop103,hadoop104
-Dspark.deploy.zookeeper.dir=/spark"

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
2
3
4
5
6
7
8
9
10
<!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>

在修改 spark-env.sh

1
YARN_CONF_DIR=/opt/module/hadoop-2.7.2/etc/hadoop

最后分发出去,重启我们的Hadoop集群和Spark.这样,我们就可以去提交我们的程序了。后期会对这个工程做详细说明,在这里就不做太多的介绍。

Spark的部署流程

Spark部署流程

这是打赏的地方...

本文标题:大数据计算引擎之Spark基础

文章作者:Mr.Sun

发布时间:2019年11月22日 - 15:31:45

最后更新:2020年06月15日 - 10:05:35

原始链接:http://www.blog.sun-iot.xyz/posts/94f35dd8

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

---------Thanks for your attention---------