[hadoop] 初识Spark
初识Spark采用的方法是由新手不断地追问老手问题老手给出一定的回答。在这个过程中新手会慢慢理解Spark参考资料《Hadoop 3.x大数据开发实战》文章目录参考资料11.11.2233.14555.166.16.21Spark集群的启动过程是由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.1spark-submit就是客户端程序吗spark-submit 本身不是客户端程序它只是客户端机器上的一个启动脚本命令行工具当你按下 spark-submit 这个“按钮”时它会根据你的指令在你的本地机器客户端机器上真正启动一个 JVM 进程这个进程才是 Spark 的客户端程序也就是 Driver 驱动。1.2那我写的.py程序就是那个客户端程序吗你写的 .py 程序是客户端程序Driver的核心逻辑和灵魂但严格来说它并不等同于最终在后台运行的那个完整的“客户端程序进程”。启动 JVM 进程诞生导演spark-submit 脚本会在后台启动一个真实的 JVMJava虚拟机进程。这个 JVM 进程才是真正的“导演”Driver它包含了 Spark 的核心引擎用 Scala/Java 编写。加载你的剧本这个 JVM 进程会通过一个叫做 Py4J 的桥梁启动一个 Python 解释器并把你写的 .py 程序加载进来。翻译与指挥当你的 .py 代码中写到 df.filter(…) 或 rdd.map(…) 时Python 解释器会通过 Py4J 把这些指令翻译给背后的 JVM 导演。JVM 导演再把这些指令转化成具体的任务Task分发给集群里的 Worker 去执行。2可以向Spark集群提交 x11; 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.1Spark的Dirve主控进程先和Spark集群的什么节点进行交互Driver 启动后会最先与 Spark 集群的 Master 节点 进行交互。交互过程Driver 会主动连接到 Master 节点并向其注册告诉 Master 自己需要多少 CPU 和内存资源来运行任务。Master 收到请求后会根据集群中 Worker 节点的资源情况指挥合适的 Worker 去启动 Executor 进程。4同样一组计算机可以同时组成Spark集群和YARN集群吗完全可以Spark集群之所以叫Spark集群不是因为这个集群上运行Spark应用程序而是因为这个集群依靠Spark的资源调度器而存在不同种类的资源调度器将同一组计算机组织成不同种类的集群集群的本质特征来源于资源调度器同一组物理计算机安装不同的资源调度软件就会表现出完全不同的集群行为和特性。资源调度器就是集群的“大脑”它决定了这组计算机如何被组织、如何分工以及如何处理任务。不同的调度器架构赋予了集群完全不同的运行逻辑5YARN集群的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启动负责执行具体计算任务并提供计算资源。5spark-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_HOST7077是给客户端比如你的 spark-submit 命令提交任务用的。8080是 Spark Master 的 Web UI 界面端口。你可以在浏览器输入 http://centos01:8080 查看集群状态但不能把它写在 --master 参数里。6.1我如何使用netstat查看master真正绑定了什么ip和portsudonetstat-tulnp|grep70776.2如何启动使用python的spark-shellpyspark --master spark://192.168.11.128:7077这是最常用的方式类似于 Scala 的 spark-shell它会启动一个带有预配置 Spark 上下文sc 和 spark的 Python 环境。