Spark 核心计算引擎完全可以在没有互联网连接的环境中运行。 这是因为 Spark 的计算任务(如数据处理、机器学习训练)都发生在你自己的集群或单机上,不依赖外部网络。

spark无互联网连接
(图片来源网络,侵删)

Spark 生态系统中的许多工具和组件依赖于互联网,在无互联网环境下,你需要提前进行规划和准备。


无互联网环境下,哪些 Spark 功能会受限?

包管理与依赖下载(最常见的问题)

这是最直接的影响,Spark 应用程序通常需要各种第三方库(pandas, numpy, pyarrow, tensorflow 等)。

  • 问题:当你在代码中使用 import pandas as pd 时,Python 解释器需要找到 pandas 库,如果你的环境中没有预装,并且没有互联网连接,pip install pandasconda install pandas 会失败。

  • 解决方案提前下载并安装所有依赖

    spark无互联网连接
    (图片来源网络,侵删)
    • 在联网机器上准备:在一个有互联网的机器上,使用 pipconda 将所有需要的包下载到本地目录。

      # 使用 pip
      pip download -d /path/to/local/packages pandas numpy pyarrow
      # 使用 conda
      conda install --download-only --prefix /path/to/local/conda_env pandas numpy pyarrow
    • 在无互联网机器上安装:将这个包含所有包的目录(/path/to/local/packages)拷贝到无互联网的 Spark 节点上,然后从本地安装。

      # 使用 pip
      pip install --no-index --find-links=/path/to/local/packages pandas numpy pyarrow
      # 使用 conda
      conda install --use-local --prefix /path/to/local/conda_env pandas numpy pyarrow
    • 最佳实践:创建一个完整的、包含所有依赖的 Python 虚拟环境(venv)或 Conda 环境,然后直接将整个环境目录打包(如 .tar.gz)分发到各个 Spark 节点。

Spark UI (Web UI)

  • 问题:Spark Driver 会启动一个 Web UI(默认在 http://<driver-node>:4040)来展示作业的运行状态、日志、指标等,这个 UI 本地运行,不主动连接互联网
  • 限制:你只能通过 Driver 所在节点的 IP 地址来访问这个 UI,如果你的 Spark 集群在一个隔离的内网,外部人员无法通过公网访问它,UI 上的某些“检查更新”或外部链接功能将无法工作。
  • 解决方案:通常无需特殊解决方案,只要你能物理或网络访问 Driver 节点,就可以使用 UI,如果需要远程访问,可以通过 SSH 端口转发等方式实现。

日志聚合与远程存储

  • 问题:在大型集群中,Spark 可以配置将 Executor 的日志上传到远程存储(如 HDFS、S3)或一个集中的日志服务器(如 ELK Stack),如果这个远程存储或服务器在公网上,或者需要出网访问,那么日志聚合功能会失败。
  • 解决方案
    • 将日志存储配置为集群内部的本地文件系统或内网可访问的存储系统。
    • 禁用日志聚合,让日志直接保留在各个工作节点的本地。

连接到外部数据源

  • 问题:Spark 经常需要从外部系统读取或写入数据,
    • 云存储:S3, Azure Blob Storage, Google Cloud Storage,如果这些存储桶是公网访问的,且你的集群无法出网,连接会失败。
    • 数据库:MySQL, PostgreSQL, Kafka 等,如果这些数据库部署在公网或另一个隔离的内网,且网络不通,连接会失败。
    • Hadoop HDFS:HDFS 集群也在同一个隔离的内网中,则没有问题,但如果 HDFS 的 NameNode 需要通过公网地址访问,则会失败。
  • 解决方案
    • 网络打通:最佳方案是确保 Spark 集群与数据源所在网络之间有安全的网络连接(如 VPN、专线)。
    • 数据迁移:将数据提前从外部源下载到 Spark 集群本地的文件系统(如 HDFS、本地磁盘)或内网可访问的存储中。

高可用性

  • 问题:Spark 的 Standalone 模式的高可用性依赖于 ZooKeeper,ZooKeeper 集群通常部署在内部网络,Spark 集群和 ZooKeeper 集群都在同一个隔离网络内,则 HA 正常工作,ZooKeeper 需要公网访问,则会出问题。
  • 解决方案:确保所有高可用性相关的服务(ZooKeeper, YARN ResourceManager 等)都在同一个安全、隔离的内网中。

与外部生态系统集成

  • Hive Metastore:Spark 需要连接一个外部的 Hive Metastore,且该 Metastore 服务无法从 Spark 集群网络访问,则会失败。
  • Delta Lake / Iceberg:这些表格式通常需要与元数据存储(如 Hive Metastore)交互,原理同上。

实践步骤:如何在一个无互联网的“气隙”环境中部署 Spark

假设你有一个全新的、没有互联网连接的 Linux 集群。

spark无互联网连接
(图片来源网络,侵删)
  1. 准备基础软件

    • Java:下载 JDK 的离线安装包(.rpm.deb)或二进制包,手动安装。
    • Python:下载 Miniconda 或 Python 的离线安装包,手动安装。
    • Hadoop (可选):如果需要 HDFS 支持,下载 Hadoop 的二进制包,手动解压和配置。
  2. 准备 Spark

    • Spark 官网 下载一个预编译好的 Spark 版本(spark-3.4.1-bin-hadoop3.tgz),这个包包含了 Spark 的核心库,不依赖网络下载。
    • 将这个 .tgz 文件拷贝到所有节点,并解压到相同的路径(/opt/spark)。
  3. 准备 Python 依赖

    • 在一台有网的机器上创建一个 Conda 环境,安装你的所有 Python 依赖包(pyspark, pandas, )。
    • 导出这个环境的定义文件:conda env export > environment.yml
    • environment.yml 文件和整个 Conda 环境目录(或打包好的 .tar.gz 文件)拷贝到无网环境的所有节点。
    • 在所有节点上根据 environment.yml 重新创建环境,或者直接解压已打包的环境。
  4. 配置环境变量

    • 在所有节点的 ~/.bashrc/etc/profile 中设置必要的环境变量:
      export JAVA_HOME=/path/to/java
      export SPARK_HOME=/opt/spark
      export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
      export PYSPARK_PYTHON=/path/to/your/conda/bin/python # 指向你创建的本地Python环境
    • 执行 source ~/.bashrc 使其生效。
  5. 配置 Spark

    • 修改 $SPARK_HOME/conf/spark-env.sh,设置 JAVA_HOMEPYSPARK_PYTHON
    • 如果是集群模式,配置 $SPARK_HOME/conf/slaves 文件,列出所有 Worker 节点的主机名。
    • 根据你的网络情况,修改 $SPARK_HOME/conf/spark-defaults.conf,禁用不必要的出网功能,例如设置 spark.eventLog.enabled=false
  6. 分发文件

    • 使用 scp, rsync 或 Ansible 等工具,将 $SPARK_HOME 目录、Python 环境目录和配置文件同步到集群的所有节点。
  7. 启动和测试

    • 在 Master 节点上启动集群:start-master.shstart-slaves.sh
    • 运行一个简单的测试任务,验证一切是否正常。
      # 运行一个简单的SparkPi示例任务
      $SPARK_HOME/bin/spark-submit --master spark://<master-host>:7077 \
         --class org.apache.spark.examples.SparkPi \
         $SPARK_HOME/examples/jars/spark-examples*.jar 10
功能/组件 是否依赖互联网 无网环境下的影响与解决方案
Spark 核心计算 可以正常运行,这是 Spark 的基本能力。
Python/Java 依赖 受限,必须提前下载所有依赖包并在本地安装。
Spark UI 基本可用,只能通过内网 IP 访问,外部链接无效。
日志聚合 ( 受限,需将日志存储在内网或禁用聚合。
外部数据源 ( 受限,需确保网络连通或数据已在内网。
高可用性 (在内部网络) 可以正常工作,前提是 HA 服务在同一内网。
包管理器 受限pip/conda 无法在线安装,需离线使用。

Spark 本身是“气隙”友好的,但它的整个生态系统不是,成功的关键在于规划:提前识别所有依赖(软件包、数据源、服务),并在断网前将它们准备好并部署到你的隔离环境中。