Apache Spark

最后更新: 2026-07-14 00:19:21 +0800 +0800
原文以英文撰写。您正在阅读AI翻译版本。

Spark 应用程序只是 YARN 应用程序的一种类型。

Apache Spark 使用 Scala 编写,只要类路径中提供了兼容的 Scala 运行时 JAR,就可以在任何 JVM 上运行。

工作节点需要 HDFS 客户端和 YARN 客户端才能工作,并在 HDFS 上读写作业的输入和输出文件。

概述 #

用户编写 JVM 字节码程序(使用 Java 或 Scala),称为驱动程序,并将其打包成 foo.jar JAR 文件。 该 JAR 文件可以包含所有依赖项(即 uber JAR),也可以不包含依赖项,并假定这些依赖项由工作节点环境提供。

驱动程序如下所示:

java
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.Dataset;

public class SimpleApp {
  public static void main(String[] args) {
    SparkSession spark = SparkSession.builder().appName("Simple Application").getOrCreate();
    Dataset<String> logData = spark.read().textFile("SOME_DIR/SOME_FILE.md").cache();

    long numAs = logData.filter(s -> s.contains("a")).count();
    long numBs = logData.filter(s -> s.contains("b")).count();

    System.out.println("Lines with a: " + numAs + ", lines with b: " + numBs);

    spark.stop();
  }
}

然后,用户应通过以下命令运行此程序:

sh
./bin/spark-submit \
  --master 'spark://master-server-addr:port' \
  --class org.full.package.SimpleApp \
  foo.jar

该命令会立即启动一个本地 JVM 进程,并完全在本地运行此程序。

随后:

  1. 创建 SparkSession 实例时,该程序(驱动程序)会与主节点建立 TCP 连接,并发送如下信息:"你好,主节点。我需要几个执行器进程;请为我分配这些执行器,待它们准备就绪后,通过 TCP 与我通信;这是我的 IP 地址和监听 TCP 端口。"
  2. 此驱动程序随后会阻塞,并在其整个生命周期内监听来自执行器的传入连接。
  • 对驱动程序而言,主节点(即集群管理器)具体是什么并不重要,只要主节点理解该协议,并且未来有执行器建立 TCP 连接即可。

杂项 #

  1. 每个 SparkContext 实例都称为一个 Spark 应用程序。同一个驱动程序中可以有多个彼此完全独立的 SparkContext。
  2. 在同一个 Spark 应用程序中,可以并发运行多个 Spark 操作(即作业)。
  • SparkContext 是(应当是)单例,在一个 Spark 应用程序中只能创建一次。
  • 另一方面,SparkSession 可以在一个应用程序中创建多次。

评论

在 GitHub 上阅读或评论(发表评论需要登录)