二、Spark 開發環境搭建 IDEA + Maven 及 WordCount 案例實戰

作者: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工具輔助代碼編寫…