作者:IvanCodes
日期:2025年7月20日
专栏:Spark教程

本教程将从零开始一步步指导您如何在 IntelliJ IDEA搭建一个基于 MavenScala 的 Spark 开发环境,并最终完成经典的 WordCount 案例。

一、创建 Maven 项目并配置 Scala 环境

1.1 新建 Maven 项目

首先,我们需要在 IDEA 中创建一个基础的 Maven 项目

  • 打开 IntelliJ IDEA,点击新建项目
  • 在弹出的窗口中,按照下图的数字顺序进行配置:
    1. 选择新建项目
    2. 左侧列表选择 Java
    3. 构建系统选择 Maven
    4. 为项目选择一个 JDK,推荐JDK 11 (这里演示用 Oracle OpenJDK 22)。
    5. 点击创建

在这里插入图片描述

1.2 为项目添加 Scala 框架支持

默认创建的是一个纯 Java 的 Maven 项目,我们需要为它添加 Scala 支持

  • 项目结构视图中,右键点击项目根目录 (例如 SparkBasis,后面的SparkCore,SparkRDD等等其他的也同理)。
  • 在弹出的菜单中选择打开模块设置 或按快捷键 F4

在这里插入图片描述

  • 项目结构 窗口中:
    1. 确保左侧选择了模块
    2. 中间面板会显示当前的项目模块 (例如 SparkBasis)。
    3. 点击上方的 “+” 号按钮来添加框架。

在这里插入图片描述

  • 弹出的菜单中,选择 Scala

在这里插入图片描述

1.3 配置 Scala SDK

添加 Scala 框架后,IDEA 会提示你配置 Scala SDK

  • 弹出的“添加 Scala 支持”窗口中,按照下图的数字顺序操作:
    1. 如果“使用库”下拉框中没有可用的 Scala SDK,点击创建 按钮。
    2. 下载 Scala SDK的窗口中,选择一个版本非常重要:这个版本必须与你稍后要在 pom.xml 中配置的 Spark 依赖版本相匹配。例如,Spark 3.x 版本通常对应 Scala 2.12 或 2.13。这里我们选择 2.13.16
    3. 点击下载,IDEA 会自动下载并配置。
    4. 下载完成后,在选择 Scala SDK的窗口中确认版本。
    5. 点击确定
    6. 返回到“添加 Scala 支持”窗口,再次点击确定
    7. 最后,在项目结构窗口点击应用
    8. 点击确定 关闭窗口。

在这里插入图片描述

  • 配置完成后,你的项目结构会发生变化,IDEA 会自动识别 Scala 源代码。你可以在 src/main 目录下新建一个 scala 目录 (如果不存在),并将其标记为源代码根目录。可以创建一个简单的 Hello.scala 对象来测试环境是否配置成功。

在这里插入图片描述

二、配置 Maven 依赖与日志系统

为了使用 Spark 并拥有一个干净的运行环境,我们需要做两件事:1) 在 pom.xml 文件中添加 Spark 的相关库作为项目依赖;2) 配置日志系统,避免 Spark 运行时输出过多的调试信息。

2.1 配置 Maven 依赖 (pom.xml)

pom.xml 文件是 Maven 项目的核心配置文件,它告诉 Maven 我们的项目需要哪些外部库 (JARs)

  • 打开项目根目录下的 pom.xml 文件。
  • <dependencies> 标签内,添加 spark-corespark-sql 的依赖。同时,为了避免 Spark 启动时出现关于 SLF4J 的警告,我们需要显式添加一个日志实现库,如 slf4j-log4j12
  • 为了加速依赖下载,可以配置一个国内的 Maven 镜像仓库,如阿里云。

以下是完整的 pom.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><parent><groupId>org.example</groupId><artifactId>SparkBasis</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>SparkCore</artifactId><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.32</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.13</artifactId><version>3.5.1</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.13</artifactId><version>3.5.1</version></dependency></dependencies><repositories><repository><id>aliyunmaven</id><name>Alibaba Cloud Maven</name><url>https://maven.aliyun.com/repository/public</url></repository></repositories></project>

重要提示:

  • artifactId 中的 _2.13 必须与您在第一步中配置的 Scala SDK 主版本完全一致。
  • Spark 的版本 (3.5.1) 最好选择一个稳定且常用的版本。

编辑完 pom.xml 后,IDEA 通常会自动提示或在右上角显示一个Maven刷新图标,点击它让 Maven 重新加载项目并下载新添加的依赖。

2.2 配置日志属性 (log4j.properties)

当您首次运行 Spark 程序时,会发现控制台被大量INFO级别日志刷屏,这些是 Spark 内部组件的运行日志,它们会淹没我们自己程序的输出结果,给调试带来困扰

为了让输出更清爽,只显示警告 (WARN)错误 (ERROR) 级别的日志,我们可以通过添加一个 log4j.properties 文件来控制日志级别

  • 在项目的 src/main 目录下,右键点击 -> 新建 -> 目录,创建一个名为 resources 的目录。
  • src/main/resources 目录下,右键点击 -> 新建 -> 文件,创建一个名为 log4j.properties 的文件。

在这里插入图片描述

  • 将以下内容复制log4j.properties 文件中:
# 将根日志级别设置为ERROR,这样所有INFO和WARN信息都会被隐藏
log4j.rootCategory=ERROR, console# --- 配置控制台输出的格式 ---
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n# --- 为Spark-shell单独设置日志级别(可选) ---
# 运行spark-shell时,此级别会覆盖根日志级别,以便为shell和常规应用设置不同级别
log4j.logger.org.apache.spark.repl.Main=WARN# --- 将一些特别“吵”的第三方组件的日志级别单独调高 ---
log4j.logger.org.sparkproject.jetty=ERROR
log4j.logger.org.sparkproject.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=ERROR
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=ERROR
log4j.logger.org.apache.spark.parquet=ERROR
log4j.logger.parquet=ERROR

配置好这两个文件后,您的 Spark 项目就具备了必要的依赖库一个清爽日志环境,可以准备进行下一步的开发了。

三、Windows 环境配置 (解决 winutils.exe 问题)

在 Windows 系统上直接运行 Spark 代码,通常会因为缺少 Hadoop 的本地库报错 (例如 NullPointerException)。我们需要手动配置 winutils.exehadoop.dll

3.1 下载 winutils.exe 和 hadoop.dll

  • 访问 winutils 的 GitHub 仓库:https://github.com/cdarlint/winutils/
  • 根据你使用的Hadoop版本选择对应的目录。重要提示:Spark 3.5.1 通常与 Hadoop 3.3.x 版本兼容。因此我们进入 hadoop-3.3.5/bin 目录。
    • GitHub仓库链接:https://github.com/cdarlint/winutils/tree/master/hadoop-3.3.5/bin

在这里插入图片描述
在这里插入图片描述

  • 在该目录中,分别找到 hadoop.dllwinutils.exe 文件,并点击下载按钮将它们保存到本地

在这里插入图片描述

3.2 创建目录并放置文件

  • 在你的电脑上创建一个不含中文和空格的路径作为 Hadoop 的主目录,例如 C:\hadoop
  • 在该目录下再创建一个 bin 子目录,即 C:\hadoop\bin
  • 刚刚下载winutils.exehadoop.dll 两个文件复制到 C:\hadoop\bin 文件夹中。

在这里插入图片描述

3.3 配置环境变量

为了让系统和 Spark 能找到这些文件,需要配置两个环境变量HADOOP_HOMEPath

  • 管理员身份打开 PowerShell
  • 执行以下两条命令来设置系统级别的环境变量:

设置 HADOOP_HOME:

[System.Environment]::SetEnvironmentVariable('HADOOP_HOME', 'C:\hadoop', 'Machine')

将 HADOOP_HOME\bin 添加到 Path:

[System.Environment]::SetEnvironmentVariable('Path', ([System.Environment]::GetEnvironmentVariable('Path', 'Machine') + ';C:\hadoop\bin'), 'Machine')

在这里插入图片描述
在这里插入图片描述

  • 配置完成后,重启 IntelliJ IDEA (甚至重启电脑) 以确保环境变量生效

四、WordCount 案例实战

环境全部准备就绪后,我们来编写 WordCount 程序。

4.1 方法一:纯 Scala 实现

这种方法不使用 Spark,仅用 Scala 自身的集合操作来处理本地文件,用于对比和理解基本逻辑。

在这里插入图片描述

代码 (WordCount01.scala):

package Spark.Core.WordCountimport scala.io.Sourceobject WordCount01 {def main(args: Array[String]): Unit = {// 1、文件路径val filePaths = Seq("E:\\BigData\\Spark\\SparkPractice\\SparkBasis\\Datas\\WordCount\\1.txt","E:\\BigData\\Spark\\SparkPractice\\SparkBasis\\Datas\\WordCount\\2.txt")// 读取所有文件内容val words = filePaths.flatMap(path => Source.fromFile(path).getLines()).flatMap(_.split("\\s+"))// 将单词转换成键值对形式val wordcounts = words.groupBy(word => word).map(kv => (kv._1, kv._2.size))wordcounts.foreach(println)}
}

4.2 方法二:Spark RDD 实现 (使用 reduceByKey )

这是最经典、最高效的 Spark WordCount 实现方式。

在这里插入图片描述

代码 (WordCount02.scala):

package Spark.Core.WordCountimport org.apache.spark.{SparkConf, SparkContext}object WordCount02 {def main(args: Array[String]): Unit = {// 1、创建 Spark 运行上下文val conf = new SparkConf().setAppName("WordCount_Reduce").setMaster("local[*]")val sc = new SparkContext(conf)// 2、读取 textFile 获取文件// 读取单个或多个文件val linesRdd = sc.textFile("E:\\BigData\\Spark\\SparkPractice\\SparkBasis\\Datas\\WordCount\\*")// 3、扁平化操作val wordsRdd = linesRdd.flatMap(line => line.split("\\s+"))// 4、结构转换(单词, 1)val pairRdd = wordsRdd.map(word => (word, 1))// 5、利用 reduceByKey 完成聚合val wordCountsRdd = pairRdd.reduceByKey((x, y) => x + y)wordCountsRdd.collect().foreach(println)sc.stop()}
}

4.3 方法三:Spark RDD 实现 (使用 groupByKey )

这种方法也能实现 WordCount,但通常性能不如 reduceByKey,因为它会导致大量的数据在网络中Shuffle

在这里插入图片描述

代码 (WordCount03.scala):

package Spark.Core.WordCountimport org.apache.spark.{SparkConf, SparkContext}object WordCount03 {def main(args: Array[String]): Unit = {// 1、创建 Spark 运行上下文val conf = new SparkConf().setAppName("WordCount_PatternMatching").setMaster("local[*]")val sc = new SparkContext(conf)// 2、读取 textFile 获取文件// 读取单个或多个文件val linesRdd = sc.textFile("E:\\BigData\\Spark\\SparkPractice\\SparkBasis\\Datas\\WordCount\\*")// 3、扁平化操作val wordsRdd = linesRdd.flatMap(line => line.split("\\s+"))// 4、结构转换val pairRdd = wordsRdd.map(word => (word, 1))// 5、利用 groupByKey 对 key 进行分组,再对 value 值进行聚合val groupedRdd = pairRdd.groupByKey()// 6、(自己选择) 利用 map 将每个元素处理成最终结果val wordCountsRdd = groupedRdd.map {case (word, ones) => (word, ones.sum)// case (word, ones) => (word, ones.size)  // 对于 (word, 1) 的情况, .size 和 .sum 结果一样}wordCountsRdd.collect().foreach(println)sc.stop()}
}

总结

至此,您已经成功完成了在 IntelliJ IDEA 中搭建 Spark 开发环境全过程,包括项目创建、Scala配置、Maven依赖管理,以及解决 Windows 环境下关键问题,并通过三种不同的方式实现了 WordCount 案例。现在,您可以在这个强大的环境开始您Spark开发之旅了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/89808.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89808.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/89808.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】算法实现1

实现一个动态规划算法 def dynamic_programming_example(n: int) -> List[int]:"""动态规划示例&#xff1a;计算斐波那契数列参数:- n: 斐波那契数列的项数返回:- List[int]: 斐波那契数列前n项"""if n < 0:return []elif n 1:return […

C++控制台贪吃蛇开发:从0到1绘制游戏世界

资料合集下载链接: ​​https://pan.quark.cn/s/472bbdfcd014​ 本文将带你一步步实现以下目标: 初始化游戏元素(边界、蛇、食物)的数据。 绘制静态的游戏边界(墙)。 在指定位置显示蛇和食物。 学习并使用Windows API来精确定位光标,实现“指哪打哪”的绘图。 隐藏闪烁…

共享模式、社群与开源链动2+1模式AI智能名片S2B2C商城小程序的协同发展研究

摘要&#xff1a;本文深入探讨了共享模式与社群之间的内在联系&#xff0c;指出信用体系完善是共享模式前提&#xff0c;信任源于相同认知促使共享在社群中更易发生。同时&#xff0c;引入开源链动21模式AI智能名片S2B2C商城小程序这一新兴元素&#xff0c;分析其在共享模式与社…

LeetCode 322. 零钱兑换 LeetCode 279.完全平方数 LeetCode 139.单词拆分 多重背包基础 56. 携带矿石资源

LeetCode 322. 零钱兑换 思路1&#xff1a; 回溯算法可以做&#xff0c;只要存储数组的最小长度即可&#xff0c;但可能会超时。思路2: 相当于是求最大价值的相反面&#xff0c;另外一个物品可以使用多次&#xff0c;因此是个完全背包。因此这是个完全背包的求最小价值类型题…

JAVA面试宝典 -《Elasticsearch 深度调优实战》

文章目录一、引言&#xff1a;搜索引擎为啥越来越慢&#xff1f;1.1 典型业务场景性能瓶颈表现​​&#xff1a;二、倒排索引压缩&#xff1a;让存储与检索更高效&#x1f9e0; 2.1倒排索引结构简述&#x1f527; 2.2 压缩算法三剑客✅ 调优建议三、分片策略&#xff1a;写入性…

克鲁斯焊接机器人保护气省气方案

在现代焊接工艺中&#xff0c;克鲁斯焊接机器人扮演着至关重要的角色。随着制造业对成本控制和可持续发展的日益重视&#xff0c;焊接过程中的保护气省气问题成为了焦点。WGFACS节气装置为克鲁斯焊接机器人的保护气省气提供了一种创新且有效的解决方案。克鲁斯焊接机器人以其高…

JavaEE——多线程中的哈希表

目录前言1.HashTable2.ConcurrentHashMap总结前言 在使用多线程前&#xff0c;我们用HashMap类来创建哈希表&#xff0c;但这个类线程不安全&#xff0c;在这篇文章&#xff0c;我们将介绍多线程环境的哈希表&#xff0c;将会讲述HashTable, HashMap, ConcurrentHashMap这三个…

MyBatis Plus SQL性能分析:从日志到优化的全流程实战指南

引言 在Java开发的江湖里&#xff0c;MyBatis Plus&#xff08;MP&#xff09;早已是“效率利器”——它用极简的API封装了CRUD操作&#xff0c;让开发者从重复的SQL编写中解放出来。但随着项目数据量从“万级”跃升至“十万级”“百万级”&#xff0c;一个尴尬的现实逐渐浮现&…

备忘录设计模式

备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为设计模式&#xff0c;用于捕获对象的内部状态并在需要时恢复该状态&#xff0c;同时不破坏对象的封装性。它适用于需要实现撤销/重做、历史记录或状态快照的场景。核心组件Originator&#xff08;原发器&#xff0…

【世纪龙科技】智能网联汽车环境感知系统教学难题的创新实践​

在职业院校智能网联汽车专业教学中&#xff0c;环境感知系统的教学长期面临三大核心挑战&#xff1a;设备成本高昂导致实训资源不足、抽象原理难以直观呈现、传统教学模式难以满足产业需求。如何让学生在有限的教学条件下&#xff0c;深入理解激光雷达、毫米波雷达等核心部件的…

ES vs Milvus vs PG vector :LLM时代的向量数据库选型指南

互联网时代&#xff0c;关系型数据库为王。相应的&#xff0c;我们的检索方式也是精确匹配查询为主——查找特定的用户ID、商品编号或订单状态。但AI时代&#xff0c;语义检索成为常态&#xff0c;向量数据库成为搜索推荐系统&#xff0c;大模型RAG落地&#xff0c;自动驾驶数据…

磁盘阵列技术的功能与分类

磁盘阵列技术 磁盘阵列是由多台磁盘存储器组成的一个快速、大容量、高可靠的外存子系统。现在常见的磁盘阵列称为廉价冗余磁盘阵列&#xff08;Redundant Array of Independent Disk,RAID)。目前&#xff0c;常见的 RAID 如下所示。 廉价冗余磁盘阵列 RAID级别 RAID-0是一种不具…

SpringMVC核心注解:@RequestMapping详解

概述RequestMapping是SpringMVC中最核心的注解之一&#xff0c;用于将HTTP请求映射到MVC和REST控制器的处理方法上。基本功能RequestMapping主要用于&#xff1a;映射URL到控制器类或方法定义请求方法类型&#xff08;GET、POST等&#xff09;定义请求参数、请求头等条件使用位…

【杂谈】硬件工程师怎么用好AI工具做失效分析

最近被派到国外出差了&#xff0c;工作任务比较重&#xff0c;所以更新的频率比较低。但在出差工作的过程中&#xff0c;我发现在失效分析时&#xff0c;有相当多的时间做的是比较重复的工作。比如失效分析肯定要一些证据如图片、视频。当我们做多台设备的失效分析时&#xff0…

MyBatis详解以及在IDEA中的开发

MyBatis概述 MyBatis是一个优秀的持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的过程。 核心特点 优势&#xff1a; SQL语句与Java代码分离&#xff0c;便于维护支持动态SQL&#xff0c;灵活性…

LangGraph教程6:LangGraph工作流人机交互

文章目录 Human-in-the-loop(人机交互) interrupt Warning Human-in-the-loop(人机交互) 人机交互(或称“在循环中”)工作流将人类输入整合到自动化过程中,在关键阶段允许决策、验证或修正。这在基于 LLM 的应用中尤其有用,因为基础模型可能会产生偶尔的不准确性。在合规、…

Linux部署Milvus数据库及Attu UI工具完全指南

一、准备工作1.1 环境要求操作系统&#xff1a;Ubuntu 20.04/Debian 11/CentOS 7硬件配置&#xff1a;至少8GB内存&#xff0c;4核CPU&#xff0c;50GB磁盘空间网络要求&#xff1a;可访问互联网&#xff08;用于拉取Docker镜像&#xff09;1.2 安装Docker和Docker Compose1.2.…

开疆智能Profinet转ModbusTCP网关连接康耐视InSight相机案例

相机配置&#xff1a;硬件连接部分可以查询我的博客&#xff1a;点击 这里不做说明。在电子表格视图下&#xff0c;点击菜单 “传感器–网络设置”&#xff1a;选择工业协议&#xff0c;如图。保存作业&#xff0c;并按照提示重启相机。3. 相机的控制/状态字&#xff1a;上图中…

BERT技术架构

### **一、整体定位&#xff1a;纯编码器架构**#### **核心设计思想**> **预训练微调**&#xff1a;> 1. **预训练**&#xff1a;在海量无标签文本上学习通用语言规律> 2. **微调**&#xff1a;用少量标注数据适配具体任务&#xff08;如分类/问答&#xff09;> **…

Python+ArcGIS+AI蒸散发与GPP估算|Penman-Monteith模型|FLUXNET数据处理|多源产品融合|专业科研绘图与可视化等

结合Python编程与ArcGIS工具&#xff0c;通过AI辅助方法实现蒸散发与植被总初级生产力估算。学习国际流行的Penman-Monteith模型&#xff0c;掌握数据获取、处理、分析和可视化全流程&#xff0c;培养生态水文与双碳领域的实践应用能力。通过DeepSeek、豆包等AI工具辅助代码编写…