第四章:开发环境搭建

说实话,很多初学者在Spark Streaming上栽跟头,不是因为技术难,而是环境没搭好。我见过太多人花了两天时间配置环境,结果一个版本不兼容就全白费了。今天我就把这几年的经验捋一捋,帮你把JDK、Scala、Spark、Maven/SBT这些工具一次性搞定。

4.1 JDK安装与配置

Spark是跑在JVM上的,所以JDK是第一步。我个人习惯用JDK 8,虽然现在JDK 11、17都出来了,但Spark对JDK 8的支持最稳定。你想想看,生产环境求稳不求新,对吧?

版本坑: 我曾经因为用了JDK 11,结果Spark Streaming的某些API报错,查了半天才发现是JDK版本问题。所以,JDK 8u201+ 是最稳妥的选择。

4.1.1 下载与安装

去Oracle官网下载JDK 8,或者用OpenJDK也行。我推荐用OpenJDK,省去授权烦恼。下载后解压到指定目录,比如 /usr/local/jdk1.8.0_201

4.1.2 环境变量配置

配置 JAVA_HOMEPATH。嗯,这里要注意,不同操作系统写法不一样:

# Linux/Mac 在 ~/.bashrc 或 ~/.zshrc 中添加
export JAVA_HOME=/usr/local/jdk1.8.0_201
export PATH=$JAVA_HOME/bin:$PATH

# Windows 在系统变量中设置
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_201
PATH=%JAVA_HOME%\bin;%PATH%

配置完后,终端输入 java -version 验证。看到版本号输出,说明JDK搞定了。

4.2 Scala安装与配置

Spark是用Scala写的,虽然现在PySpark很火,但想深入理解Spark Streaming,Scala是绕不开的。我建议用Scala 2.12,因为Spark 3.x系列对2.12支持最好。

小技巧: 别用Scala 2.13,Spark官方还没完全适配。我当初图新鲜试过,结果编译报错一堆,老老实实换回2.12。

4.2.1 下载与安装

从Scala官网下载二进制包,解压到 /usr/local/scala-2.12.17。然后配置环境变量:

export SCALA_HOME=/usr/local/scala-2.12.17
export PATH=$SCALA_HOME/bin:$PATH

验证:scala -version。看到版本信息,就OK了。

4.2.2 为什么是Scala?

说白了,Spark Streaming的DStream API就是Scala写的。你用Java也能写,但代码会冗长很多。我个人觉得,学Spark Streaming顺便把Scala基础过一遍,性价比很高。

4.3 Spark安装与配置

Spark安装分两种:单机模式和集群模式。我们开发环境用单机模式就够了。我建议用Spark 3.2.0以上版本,对Structured Streaming支持更好。

4.3.1 下载与解压

去Spark官网下载预编译包,选择 spark-3.2.0-bin-hadoop3.2.tgz。解压到 /usr/local/spark

4.3.2 配置环境变量

export SPARK_HOME=/usr/local/spark
export PATH=$SPARK_HOME/bin:$PATH

4.3.3 验证安装

运行 spark-shell,如果出现Spark的Logo和Scala交互式界面,说明安装成功。我第一次看到那个Logo时,还挺激动的。

核心配置:$SPARK_HOME/conf/spark-env.sh 中,建议设置 SPARK_LOCAL_IP 为本机IP,避免网络绑定问题。我曾经在虚拟机里没配这个,结果Spark UI死活打不开。

4.4 Maven/SBT项目构建

写Spark Streaming应用,总得有个构建工具。Maven和SBT是主流选择。我个人偏好Maven,因为生态更成熟,但SBT在Scala社区更流行。你选哪个都行,关键是会用。

4.4.1 Maven项目搭建

创建一个Maven项目,在 pom.xml 中添加Spark依赖:

<dependencies>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming_2.12</artifactId>
        <version>3.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.12</artifactId>
        <version>3.2.0</version>
    </dependency>
</dependencies>

注意 spark-streaming_2.12 中的 _2.12 表示Scala版本。这个细节容易忽略,但很重要。

4.4.2 SBT项目搭建

如果你用SBT,build.sbt 文件这样写:

name := "spark-streaming-demo"
version := "1.0"
scalaVersion := "2.12.17"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-streaming" % "3.2.0",
  "org.apache.spark" %% "spark-sql" % "3.2.0"
)

这里 %% 会自动匹配Scala版本,比Maven省事一点。

4.4.3 第一个Spark Streaming应用

环境搭好了,写个简单的WordCount试试:

import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.SparkConf

object NetworkWordCount {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount")
    val ssc = new StreamingContext(conf, Seconds(5))

    val lines = ssc.socketTextStream("localhost", 9999)
    val words = lines.flatMap(_.split(" "))
    val wordCounts = words.map(word => (word, 1)).reduceByKey(_ + _)

    wordCounts.print()
    ssc.start()
    ssc.awaitTermination()
  }
}

这个程序监听本机9999端口,每5秒统计一次单词数。你先启动 nc -lk 9999,然后运行程序,输入一些单词,就能看到输出。

常见错误: 如果报 java.net.BindException,说明端口被占用了。换个端口或者杀掉占用进程就行。我刚开始学的时候,经常忘了关之前的进程,导致端口冲突。

4.5 环境验证清单

最后,我整理了一个检查清单,帮你确认环境是否就绪:

组件 验证命令 预期输出
JDK java -version java version "1.8.0_201"
Scala scala -version Scala code runner version 2.12.17
Spark spark-shell Spark context Web UI available
Maven mvn -version Apache Maven 3.8.x
SBT sbt about sbt version in this project

全部通过?恭喜你,开发环境搭建完毕。接下来就可以正式进入Spark Streaming的世界了。记住,环境搭好了,后面学起来才顺。别急,慢慢来。