Spark 运行模式(安装方式)及核心概念介绍

本文介绍了Apache Spark的基本概念、特点和内置模块,包括其历史、速度、易用性、通用性和可融合性。详细讲解了Spark的Local模式、核心概念如Master、Worker、Driver Program、Executor和RDD,以及如何在Standalone模式下配置和运行计算任务。此外,还展示了SparkShell的使用和WordCount程序的执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


首先需要下载 Spark
1.官网地址 http://spark.apache.org/
2.文档查看地址 https://spark.apache.org/docs/2.1.1/
3.下载地址 https://archive.apache.org/dist/spark/
目前最新版本为 2.4.4, 考虑到国内企业使用情况我们仍然选择 2.1.1 来学习. 不过2.x.x 的版本差别都不大.

Spark概述

1.1 什么是 Spark

Spark 是一个快速(基于内存), 通用, 可扩展的集群计算引擎
并且 Spark 目前已经成为 Apache 最活跃的开源项目, 有超过 1000 个活跃的贡献者.

1.1.1历史

1.2009 年,Spark 诞生于 UC Berkeley(加州大学伯克利分校, CAL) 的 AMP 实验室, 项目采用 Scala 编程语言编写.
2.2010 年, Spark 正式对外开源
3.2013 年 6 月, 进入 Apache 孵化器
4.2014 年, 成为 Apache 的顶级项目.
5.目前最新的版本是 2.4.4 (2.1.1)
参考: http://spark.apache.org/history.html

在这里插入图片描述

1.2 Spark 特点

1.2.1 快速

与 Hadoop 的 MapReduce 相比, Spark 基于内存的运算是 MapReduce 的 100 倍.基于硬盘的运算也要快 10 倍以上.
Spark 实现了高效的 DAG 执行引擎, 可以通过基于内存来高效处理数据流.
在这里插入图片描述

1.2.2 易用

Spark 支持 Scala, Java, Python, R 和 SQL 脚本, 并提供了超过 80 种高性能的算法, 非常容易创建并行 App
而且 Spark 支持交互式的 Python 和 Scala 的 shell, 这意味着可以非常方便地在这些 shell 中使用 Spark 集群来验证解决问题的方法, 而不是像以前一样 需要打包, 上传集群, 验证等. 这对于原型开发非常重要.
.在这里插入图片描述

1.2.3通用

Spark 结合了SQL, Streaming和复杂分析.
Spark 提供了大量的类库, 包括 SQL 和 DataFrames, 机器学习(MLlib), 图计算(GraphicX), 实时流处理(Spark Streaming) .
可以把这些类库无缝的柔和在一个 App 中.
减少了开发和维护的人力成本以及部署平台的物力成本.
在这里插入图片描述

1.2.4可融合性

Spark 可以非常方便的与其他开源产品进行融合.
比如, Spark 可以使用 Hadoop 的 YARN 和 Appache Mesos 作为它的资源管理和调度器, 并且可以处理所有 Hadoop 支持的数据, 包括 HDFS, HBase等.
在这里插入图片描述

1.3 Spark 内置模块介绍

在这里插入图片描述

1.3.1 集群管理器(Cluster Manager)

Spark 设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计算。
为了实现这样的要求,同时获得最大灵活性,Spark 支持在各种集群管理器(Cluster Manager)上运行,目前 Spark 支持 3 种集群管理器:
1.Hadoop YARN(在国内使用最广泛)
2.Apache Mesos(国内使用较少, 国外使用较多)
3.Standalone(Spark 自带的资源调度器, 需要在集群中的每台节点上配置 Spark)

1.3.2 SparkCore

实现了 Spark 的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。SparkCore 中还包含了对弹性分布式数据集(Resilient Distributed DataSet,简称RDD)的API定义。

1.3.3 Spark SQL

是 Spark 用来操作结构化数据的程序包。通过SparkSql,我们可以使用 SQL或者Apache Hive 版本的 SQL 方言(HQL)来查询数据。Spark SQL 支持多种数据源,比如 Hive 表、Parquet 以及 JSON 等。

1.3.4 Spark Streaming

是 Spark 提供的对实时数据进行流式计算的组件。提供了用来操作数据流的 API,并且与 Spark Core 中的 RDD API 高度对应。

1.3.5 Spark MLlib

提供常见的机器学习 (ML) 功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据导入等额外的支持功能。
在这里插入图片描述
Spark 得到了众多大数据公司的支持,这些公司包括 Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、阿里、腾讯、京东、携程、优酷土豆。
当前百度的 Spark 已应用于大搜索、直达号、百度大数据等业务;
阿里利用 GraphX 构建了大规模的图计算和图挖掘系统,实现了很多生产系统的推荐算法;
腾讯Spark集群达到 8000 台的规模,是当前已知的世界上最大的 Spark 集群。

Spark模式及概念

2.1 Local 模式

Local 模式就是指的只在一台计算机上来运行 Spark.
通常用于测试的目的来使用 Local 模式, 实际的生产环境中不会使用 Local 模式.

2.1.1 解压 Spark 安装包

把安装包上传到/opt/software/下, 并解压到/opt/module/目录下

tar -zxvf spark-2.1.1-bin-hadoop2.7.tgz -C /opt/module

在这里插入图片描述

然后复制刚刚解压得到的目录, 并命名为spark-local:

cp -r spark-2.1.1-bin-hadoop2.7 spark-local

在这里插入图片描述
我们暂时不配置环境变量。来看一看spark-local的bin目录下的一些命令。
在这里插入图片描述
这时,我们运行一下官方的案例来测试一下spark好不好使?
在bin目录下执行这条命令:

./spark-submit --class org.apache.spark.examples.SparkPi --master local[2] ../examples/jars/spark-examples_2.11-2.1.1.jar 1000

在这里插入图片描述
结果可以算出pi值。
在这里插入图片描述
我们来详细解释一下这句代码的意思。
spark-submit是提交任务的命令,- -class是指定我要处理的任务的类名。- -master local[2]是指定我要开启2个cpu去处理这个任务,然后examlexxxxxx这是指定sparkpi这个类的jar包在哪里,然后1000是指定进行1000次迭代,越大最终的值越准确。

然后下面还有一个命令与上述命令等价:

 ./run-example SparkPi 1000

此命令是专门跑官方案例的,只需要传入类的名字(不必全类名)和迭代次数。
在这里插入图片描述

2.1.2 使用 Spark-shell

Spark-shell 是 Spark 给我们提供的交互式命令窗口(类似于 Scala 的 REPL)
本案例在 Spark-shell 中使用 Spark 来统计文件中各个单词的数量.

步骤1: 创建 2 个文本文件
mkdir input
cd input
touch 1.txt
touch 2.txt
分别在 1.txt 和 2.txt 内输入一些单词.

步骤2: 打开 Spark-shell
bin/spark-shell,会进入到一个Scala交互式窗口。

在这里插入图片描述
步骤3: 查看进程和通过 web 查看应用程序运行情况
在这里插入图片描述
地址: http://hadoop1:4040
在这里插入图片描述
步骤4: 运行 wordcount 程序

sc.textFile("input/").flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).collect

运行结果如下:
在这里插入图片描述
步骤5: 登录hadoop1:4040查看程序运行(但是只有程序跑的时候才能看,程序已结束就看不了了)

在这里插入图片描述

2.1.3 wordcount 数据流程分析:

在这里插入图片描述

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

3.1 Spark核心概念

3.1.1Master

Spark 特有资源调度系统的 Leader。在standalone模式下被称为master,掌管着整个集群的资源信息,在Yarn 模式中就叫ResourceManager,主要功能:
1.监听 Worker,看 Worker 是否正常工作;
2.Master 对 Worker、Application 等的管理(接收 Worker 的注册并管理所有的Worker,接收 Client 提交的 Application,调度等待的 Application 并向Worker 提交)。

3.1.2Worker

Spark 特有资源调度系统的 Slave,有多个。在standalone模式下叫worker,每个 worker掌管着所在节点的资源信息,类似于 Yarn 框架中的 NodeManager,主要功能:
1.通过 RegisterWorker 注册到 Master;
2.定时发送心跳给 Master;
3.根据 Master 发送的 Application 配置进程环境,并启动 ExecutorBackend(执行 Task 所需的临时进程)

3.1.3 driver program(驱动程序)

每个 Spark 应用程序都包含一个驱动程序, 驱动程序负责把并行操作发布到集群上.
驱动程序包含 Spark 应用程序中的主函数, 定义了分布式数据集以应用在集群中.
在前面的wordcount案例集中, spark-shell 就是我们的驱动程序, 所以我们可以在其中键入我们任何想要的操作, 然后由他负责发布.
驱动程序通过SparkContext对象来访问 Spark, SparkContext对象相当于一个到 Spark 集群的连接.
在 spark-shell 中, 会自动创建一个SparkContext对象, 并把这个对象命名为sc.
在这里插入图片描述

3.1.4executor(执行器)

SparkContext对象一旦成功连接到集群管理器, 就可以获取到集群中每个节点上的执行器(executor).
执行器是一个进程(进程名: ExecutorBackend, 运行在 Worker 节点上), 用来执行计算和为应用程序存储数据.
然后, Spark 会发送应用程序代码(比如:jar包)到每个执行器. 最后, SparkContext对象发送任务到执行器开始执行程序.

在这里插入图片描述

3.1.5RDDs(Resilient Distributed Dataset) 弹性分布式数据集

一旦拥有了SparkContext对象, 就可以使用它来创建 RDD 了. 在前面的例子中, 我们调用sc.textFile(…)来创建了一个 RDD, 表示文件中的每一行文本. 我们可以对这些文本行运行各种各样的操作.

3.1.6cluster managers(集群管理器)

为了在一个 Spark 集群上运行计算, SparkContext对象可以连接到几种集群管理器(Spark’s own standalone cluster manager, Mesos or YARN).
集群管理器负责跨应用程序分配资源.

3.1.7 Deploy Mode

Distinguishes where the driver process runs. In “cluster” mode, the framework launches the driver inside of the cluster. In “client” mode, the submitter launches the driver outside of the cluster.
这个参数的意思就是区分driver进程在哪里运行,如果不写这个参数,默认是在client运行。举个例子,我的spark集群在北京,而我人是在成都,我从成都的客户端连接北京的集群,然后我在成都执行一个spark计算任务,参数给的client,然后driver进程就是在我成都的客户端启动,然后将计算任务提交给北京。如果我配置的参数是cluster,那么driver进程就在北京启动。

3.2 standalone模式

构建一个由 Master + Slave 构成的 Spark 集群,Spark 运行在集群中。
这个要和 Hadoop 中的 Standalone 区别开来. 这里的 Standalone 是指只用 Spark 来搭建一个集群, 不需要借助其他的框架.是相对于 Yarn 和 Mesos 来说的.

配置standalone模式

步骤1: 复制 spark, 并命名为spark-standalone

cp -r spark-2.1.1-bin-hadoop2.7 spark-standalone

步骤2: 进入配置文件目录conf, 配置spark-evn.sh

cd conf/
cp spark-env.sh.template spark-env.sh

在spark-env.sh文件中配置如下内容:
SPARK_MASTER_HOST=hadoop201
SPARK_MASTER_PORT=7077 # 默认端口就是7077, 可以省略不配

在这里插入图片描述
在这里插入图片描述

步骤3: 修改 slaves 文件, 添加 worker 节点

cp slaves.template slaves

在这里插入图片描述

在slaves文件中配置如下内容:
hadoop1
hadoop2
hadoop3

在这里插入图片描述

步骤4: 分发spark-standalone
将改好的spark-standalone分给其他机子,如下图所示命令。
在这里插入图片描述

步骤5: 启动 Spark 集群
由于我配置的是hadoop2是master,那么我就要在hadoop2上执行下述命令,先进入到spark-standalone目录下,执行下述命令:

sbin/start-all.sh

在这里插入图片描述
在这里插入图片描述
步骤6: 在网页中查看 Spark 集群情况
在这里插入图片描述
至此,standalone模式的集群搭建完成。

使用 Standalone 模式运行计算 PI 的程序

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop2:7077 \
--executor-memory 1G \
--total-executor-cores 6 \
--executor-cores 2 \
./examples/jars/spark-examples_2.11-2.1.1.jar 100

在这里插入图片描述

在 Standalone 模式下启动 Spark-shell

bin/spark-shell \
--master spark://hadoop2:7077

在这里插入图片描述

执行之前的wordcount程序
sc.textFile("input/").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect

结果如下:
res4: Array[(String, Int)] = Array((are,2), (how,2), (hello,4), (hahaha,2), (world,2), (you,2))
注意:
•每个worker节点上要有相同的文件夹:input/, 否则会报文件不存在的异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值