[hadoop] 初识Spark
初识Spark采用的方法是:由新手不断地追问老手问题,老手给出一定的回答。
在这个过程中,新手会慢慢理解Spark
参考资料:
- 《Hadoop 3.x大数据开发实战》
文章目录
- 参考资料:
- 1
- 1.1
- 1.2
- 2
- 3
- 3.1
- 4
- 5
- 5
- 5.1
- 6
- 6.1
- 6.2
1
Spark集群的启动过程是由Spark集群外的一台计算机,向Spark集群中的一个节点发送启动消息吗?
在标准的 Spark 独立部署(Standalone)模式下,集群的启动过程通常不是由集群外的一台计算机发送远程消息触发的,而是直接在集群内部的一台机器上执行启动脚本来完成的
你(管理员)直接登录到计划作为 Master 节点的那台机器上。
在这台机器上运行 Spark 提供的启动脚本(例如 start-all.sh)。
- 该脚本会首先在当前机器上启动 Master 进程。
- 接着,脚本会读取本地的 slaves 配置文件,获取所有 Worker 节点的地址。
- 脚本通过 SSH 远程连接到这些 Worker 节点,并在它们上面分别启动 Worker 进程。
- Worker 进程启动后,会主动向 Master 发送注册消息,完成集群的组建。
你提到的“集群外的一台计算机”,通常是在集群已经启动并正常运行后,用来提交计算任务(Application)的。
执行者: 集群外的客户端机器(比如你的开发电脑或边缘服务器)。
动作: 使用 spark-submit 命令向已经运行中的 Spark 集群提交作业。
过程:
- 外部的客户端通过 spark-submit 指定 Master 的地址(如 --master spark://your-master-ip:7077)。
- 客户端会向集群的 Master 节点发送请求,申请资源来运行你的程序。
Master 调度资源,通知 Worker 启动 Executor 来执行具体的任务。
1.1
spark-submit就是客户端程序吗?
spark-submit 本身不是客户端程序,它只是客户端机器上的一个启动脚本(命令行工具)
当你按下 spark-submit 这个“按钮”时,它会根据你的指令,在你的本地机器(客户端机器)上真正启动一个 JVM 进程,这个进程才是 Spark 的客户端程序(也就是 Driver 驱动)。
1.2
那我写的.py程序就是那个客户端程序吗?
你写的 .py 程序是客户端程序(Driver)的核心逻辑和灵魂,但严格来说,它并不等同于最终在后台运行的那个完整的“客户端程序进程”。
- 启动 JVM 进程(诞生导演):spark-submit 脚本会在后台启动一个真实的 JVM(Java虚拟机)进程。这个 JVM 进程才是真正的“导演”(Driver),它包含了 Spark 的核心引擎(用 Scala/Java 编写)。
- 加载你的剧本:这个 JVM 进程会通过一个叫做 Py4J 的桥梁,启动一个 Python 解释器,并把你写的 .py 程序加载进来。
- 翻译与指挥:当你的 .py 代码中写到 df.filter(…) 或 rdd.map(…) 时,Python 解释器会通过 Py4J 把这些指令翻译给背后的 JVM 导演。JVM 导演再把这些指令转化成具体的任务(Task),分发给集群里的 Worker 去执行。
2
可以向Spark集群提交 x=1+1; print(x)的python程序吗?
我可以向Spark集群提交不使用Spark API 只使用python标准库的API的python程序吗?
完全可以。
你可以向 Spark 集群提交一个完全不使用 Spark API(比如不创建 SparkContext 或 SparkSession)、只使用 Python 标准库(如 math、json、datetime 等)的普通 Python 程序。
————
当你通过 spark-submit 提交一个完全不初始化 SparkContext 的脚本时,幕后流程是这样的:
- 启动 Driver 进程:Spark 集群会按照标准流程,在你的客户端机器(Client 模式)或集群内部的某个节点(Cluster 模式)上启动一个 Driver 进程。
- 执行纯 Python 逻辑:Driver 进程会唤起 Python 解释器,并逐行执行你脚本里的代码。由于你的代码中没有任何 Spark 的分布式算子(如 map, reduce, filter 等),Spark 的分布式计算引擎实际上不会被触发。
- 任务结束:Python 解释器执行完所有的标准库逻辑和打印语句后,Driver 进程会认为整个应用程序已经成功运行完毕,随即正常退出。
可以向Spark集群中提交MapReduce程序吗?
不能直接提交原生的 MapReduce 程序。
spark-submit 是 Spark 专属的提交脚本,它只能识别和运行基于 Spark API(如 Spark Core、Spark SQL)编写的程序。它并不认识原生 Hadoop MapReduce 的 Mapper 和 Reducer 类,也无法解析 MapReduce 的 Job 配置。
3
什么条件下,才会让 Driver主控进程 要求其他Work节点创建Executor进程?
在资源条件满足的情况下,什么条件下,才会让 Driver主控进程 要求其他Work节点创建Executor进程?
如果不初始化 SparkContext(或者在 PySpark 中不创建 SparkSession),你的程序绝对不会要求 Worker 节点创建任何 Executor 进程。
3.1
Spark的Dirve主控进程,先和Spark集群的什么节点进行交互?
Driver 启动后,会最先与 Spark 集群的 Master 节点 进行交互。
交互过程:Driver 会主动连接到 Master 节点并向其注册,告诉 Master 自己需要多少 CPU 和内存资源来运行任务。Master 收到请求后,会根据集群中 Worker 节点的资源情况,指挥合适的 Worker 去启动 Executor 进程。
4
同样一组计算机,可以同时组成Spark集群和YARN集群吗?
完全可以
Spark集群之所以叫Spark集群,不是因为这个集群上运行Spark应用程序,而是因为这个集群依靠Spark的资源调度器而存在
不同种类的资源调度器将同一组计算机组织成不同种类的集群,集群的本质特征来源于资源调度器
同一组物理计算机,安装不同的资源调度软件,就会表现出完全不同的集群行为和特性。
资源调度器就是集群的“大脑”,它决定了这组计算机如何被组织、如何分工以及如何处理任务。不同的调度器架构,赋予了集群完全不同的运行逻辑
5
YARN集群的Web界面的服务器是哪一个节点支持的,还是说所有的节点都有?
本质上,这个 Web 界面是 ResourceManager(资源管理器) 进程内部自带的一个嵌入式 Web 服务器(通常基于 Jetty 实现)。
ARN 集群的 Web 界面并不是所有节点都有,它是由特定的核心节点——ResourceManager 来提供支持的。
在一个标准的 YARN 集群中,各个节点的分工非常明确,只有运行了 ResourceManager 进程的节点,才会提供那个大家常用的、用于查看集群整体状态的 Web 界面(默认 8088 端口)。
YARN集群中,主节点启动的守护进程叫什么,从节点呢?
主节点(Master Node):启动的守护进程叫 ResourceManager。
从节点(Slave/Worker Node):启动的守护进程叫 NodeManager。
YARN集群架构是主从架构,Spark集群架构也是主从架构
| 架构层级 | YARN (通用资源调度平台) | Spark Standalone (Spark自带调度器) |
|---|---|---|
| 主节点 (Master) | ResourceManager 集群的“全局大管家”,负责整个系统的资源分配和管理。 | Master 集群的主控制器,负责资源调度和任务分配。 |
| 从节点 (Slave) | NodeManager 单个节点的“管理员”,管理本节点的资源并执行任务。 | Worker 运行在工作节点上,负责启动和管理具体的计算进程(Executor)。 |
| 资源分配单位 | Container (容器) 封装了CPU、内存等多维度资源的抽象单位。 | Executor (执行器) 由Worker启动,负责执行具体计算任务并提供计算资源。 |
5
spark-submit的本地模式和standalone有什么区别?
本地模式 (local)
环境:整个 Spark 应用(包括 Driver 和 Executor)都运行在提交程序的这台机器的单个 JVM 进程内。
资源:它利用的是本机的 CPU 核心和内存。你可以通过 local[N] 指定使用 N 个线程来模拟并行计算,但这并非真正的分布式。Standalone 模式 (spark://host:port)
环境:这是一个真正的分布式集群。Driver 进程和 Executor 进程会分布在集群中不同的物理机器上。
资源:它利用的是整个集群的计算资源。应用提交后,Driver 会向集群的 Master 节点申请资源,Master 会协调各个 Worker 节点启动 Executor 来并行处理任务。
5.1
可以只有一个从节点,一个主节点,且主从节点都在一台机器上吗?
完全可以。
这在大数据开发和测试环境中非常常见,通常被称为“伪分布式模式”。
在这种模式下,虽然物理上只有一台机器,但通过软件配置,让主节点进程和从节点进程同时在这台机器上运行,模拟出一个完整的集群环境。
在伪分布式(单机多进程)中,Master 和 Worker 虽然是两个进程,但它们是在同一个操作系统里
一台物理机/虚拟机,用Docker多容器模拟集群
真分布式,指的是利用多台物理计算机或者多台虚拟机通过网络连接组成的集群。
6
如何通过查阅Spark的配置文件来获取spark集群主节点的IP和端口?
$ bin/spark-submit\--masterspark://centos01:7077\--classorg.apache.spark.examples.SparkPi\./examples/jars/spark-examples_2.12-3.2.1.jarcd/path/to/spark/confcatspark-env.sh|grepSPARK_MASTER_HOST
7077:是给客户端(比如你的 spark-submit 命令)提交任务用的。
8080:是 Spark Master 的 Web UI 界面端口。你可以在浏览器输入 http://centos01:8080 查看集群状态,但不能把它写在 --master 参数里。
6.1
我如何使用netstat查看master真正绑定了什么ip和port?
sudonetstat-tulnp|grep70776.2
如何启动使用python的spark-shell?
pyspark --master spark://192.168.11.128:7077
这是最常用的方式,类似于 Scala 的 spark-shell,它会启动一个带有预配置 Spark 上下文(sc 和 spark)的 Python 环境。
