2024年Spark-3(4),2024年最新这篇文章可以满足你80%日常工作

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2.2.6.2 bin/spark-shell

2.2.6.3 bin/spark-submit (PI)

2.2.7 查看历史服务器 WEB UI

三、Spark 环境搭建-Standalone HA

3.1 背景

3.2 高可用 HA

​3.3 基于 Zookeeper 实现 HA

3.3.1 spark-env.sh

3.3.2 启动 HA 集群

3.3.3 master 主备切换


一、Spark 环境搭建-Local

1.1 服务器环境

  • 已部署好 Hadoop 集群(HDFS\YARN),要求版本 Hadoop3 以上
  • JDK 1.8
  • 操作系统 CentOS 7 (建议 7.6)

本次基于这篇文章的 Hadoop 集群环境搭建 Spark:Hadoop YARN HA 集群安装部署详细图文教程_Stars.Sky的博客-CSDN博客

IP主机名运行角色
192.168.170.136hadoop01namenode datanode resourcemanager nodemanager JournalNode DFSZKFailoverController QuorumPeerMain Spark
192.168.170.137hadoop02namenode datanode resourcemanager nodemanager JournalNode DFSZKFailoverController QuorumPeerMain Spark
192.168.170.138hadoop03datanode nodemanage JournalNode QuorumPeerMain Spark

1.2 基本原理

本质:启动一个 JVM Process 进程(一个进程里面有多个线程),执行任务 Task。

Local 模式可以限制模拟 Spark 集群环境的线程数量, 即 Local[N] 或 Local[*]:

  • 其中 N 代表可以使用 N 个线程,每个线程拥有一个 cpu core。如果不指定 N,则默认是 1 个线程(该线程有 1 个 core)。通常 Cpu 有几个 Core,就指定几个线程,最大化利用计算能力。
  • 如果是 local[*],则代表 Run Spark locally with as many worker threads as logical cores on your machine,按照 Cpu 最多的 Cores 设置线程数。
1.2.1 Local 下的角色分布

资源管理:

  • Master:Local 进程本身。
  • Worker:Local 进程本身。

任务执行:

  • Driver:Local 进程本身。
  • Executor:不存在,没有独立的 Executor 角色,由 Local 进程(也就是 Driver)内的线程提供计算能力。

注意:

  1. Driver 也算一种特殊的 Executor,只不过多数时候,我们将 Executor 当做纯 Worker 对待, 这样和 Driver 好区分(一类是管理一类是工人) 。
  2. Local 模式只能运行一个 Spark 程序,如果执行多个 Spark 程序,那就是由多个相互独立的Local 进程在执行。

1.3 搭建

Spark 下载地址:Apache Downloads

Anaconda 下载地址:Index of /

1.3.1 安装 Anaconda
# 上传安装包后赋予权限
[root@hadoop01 ~]# chmod +x Anaconda3-2023.03-1-Linux-x86_64.sh 

# 执行安装脚本
[root@hadoop01 ~]# ./Anaconda3-2023.03-1-Linux-x86_64.sh 

先按回车键:

再按空格键,直到出现让你输入 yes:
最后输入安装路径,并耐心等待安装完成:

最后进行初始化,输入 yes:

[root@hadoop01 ~]# source ~/.bashrc 

# 测试安装是否成功
(base) [root@hadoop01 ~]# conda list

1.3.1.1 添加国内阿里源
(base) [root@hadoop01 ~]# vim ~/.condarc
channels:
  - defaults
show_channel_urls: true
default_channels:
  - http://mirrors.aliyun.com/anaconda/pkgs/main
  - http://mirrors.aliyun.com/anaconda/pkgs/r
  - http://mirrors.aliyun.com/anaconda/pkgs/msys2
custom_channels:
  conda-forge: http://mirrors.aliyun.com/anaconda/cloud
  msys2: http://mirrors.aliyun.com/anaconda/cloud
  bioconda: http://mirrors.aliyun.com/anaconda/cloud
  menpo: http://mirrors.aliyun.com/anaconda/cloud
  pytorch: http://mirrors.aliyun.com/anaconda/cloud
  simpleitk: http://mirrors.aliyun.com/anaconda/cloud

# 清除索引缓存
(base) [root@hadoop01 ~]# conda clean -i

1.3.2 创建 pyspark 环境
# 查看 python 版本
[root@hadoop01 ~]# python
Python 3.10.9 (main, Mar  1 2023, 18:23:06) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()

# 创建一个新的独立的 Python 环境
[root@hadoop01 ~]# conda create -n pyspark python=3.10.9

# 切换环境
[root@hadoop01 ~]# conda activate pyspark                                                                                                               
(pyspark) [root@hadoop01 ~]#
1.3.3 安装 spark
(pyspark) [root@hadoop01 ~]# tar -zxvf spark-3.2.4-bin-hadoop3.2.tgz -C /bigdata/
(pyspark) [root@hadoop01 ~]# mv /bigdata/spark-3.2.4-bin-hadoop3.2/ /bigdata/spark-3.2.4

1.3.4 添加环境变量
(pyspark) [root@hadoop01 ~]# vim /etc/profile
# spark
export SPARK_HOME=/bigdata/spark-3.2.4
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PYSPARK_PYTHON=/usr/local/anaconda3/envs/pyspark/bin/python3.10
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native

(pyspark) [root@hadoop01 ~]# vim /root/.bashrc 
export JAVA_HOME=/usr/java/jdk1.8.0_381
export PYSPARK_PYTHON=/usr/local/anaconda3/envs/pyspark/bin/python3.10

(pyspark) [root@hadoop01 ~]# source /etc/profile

  • SPARK_HOME:表示 Spark 安装路径在那里;
  • HADOOP_CONF_DIR:告知 Spark Hadoop 的配置文件在那里;
  • PYSPARK_PYTHON:告知 Spark 运行 python 程序的执行器在哪里。
  • LD_LIBRARY_PATH:加载 Hadoop 的本地库(通常是 C 语言编写的)
1.3.5 启动 spark
1.3.5.1 bin/pyspark

bin/pyspark 程序,可以提供一个交互式的 Python 解释器环境,在这里面可以写普通 python 代码,以及 spark 代码。

(pyspark) [root@hadoop01 ~]# cd /bigdata/spark-3.2.4/
[root@hadoop01 /bigdata/spark-3.2.4]# bin/pyspark 

示例代码, 将数组内容都 +1进行计算:
sc.parallelize([1,2,3,4,5]).map(lambda x: x + 1).collect()

在这个环境内,可以运行 spark 代码。图中的 parallelizemap 都是 spark 提供的 API。

1.3.5.2 WEB UI (4040)

每一个 Spark 程序在运行的时候,会绑定到 Driver 所在机器的 4040 端口上。如果 4040 端口被占用,会顺延到 4041 … 4042…

4040 端口是一个 WEBUI 临时端口,可以在浏览器内打开。输入:服务器 ip:4040 即可打开

打开监控页面后,可以发现在程序内仅有一个 Driver,因为我们是 Local 模式,Driver 即管理 又干活。同时打开另一个终端,输入 jps,可以看到 local 模式下的唯一进程存在。这个进程即是 master 也是 worker。

注意:如果把当前的 pyspark 程序终止或退出(Ctrl + D)的话,SparkSubmit 进程 和 Web UI 页面也将终止和失效。

1.3.5.3 spark-shell

同样是一个解释器环境,和 bin/pyspark不同的是,这个解释器环境 运行的不是python代码,而是 scala 程序代码。

这个仅作为了解即可,因为这个是用于 scala 语言的解释器环境。

1.3.5.4 bin/spark-submit

bin/spark-submit 程序,作用: 提交指定的 Spark 代码到 Spark 环境中运行。

# 语法
bin/spark-submit [可选的一些选项] jar 包或者 python 代码的路径 [代码的参数]

# 示例
[root@hadoop01 /bigdata/spark-3.2.4]# bin/spark-submit --master local[*] /bigdata/spark-3.2.4/examples/src/main/python/pi.py 10

# 此案例运行 Spark 官方所提供的示例代码来计算圆周率值。后面的 10 是主函数接受的参数,数字越高,计算圆周率越准确。

1.3.6 pyspark/spark-shell/spark-submit 对比
bin/spark-submitbin/pysparkbin/spark-shell
功能提交 java\scala\python 代码到spark中运行提供一个 python 解释器环境用来以 python 代码执行 spark 程序提供一个 scala解释器环境用来以 scala 代码执行 spark 程序
特点提交代码用解释器环境 写一行执行一行解释器环境 写一行执行一行
使用场景正式场合,正式提交 spark程序运行测试\学习\写一行执行一行\用来验证代码等测试\学习\写一行执行一行\用来验证代码等

二、Spark 环境搭建-Standalone

2.1 Standalone 架构

Standalone 模式是 Spark 自带的一种集群模式,不同于前面本地模式启动多个进程来模拟集群的环境,Standalone 模式是真实地在多个机器之间搭建 Spark 集群的环境,完全可以利用该模式搭建多机器集群,用于实际的大数据处理。

StandAlone 是完整的 Spark 运行环境,其中:

  • Master 角色以 Master 进程存在,Worker 角色以 Worker 进程存在;
  • Driver 和 Executor 运行于 Worker 进程内,由 Worker 提供资源供给它们运行。

2.2 搭建

IP主机名运行角色
192.168.170.136hadoop01master worker
192.168.170.137hadoop02worker
192.168.170.138hadoop03worker
2.2.1 各个节点安装 Anaconda

具体安装步骤同上面 1.3.1-1.3.4 是一样的。

2.2.2 修改配置文件(在 hadoop01 上执行)
2.2.2.1 workers

这个文件就是指示了当前 Spark StandAlone 环境下有哪些 worker:

[root@hadoop01 ~]# cd /bigdata/spark-3.2.4/conf/
[root@hadoop01 /bigdata/spark-3.2.4/conf]# mv workers.template workers
[root@hadoop01 /bigdata/spark-3.2.4/conf]# vim workers 
hadoop01
hadoop02
hadoop03
2.2.2.2 spark-env.sh
[root@hadoop01 /bigdata/spark-3.2.4/conf]# mv spark-env.sh.template spark-env.sh
[root@hadoop01 /bigdata/spark-3.2.4/conf]# vim spark-env.sh
## 设置 JAVA 安装目录
JAVA_HOME=/usr/java/jdk1.8.0_381

## HADOOP 软件配置文件目录,读取 HDFS 上文件和运行 YARN 集群
HADOOP_CONF_DIR=/bigdata/hadoop/server/hadoop-3.2.4/etc/hadoop/
YARN_CONF_DIR=/bigdata/hadoop/server/hadoop-3.2.4/etc/hadoop/

## 指定 spark 老大 Master 的 IP 和提交任务的通信端口
# 告知 Spark 的 master 运行在哪个机器上
export SPARK_MASTER_HOST=hadoop01
# 告知 spark master 的通讯端口
export SPARK_MASTER_PORT=7077
# 告知 spark master 的 webui 端口
SPARK_MASTER_WEBUI_PORT=8081

# worker cpu 可用核数
SPARK_WORKER_CORES=1
# worker 可用内存
SPARK_WORKER_MEMORY=1g
# worker 的工作通讯地址
SPARK_WORKER_PORT=7078
# worker 的 webui 地址
SPARK_WORKER_WEBUI_PORT=8082

## 设置历史服务器
# 配置的意思是将 spark 程序运行的历史日志,存到 hdfs 的 /sparklog 文件夹中
SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://hadoop01:8020/sparklog/ -Dspark.history.fs.cleaner.enabled=true"

# 如果 hadoop 集群是 HA,则需要用下面的设置。要使用则把注释去掉
#SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://mycluster/sparklog/ -Dspark.history.fs.cleaner.enabled=true"

由于我的集群是高可用(HA)的,建议使用逻辑名称(Logical URI)而非具体的 Namenode 主机名和端口。这样可以确保即使当前的活动(Active)NameNode 发生变化,Spark 也能正确地找到日志目录。逻辑名称在 HA 配置中用于标识一个 Namenode 集群,而不是单个 Namenode。例如,如果逻辑名称是 mycluster,则您应该使用 hdfs://mycluster/sparklog/

注意:这里的 mycluster 应该与您在 HDFS 配置文件(通常是 hdfs-site.xml)中定义的逻辑名称(NameService ID)相匹配。这样,HA  客户端库就能自动确定哪个 NameNode 当前是 Active,并且进行相应的操作。(后续的同理)

注意:上面的配置的路径要根据你自己机器实际的路径来写。

在 HDFS 上创建程序运行历史记录存放的文件夹:

[root@hadoop01 /bigdata/spark-3.2.4/conf]# hadoop fs -mkdir /sparklog
[root@hadoop01 /bigdata/spark-3.2.4/conf]# hadoop fs -chmod 777 /sparklog
2.2.2.3 spark-defaults.conf
[root@hadoop01 /bigdata/spark-3.2.4/conf]# mv spark-defaults.conf.template spark-defaults.conf
[root@hadoop01 /bigdata/spark-3.2.4/conf]# vim spark-defaults.conf
# 开启spark的日期记录功能
spark.eventLog.enabled  true    
# # 设置spark日志记录的路径
spark.eventLog.dir       hdfs://hadoop01:8021/sparklog/
# # 设置spark日志是否启动压缩
spark.eventLog.compress         true

# hadoop HA 的配置,要使用则把注释去掉
#spark.eventLog.dir       hdfs://mycluster/sparklog/
2.2.2.4 log4j.properties(可选配置)
[root@hadoop01 /bigdata/spark-3.2.4/conf]# mv log4j.properties.template log4j.properties
[root@hadoop01 /bigdata/spark-3.2.4/conf]# vim log4j.properties
log4j.rootCategory=WARN, console

这个文件的修改不是必须的,  为什么修改为 WARN,因为 Spark 是个话痨会疯狂输出日志,设置级别为 WARN 只输出警告和错误日志,不要输出一堆废话。你如果为了更详细的信息可以默认 INFO。

2.2.3 分发 Spark 安装目录
[root@hadoop01 /bigdata]# cd /bigdata/
[root@hadoop01 /bigdata]# scp -r spark-3.2.4 hadoop02:$PWD
[root@hadoop01 /bigdata]# scp -r spark-3.2.4 hadoop03:$PWD

2.2.4 启动服务


![img](https://img-blog.csdnimg.cn/img_convert/7ef9e25c7d22e060683035ad72666f84.png)
![img](https://img-blog.csdnimg.cn/img_convert/afa129cd6b60260ab081f9b9c00515f5.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

1 /bigdata]# cd /bigdata/
[root@hadoop01 /bigdata]# scp -r spark-3.2.4 hadoop02:$PWD
[root@hadoop01 /bigdata]# scp -r spark-3.2.4 hadoop03:$PWD

2.2.4 启动服务


[外链图片转存中...(img-jYOZZkNZ-1715576774055)]
[外链图片转存中...(img-voASAVXc-1715576774056)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

### 回答1: Spark submit任务提交是指将用户编写的Spark应用程序提交到集群中运行的过程。在Spark中,用户可以通过命令行工具或API方式提交任务。 Spark submit命令的基本语法如下: ``` ./bin/spark-submit \ --class <main-class> \ --master <master-url> \ --deploy-mode <deploy-mode> \ --conf <key>=<value> \ <application-jar> \ [application-arguments] ``` 其中,`--class`指定应用程序的主类,`--master`指定集群的URL,`--deploy-mode`指定应用程序的部署模式,`--conf`指定应用程序的配置参数,`<application-jar>`指定应用程序的jar包路径,`[application-arguments]`指定应用程序的命令行参数。 在Spark中,任务提交的过程主要包括以下几个步骤: 1. 创建SparkConf对象,设置应用程序的配置参数; 2. 创建SparkContext对象,连接到集群; 3. 加载应用程序的主类; 4. 运行应用程序的main方法; 5. 关闭SparkContext对象,释放资源。 在任务提交的过程中,Spark会自动将应用程序的jar包和依赖的库文件上传到集群中,并在集群中启动Executor进程来执行任务。任务执行完成后,Spark会将结果返回给Driver进程,并将Executor进程关闭。 总之,Spark submit任务提交是Spark应用程序运行的关键步骤,掌握任务提交的原理和方法对于开发和调试Spark应用程序非常重要。 ### 回答2: Spark 作为一款强大的分布式计算框架,提供了很多提交任务的方式,其中最常用的方法就是通过 spark-submit 命令来提交任务。spark-submit 是 Spark 提供的一个命令行工具,用于在集群上提交 Spark 应用程序,并在集群上运行。 spark-submit 命令的语法如下: ``` ./bin/spark-submit [options] <app jar | python file> [app arguments] ``` 其中,[options] 为可选的参数,包括了执行模式、执行资源等等,<app jar | python file> 为提交的应用程序的文件路径,[app arguments] 为应用程序运行时的参数。 spark-submit 命令会将应用程序的 jar 文件以及所有的依赖打包成一个 zip 文件,然后将 zip 文件提交到集群上运行。在运行时,Spark 会根据指定的主类(或者 Python 脚本文件)启动应用程序。 在提交任务时,可以通过设置一些参数来控制提交任务的方式。例如: ``` --master:指定该任务运行的模式,默认为 local 模式,可设置为 Spark Standalone、YARN、Mesos、Kubernetes 等模式。 --deploy-mode:指定该任务的部署模式,默认为 client,表示该应用程序会在提交任务的机器上运行,可设置为 cluster,表示该应用程序会在集群中一台节点上运行。 --num-executors:指定该任务需要的 executor 数量,每个 executor 会占用一个计算节点,因此需要根据集群配置与任务要求确定该参数的值。 --executor-memory:指定每个 executor 可用的内存量,默认为 1g,可以适当调整该值以达到更好的任务运行效果。 ``` 此外,还有一些参数可以用来指定应用程序运行时需要传递的参数: ``` --conf:指定应用程序运行时需要的一些配置参数,比如 input 文件路径等。 --class:指定要运行的类名或 Python 脚本文件名。 --jars:指定需要使用的 Jar 包文件路径。 --py-files:指定要打包的 python 脚本,通常用于将依赖的 python 包打包成 zip 文件上传。 ``` 总之,spark-submit 是 Spark 提交任务最常用的方法之一,通过该命令能够方便地将应用程序提交到集群上运行。在提交任务时,需要根据实际场景调整一些参数,以达到更好的任务运行效果。 ### 回答3: Spark是一个高效的分布式计算框架,其中比较重要的组成部分就是任务提交。在Spark中,任务提交主要通过spark-submit来实现。本文将从两方面,即任务提交之前的准备工作和任务提交过程中的细节进行探讨。 一、任务提交之前的准备工作 1.环境配置 在执行任务提交前,需要确保所在的计算机环境已经配置好了SparkSpark的环境配置主要包括JAVA环境、Spark的二进制包、PATH路径配置、SPARK_HOME环境变量配置等。 2.编写代码 Spark的任务提交是基于代码的,因此在任务提交前,需要编写好自己的代码,并上传到集群中的某个路径下,以便后续提交任务时调用。 3.参数设置 在任务提交时,需要对一些关键的参数进行设置。例如,任务名、任务对应的代码路径、任务需要的资源、任务需要的worker节点等。 二、任务提交过程中的细节 1.启动Driver 当使用spark-submit命令提交任务时,Spark会启动一个Driver来运行用户的代码。这个Driver通常需要连接到Spark集群来执行任务。 2.上传文件 Spark支持在任务提交时上传所需的文件。这些文件可以用于设置Spark的环境变量、为任务提供数据源等。 3.资源需求 Spark的任务执行依赖于一定的资源。每个任务可以指定自己的资源需求,例如需要多少内存、需要多少CPU等。这些资源需求通常与提交任务时需要的worker节点数量有关系。 4.监控和日志 在任务执行的过程中,Spark会收集任务的监控数据和日志信息。这些数据可用于后续的调试和性能优化。 总之,在Spark任务提交过程中,需要充分考虑任务的资源需求和监控日志信息的收集,以便更好地完成任务和优化Spark运行效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值