Spark入门及环境搭建

一、Spark是什么

Spark是Apache下的一个用于大规模数据处理的统一分析引擎,Unified engine for large-scale data analytics.

Spark还是一个支持多语言的(Python、SQL、Scala、Java、R),可以在单节点或者集群上用作数据工程、数据科学和机器学习的内存计算引擎。

Spark借鉴了MapReduce的思想发展而来,保留了其分布式并行计算的优点,并改进了其缺陷,让中间数据存储在内存中从而提高了运行速度,并提供了丰富的操作数据的API,提升了开发的效率。

Spark工作示意图

二、为什么要使用Spark

谈起Spark,就不得不对比Hadoop,相比Hadoop而言,Spark具有更大的优势,但是它并不能完全替代Hadoop,如下是它们之间的一个简单对比:

Hadoop Spark
类型 是大数据基础平台,包括HDFS存储、MapReduce计算、Yarn资源调度 仅是一个计算框架
场景 基于磁盘的海量数据批处理场景 基于内存的海量数据批处理流计算
价格 对机器要求低,价格低 对机器内存要求高,价格贵
编程 MR框架,API较为底层,算法适应性低,编程较为复杂 RDD组成DAG的模式,API较为高层,方便编程
存储 中间计算结果存在HDFS的磁盘上,延迟高 中间计算结果存在内存中,延迟低
运行 Task以进程方式维护,任务启动慢 Task以线程方式维护,任务启动快,可批量创建提高并行能力

总结下来,Spark只是一个计算框架,顶多用来替换Hadoop中的MapReduce计算框架,而HDFS和Yarn仍然是大数据技术栈的主流。

Spark的四大特点是:

  • 速度快,由于是基于DAG的内存计算框架,速度比Hadoop要快100倍;

  • 易于使用,支持Python、SQL、Scala、Java、R在内的主流数据分析语言,用户涵盖面大,API使用简洁高效;

  • 通用性强,支持对接多种数据源,比如LocalFS、HDFS、Hive、Text、CSV、Json等等;

    Spark支持多种数据源

而且在Spark核心的基础上,还提供了SparkSQL、StructedStreaming、SparkStreaming、MLlib、GraphX等工具库,可以在一个应用里面无缝切换使用;

Spark平台工具一览
  • 运行方式灵活,支持多种运行方式,包括local、standalone、Spark on Yarn、Mesos、Kubernetes、云平台等等;

三、Spark是如何工作的

我们在原先学习Yarn的时候,有提到过Yarn里面的角色:

  • ResourceManager,负责整个集群的资源管理和调度;
  • NodeManager,负责当前节点的资源管理并监控资源汇报给ResourceManager;
  • ApplicationMaster,负责应用任务的执行和管理,一个应用任务仅有一个AM,且运行在节点的容器中;
  • TaskContainer,负责具体任务的执行,并汇报给AM,一个应用任务会被拆分为多个Task,运行在任意节点的容器中;
Yarn集群角色示意图

那么Spark想要实现计算任务和资源调度,那么也会拥有类似Yarn的角色和职能:

  • Master,类似Yarn中的ResourceManager,管理整个集群中的资源和调度;在Spark on Yarn的模式下没有Master,由Yarn的ResourceManager替代;
  • Worker,类似Yarn中的NodeManager,管理当前节点的资源并向Master汇报;在Spark on Yarn的模式下没有Worker,由Yarn的NodeManager替代;
  • Driver,类似Yarn中的AM,一个应用任务对应一个Driver,负责管理任务的执行;在Spark on Yarn的模式下,AM和Driver将会并存在节点的容器中;
  • Executor,类似Yarn中的TaskContainer,也是以容器的形式负责具体任务的执行;
Spark集群角色示意图

四、Spark环境搭建

在搭建Spark不同的部署模式之前,我们都需要做一些准备工作,在上面运行方式的内容中,我们介绍了6种,但是本文只介绍如下的2种最常见的,其它的比如Standalone模式需要借助虚拟机实现集群,在企业中很少用到,而Mesos、K8s、和云平台的方式和Spark本身并无关系,就待以后再介绍。

Spark的运行依赖于Hadoop,因此我们需要准备好:

  • 服务器,从阿里云购买ECS服务器,Local模式就买一台,Spark on Yarn集群模式就购买三台;
  • 操作系统,Linux CentOS7.5 X64;
  • JDK,配置好JDK环境,确保java -version能执行;
  • Hadoop,按照往期教程搭建单机或者集群模式的Hadoop环境;

4.1 Local模式

Local模式即本地模式,是一种只能在开发和测试中使用的模式,因为其本质就是启动一个JVM进程,通过启动多个线程来提供并行计算能力执行多个Task任务,其不能算是分布式的集群,不能用在生产环境。Local模式分为:

  • Local[n],n表示线程数,通常n小于等于CPU核心数,可以充分利用CPU的计算能力,n不指定则默认为1;
  • Local[*],表示按照CPU最多的核心数设置线程数;

在Local模式下,因为只有一个进程,所以Master、Worker和Driver角色就是其进程本身,而且不会有Executor角色,任务Task的执行会由Driver启动的多线程来完成并行计算;而且在同一时间,只能执行一个Spark应用程序。

我们能将下载好的Spark压缩包放到/soft目录下并解压缩,下载可以从国内镜像源下载,会快很多。

cd /soft
tar -zxvf spark-3.3.2-bin-hadoop3.tgz

然后我们设置Spark的环境变量:

vim /etc/profile
export SPARK_HOME=/root/soft/spark-3.3.2-bin-hadoop3
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
source /etc/profile

此时,我们就可以运行和使用Spark应用程序了:

# 运行Spark自带的示例程序——计算圆周率
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[2] \
/root/soft/spark-3.3.2-bin-hadoop3/examples/jars/spark-examples_2.12-3.3.2.jar \
20

INFO SparkContext: Running Spark version 3.3.2
......
INFO Utils: Successfully started service 'sparkDriver' on port 34697.
......
INFO Utils: Successfully started service 'SparkUI' on port 4040.
......
INFO Executor: Starting executor ID driver on host node1
......
INFO TaskSetManager: Starting task 0.0 in stage 0.0 (TID 0) (node1, executor driver, partition 0, PROCESS_LOCAL, 4                       578 bytes) taskResourceAssignments Map()
INFO TaskSetManager: Starting task 1.0 in stage 0.0 (TID 1) (node1, executor driver, partition 1, PROCESS_LOCAL, 4                       578 bytes) taskResourceAssignments Map()
......
# 打印出计算结果
Pi is roughly 3.1421555710777858
......
INFO SparkUI: Stopped Spark web UI at http://node1:4040
......
INFO SparkContext: Successfully stopped SparkContext
......

如上是执行提交到Spark的应用程序的模式,执行完成Spark就退出了,其实Spark还是支持命令行模式,命令行模式有很多种,比如:

  • pyspark,python语言的命令行交互窗口;
  • spark-shell,scala语言的命令行交互窗口;
  • sparkR,R语言的命令行交互窗口;
  • spark-sql,SQL语言的命令行交互窗口;

由于Spark本身就是使用scala实现的,我们就使用spark-shell来体验一下命令行交互窗口的使用:

[root@node1 bin]# spark-shell
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
23/03/10 15:10:52 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Spark context Web UI available at http://node1:4040
Spark context available as 'sc' (master = local[*], app id = local-1678432255647).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 3.3.2
      /_/

Using Scala version 2.12.15 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_351)
Type in expressions to have them evaluated.
Type :help for more information.

# 等待输入scala命令
scala> sc.parallelize(Array(1,2,3,4,5)).map(x => x * 10).collect()
res0: Array[Int] = Array(10, 20, 30, 40, 50)

在使用命令行模式的时候,Spark守护进程会一直存在,此时访问4040端口就能看到Spark的一些信息,比如执行器Executor、集群环境信息、任务Job情况、Job执行的Stage情况等;

4.2 Spark onYarn模式

Spark on Yarn集群模式才是企业生产环境中最常使用的模式,由于至少要准备三台服务器,本教程暂时搁置该搭建过程,网上也有很多类似的教程,此处就先省略了。Spark的验证可通过如下命令验证:

jps
844046 ResourceManager
3863790 RunJar
# Spark的Master角色
859128 Master
641310 Jps
# Spark的Worker角色
859973 Worker
504718 JobHistoryServer
3863616 RunJar
843665 SecondaryNameNode
846707 NameNode
894978 QuorumPeerMain


# 进入scala命令交互模式
spark-shell --master yarn
......
scala> sc.parallelize(Array(1,2,3,4,5)).map(x => x * 10).collect()
res0: Array[Int] = Array(10, 20, 30, 40, 50)

# 提交代码运行
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
/root/soft/spark-3.3.2-bin-hadoop3/examples/jars/spark-examples_2.12-3.3.2.jar \
20

......
Pi is roughly 3.1421555710777858

集群Cluster模式:Driver在Yarn的容器中运行,提交任务的客户端可能看不到太多日志信息,性能和网络情况较好,适合生产环境;

客户端Client模式:Driver在提交任务的客户端上运行,方便打印日志,但是网络流量大,延迟会高,适合开发和测试环境;

Spark on yarn的client、cluster模式提交job流程及区别_spark on yarn client_java编程艺术的博客-CSDN博客

你可能感兴趣的:(Spark入门及环境搭建)