spark使用一

一、 环境准备

在开始之前,安装以下软件:

1.1 JDK:推荐JDK8或JDK11(Spark 3.x对JDK11支持良好,但JDK8最稳妥)。

1.2 IntelliJ IDEA:Community(社区版)或Ultimate(旗舰版)均可。

1.3 Maven:用于依赖管理和项目打包。

1.4 Scala插件:打开IDEA->Settings->Plugins->搜索Scala并安装重启(此步骤在使用scala时做也可以)。

二、 创建 Maven 项目

2.1 打开idea,左上角file=》new=》project

2.2 创建一个New Project,输入名称name,语言选择java,build system选择maven(方便后续打包依赖),jdk建议选jdk8

2.3 在main目录上右键new一个directory,名称叫scala

2.4 在scala目录上右键mark directory as 为sources root

2.5 配置pom.xml(核心)

在pom.xml中配置Scala版本、Spark版本以及打包插件

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>sparkmysqltohive</artifactId>
    <version>1.0-SNAPSHOT</version>


    <properties>
        <!-- 【修改点 1】拆分为两个变量 -->
        <scala.binary.version>2.12</scala.binary.version> <!-- 用于拼接 Spark 依赖后缀 -->
        <scala.version>2.12.17</scala.version>            <!-- 用于 Scala 库的精确版本 (Spark 3.4.x 推荐 2.12.17) -->
        <!--<spark.version>3.3.1</spark.version> -->
        <spark.version>3.4.2</spark.version>
        <hive.version>3.1.3</hive.version>
        <hadoop.version>3.2.2</hadoop.version>
        <slf4j.version>1.7.29</slf4j.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <!--        <scope>compile</scope>-->
        <scope>provided</scope>
    </properties>
    <dependencies>
        <!--spark-->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_${scala.binary.version}</artifactId>
            <version>${spark.version}</version>
            <scope>${scope}</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_${scala.binary.version}</artifactId>
            <version>${spark.version}</version>
            <scope>${scope}</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-hive_${scala.binary.version}</artifactId>
            <version>${spark.version}</version>
            <scope>${scope}</scope>
        </dependency>

        <!--fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>


        <!--log4j + slf4j-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>


    </dependencies>
    <build>
        <plugins>
            <!-- 【关键新增】1. Scala 编译插件:没有它,.scala 文件不会被编译! -->
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <version>4.8.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptorRefs>
                        <!-- 将依赖的jar包中的class文件打进生成的jar包-->
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>assembly</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>false</filtering>
                <includes>
                    <!-- 只打包你真正需要的文件,比如某些 sql 脚本或 properties -->
                    <include>**/*.properties</include>
                </includes>
                <excludes>
                    <!-- 【关键】排除本地调试用的 Hadoop/Hive/Kerberos 配置 -->
                    <exclude>**/*.xml</exclude>
                    <exclude>**/*.keytab</exclude>
                    <exclude>**/krb5.conf</exclude>
                    <exclude>**/log4j*.properties</exclude>
                </excludes>
            </resource>
        </resources>
    </build>

</project>

配置完成后,点击右上角的Load Maven Changes(刷新图标)下载依赖。

2.6 添加 Scala 框架支持

因为创建的是Maven项目,IDEA默认不知道要写Scala代码。

2.6.1 在左侧项目目录树中,右键点击项目根目录。

2.6.2 选择 Add Framework Support...

2.6.3 勾选Scala,选择刚才配置的Scala版本(如2.12.15)如果没有就create一个,点击OK。

2.6.4 IDEA会自动创建src/main/scala和src/test/scala目录。

2.7 创建一个Scala Object

scala 复制代码
import org.apache.spark.sql.SparkSession

object sparkdemo {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder()
      .appName("SparkSQLDemo")
      .master("local[*]") // 本地测试用
      .getOrCreate()

    import spark.implicits._
    val df = Seq((1, "张三", 25), (2, "李四", 30)).toDF("id", "name", "age")
    df.createOrReplaceTempView("user")

    spark.sql("SELECT * FROM user WHERE age > 26").show()

    spark.stop()
  }
}

解决本地运行的"Provided"坑点(⚠️极其重要)

在pom.xml中,我们将Spark依赖的scope设置为了provided(因为提交到集群时,集群本身有Spark环境,不需要打包进去以减小jar体积)。但这会导致在IDEA本地直接点击Run时报ClassNotFoundException。

这是因为pom.xml中Spark相关依赖的被设置为provided(定义的${scope}变量值为provided)。这意味着这些依赖只在编译时使用,不会被打包进最终的JAR中。

这是Spark项目打包的标准做法,因为集群环境中已经存在这些JAR,无需重复打入,还能避免版本冲突。

当使用java -jar your.jar直接执行时,JVM只会加载JAR包内的class,而Spark的class不在其中,因此报ClassNotFoundException。

解决办法

2.7.1 点击右上角的Run/Debug Configurations(或者在main方法左侧绿色三角形选择Modify Run Configuration)。

2.7.2 找到Modify options(或Alt+M)。

2.7.3 勾选Add dependencies with "provided" scope to classpath。

2.7.4 点击Apply -> OK。

2.7.5 点击运行,即可在IDEA控制台看到正确的输出结果。

scala 复制代码
+---+----+---+
| id|name|age|
+---+----+---+
|  2|李四| 30|
+---+----+---+