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博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,326评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,228评论 1 304
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,979评论 0 252
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,489评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,894评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,900评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,075评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,803评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,565评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,778评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,255评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,582评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,254评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,151评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,952评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,035评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,839评论 2 277

推荐阅读更多精彩内容