Spark基础解析

Spark 概述

什么是 Spark

Spark 是一种快速、通用、可扩展的大数据分析引擎,2009 年诞生于加州大学伯克利分校AMPLab,2010 年开源,2013 年 6 月成为 Apache 孵化项目,2014 年 2 月成为 Apache 顶级项目。项目是用 Scala 进行编写 。

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,并且与 SparkCore 中的 RDD API 高度对应。
  • Spark MLlib:提供常见的机器学习(ML)功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据导入等额外的支持功能。
  • 集群管理器:Spark 设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计算。为了实现这样的要求,同时获得最大灵活性,Spark 支持在各种集群管理器 (ClusterManager)上运行,包括 Hadoop YARN、Apache Mesos,以及 Spark自带的一个简易调度 器,叫作独立调度器。

Spark特点

与 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 可以非常方便地与其他的开源产品进行融合。比如,Spark 可以使用 Hadoop的 YARN 和 Apache Mesos 作为它的资源管理和调度器,器,并且可以处理所有Hadoop 支持的数据,包括 HDFS、HBase 和 Cassandra 等。这对于已经部署 Hadoop集群的用户特别重要,因为不需要做任何数据迁移就可以使用 Spark 的强大处理
能力。Spark 也可以不依赖于第三方的资源管理和调度器,它实现了 Standalone作为其内置的资源管理和调度框架,这样进一步降低了 Spark 的使用门槛,使得所有人都可以非常容易地部署和使用 Spark。此外,Spark 还提供了在 EC2 上部署 Standalone 的 Spark 集群的工具。

Spark 运行模式

Spark 安装地址

1.官网地址
http://spark.apache.org/
2.文档查看地址
https://spark.apache.org/docs/2.1.1/
3.下载地址
https://spark.apache.org/downloads.html

Local 模式

概述

  • Local 模式就是运行在一台计算机上的模式,通常就是用于在本机上练手和测试。它可以通过以下集中方式设置 Master。
  • Local:所有计算都运行在一个线程当中,没有任何并行计算,通常我们在本机执一些测试代码,或者练手,就用这种模式。
  • Local[K]指定使用几个线程来运行计算,比如 local[4]就是运行 4 个 Worker线程。通常我们的 Cpu 有几个 Core,就指定几个线程,最大化利用 Cpu 的计算能力
  • Loca[*]这种模式直接帮你按照 Cpu 最多 Cores 来设置线程数了。

安装使用

1)上传并解压 spark 安装包

[root@bigdata111 sorfware]$ tar -zxvf
spark-2.1.1-bin-hadoop2.7.tgz -C /opt/module/
[root@bigdata111 module]$ mv spark-2.1.1-bin-hadoop2.7 spark

2)官方求 PI 案例

[root@bigdata111 spark]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--executor-memory 1G \
--total-executor-cores 2 \
./examples/jars/spark-examples_2.11-2.1.1.jar \
100

基本语法

bin/spark-submit \
--class <main-class>
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]

参数说明:

  • –master 指定 Master 的地址,默认为 Local
  • –class: 你的应用的启动类 (org.apache.spark.examples.SparkPi)
    –deploy-mode: 是否发布你的驱动到 worker 节点(cluster) 或者作为一个本地客户端(client) (default: client)*
  • –conf: 任意的 Spark 配置属性, 格式 key=value. 如果值包含空格,可以加引号 “key=value”
  • application-jar: 打包好的应用 jar,包含依赖. 这个 URL 在集群中全局可见。比如 hdfs://共享存储系统,
    如果是 file:// path, 那么所有的节点的 path 都包含同样的 jar application-arguments: 传给 main()方法的参数
  • –executor-memory 1G 指定每个 executor 可用内存为 1G
  • –total-executor-cores 2 指定每个 executor 使用的 cup 核数为 2 个
    3)结果展示
    该结果是利用蒙特·卡罗算法求 PI结果
    在这里插入图片描述4)准备文件
[root@bigdata111 spark]$ mkdir input

在 input 下创建 3 个文件 1.txt 和 2.txt,并输入以下内容

hello root
hello spark

5)启动 spark-shell
在这里插入图片描述开启另一个 CRD 窗口

在这里插入图片描述
可登录 ip名称:4040 查看程序运行
在这里插入图片描述6)运行 WordCount 程序

scala>sc.textFile("input").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
res0: Array[(String, Int)] = Array((hello,2), (root,1), (spark,1))
scala>

可登录 ip名称:4040 查看程序运行
在这里插入图片描述

提交流程

1)提交任务分析:
在这里插入图片描述重要角色:
Driver(驱动器)
Spark 的驱动器是执行开发程序中的 main 方法的进程。它负责开发人员编写的用来创
建 SparkContext、创建 RDD,以及进行 RDD 的转化操作和行动操作代码的执行。如果你是用 spark shell,那么当你启动 Spark shell 的时候,系统后台自启了一个 Spark 驱动器程序,就是在 Spark shell 中预加载的一个叫作 sc 的 SparkContext 对象。如果驱动器程序终止,那么 Spark 应用也就结束了。主要负责:
1)把用户程序转为任务
2)跟踪 Executor 的运行状况
3)为执行器节点调度任务
4)UI 展示应用运行状况

Executor(执行器)
Spark Executor 是一个工作进程,负责在 Spark 作业中运行任务,任务间相互独立。Spark应用启动时,Executor 节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。如果有 Executor 节点发生了故障或崩溃,Spark 应用也可以继续执行,会将出错节点上的任务调度到其他 Executor 节点上继续运行。主要负责:
1)负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程;
2)通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式
存储。RDD 是直接缓存在 Executor 进程内的,因此任务可以在运行时充分利用缓存数据加速运算。

数据流程

textFile(“input”):读取本地文件 input 文件夹数据;
flatMap(.split(" ")):压平操作,按照空格分割符将一行数据映射成一个个单词;
map((
,1)):对每一个元素操作,将单词映射为元组;
reduceByKey(+):按照 key 将值进行聚合,相加;
collect:将数据收集到 Driver 端展示。

Standalone模式

概述

构建一个由 Master+Slave 构成的 Spark 集群,Spark 运行在集群中。
在这里插入图片描述

安装使用

1)进入 spark 安装目录下的 conf 文件夹

[root@bigdata111 module]$ cd spark/conf/

2)修改配置文件名称

[root@bigdata111 conf]$ mv slaves.template slaves
[root@bigdata111 conf]$ mv spark-env.sh.template spark-env.sh

3)修改 slave 文件,添加 work 节点:

[root@bigdata111 conf]$ vi slaves
bigdata111  //三台机器的名称
bigdata112 
bigdata113

4)修改 spark-env.sh 文件,添加如下配置:

[root@bigdata111 conf]$ vim spark-env.sh
SPARK_MASTER_HOST=bigdata111
SPARK_MASTER_PORT=7077
 

5)分发 spark 包

[root@bigdata111 module]$ xsync spark/

此处配置好后可使用scp传输进行分发,也可像上述一样写个脚本进行使用
6)启动

[root@bigdata111 spark]$ sbin/start-all.sh

网页查看:bigdata111(ip地址):8080

:如果遇到 “JAVA_HOME not set” 异常,可以在 sbin 目录下的 spark-config.sh 文件中加入如下配置:
export JAVA_HOME=XXXX

7)官方求 PI 案例

[root@bigdata111 spark]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://bigdata111:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
./examples/jars/spark-examples_2.11-2.1.1.jar \
100

8)启动 spark shell

/opt/module/spark/bin/spark-shell \
--master spark://bigdata111:7077 \
--executor-memory 1g \
--total-executor-cores 2

参数:–master spark://bigdata111:7077 指定要连接的集群的 master

JobHistoryServer 配置

1)修改 spark-default.conf.template 名称

[root@bigdata111 conf]$ mv spark-defaults.conf.template
spark-defaults.conf

2)修改 spark-default.conf 文件,开启 Log:

[root@bigdata111 conf]$ vi spark-defaults.conf
spark.eventLog.enabled true
spark.eventLog.dir hdfs://bigdata111:9000/directory

注意:HDFS 上的目录需要提前存在。
3)修改 spark-env.sh 文件,添加如下配置:

[root@bigdata111 conf]$ vi spark-env.sh
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080
-Dspark.history.retainedApplications=30
-Dspark.history.fs.logDirectory=hdfs://bigdata111:9000/directory"

参数描述:
spark.eventLog.dir:Application 在运行过程中所有的信息均记录在该属性指定的路径下
spark.history.ui.port=18080 WEBUI 访问的端口号为 18080
spark.history.fs.logDirectory=hdfs://bigdata111:9000/directory 配置了该属性后,在
start-history-server.sh 时就无需再显式的指定路径,Spark History Server 页面只展示该指定路径下的信息
spark.history.retainedApplications=30 指定保存 Application 历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数。
4)分发配置文件

[root@bigdata111 conf]$ xsync spark-defaults.conf
[root@bigdata111 conf]$ xsync spark-env.sh

5)启动历史服务

[root@bigdata111 spark]$ sbin/start-history-server.sh

6)再次执行任务

[root@bigdata111 spark]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://bigdata111:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
./examples/jars/spark-examples_2.11-2.1.1.jar \
100

7)查看历史服务
bigdata111:18080

HA 配置

在这里插入图片描述1)zookeeper 正常安装并启动
2)修改 spark-env.sh 文件添加如下配置:

[root@bigdata111 conf]$ vi spark-env.sh
注释掉如下内容:
#SPARK_MASTER_HOST=bigdata111
#SPARK_MASTER_PORT=7077

添加上如下内容:

export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=bigdata111,bigdata112 ,bigdata113
-Dspark.deploy.zookeeper.dir=/spark"

3)分发配置文件

[root@bigdata111 conf]$ xsync spark-env.sh

4)在 bigdata111 上启动全部节点

[root@bigdata111 spark]$ sbin/start-all.sh

5)在 bigdata112 上单独启动 master 节点

[root@bigdata112 spark]$ sbin/start-master.sh

6)spark HA 集群访问

/opt/module/spark/bin/spark-shell \
--master spark://bigdata111:7077,bigdata112 :7077 \
--executor-memory 2g \
--total-executor-cores 2

yarn 模式

概述

Spark 客户端直接连接 Yarn,不需要额外构建 Spark 集群。有 yarn-client 和 yarn-cluster
两种模式,主要区别在于:Driver 程序的运行节点。
yarn-client:Driver 程序运行在客户端,适用于交互、调试,希望立即看到 app 的输出
yarn-cluster:Driver 程序运行在由 RM(ResourceManager)启动的AM(APPMaster)
适用于生产环境。
在这里插入图片描述

安装使用

1)修改 hadoop 配置文件 yarn-site.xml,添加如下内容:

[root@bigdata111 hadoop]$ vi yarn-site.xml
<!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,
则直接将其杀掉,默认是 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>

2)修改 spark-env.sh,添加如下配置:

[root@bigdata111 conf]$ vi spark-env.sh
YARN_CONF_DIR=/opt/module/hadoop-2.8.4/etc/hadoop

3)分发配置文件

[root@bigdata111 conf]$ xsync
/opt/module/hadoop-2.8.4/etc/hadoop/yarn-site.xml

4)执行一个程序

[root@bigdata111 spark]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.11-2.1.1.jar \
100

注意:在提交任务之前需启动 HDFS 以及 YARN 集群。

日志查看

1)修改配置文件 spark-defaults.conf
添加如下内容:

spark.yarn.historyServer.address=bigdata111:18080
spark.history.ui.port=18080

2)重启 spark 历史服务

[root@bigdata111 spark]$ sbin/stop-history-server.sh
stopping org.apache.spark.deploy.history.HistoryServer
[root@bigdata111 spark]$ sbin/start-history-server.sh
starting org.apache.spark.deploy.history.HistoryServer, logging to
/opt/module/spark/logs/spark-itstar-org.apache.spark.deploy.histo
ry.HistoryServer-1-bigdata111.out

3)提交任务到 Yarn 执行

[root@bigdata111 spark]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.11-2.1.1.jar \
100

4)Web 页面查看日志
bigdata111:8088查看

几种模式的对比

模式 Spark 安装机器数
Local 1
Standalone 3
Yarn 1
需启动的进程 所属者
Spark
Master 及 Worker Spark
Yarn 及 HDFS Hadoop

猜你喜欢

转载自blog.csdn.net/qq_45092505/article/details/107484166