Window下Spark環境搭建(可跑代碼調試)

前言

這篇博客是在同事的幫忙下完成的,這裏我做一個記錄,感謝牛逼的同事一波先。哈哈。

本篇博客目的是指導搭建一個Spark的調試環境,在Win10下面
本人使用的開發工具是IDEA,博客裏面用的的所有依賴包會在博客後面分享給需要的朋友,希望能幫助你,跨好大數據入門的一步。

準備工作

爲了搭建Spark的調試環境,我們下面需要準備一些工具:

  • hadoop-2.8.5.tar(Spark需要依賴於Hadoop)
  • scala-2.11.12
  • winutils-master(hadoop不可以直接在Win下運行,所以需要這個工具)
  • IDEA 2018
  • jdk1.8、maven等基礎環境

下載安裝包

  1. 下載Spark
    我們知道Spark的啓動需要依賴於Hadoop,通過官方的說明,可以知道它是在Hadoop對應的版本上面進行構建的
    我們先到Spark官網看看,然後選擇我們需要的Spark版本。
    在這裏插入圖片描述
    我下載spark-2.4.0-bin-hadoop2.7這個版本。

    根據官網提供的信息,這個Spark版本,構建在Hadoop2.7之後的版本,並且需要Scala版本2.11

  2. 下載Scala

    根據我們Spark的版本,我們到Scala官網下載2.11.12這個Scala SDK版本
    在這裏插入圖片描述

  3. 下載Hadoop
    接下來,我們需要到Hadoop官網下載,對應版本的Hadoop.
    在這裏插入圖片描述

  4. 下載winutils-master

由於在win下不可以運行hadoop,雖然我們下載了Hadoop的軟件包,還是不可以直接使用。
爲了解決這個問題,我們需要額外下載一個東西winutils-master。

在這裏插入圖片描述
然後把裏面hadoop-2.8.3\bin裏面的文件替換到我們之前hadoop源碼包的bin目錄下。

環境變量的配置

軟件包已經下載完成了,我們開始進行環境變量的配置!

在這裏插入圖片描述

環境變量的配置中,我們需要把環境變量配置在系統變量裏面。

如果配置在用戶變量裏面,當管理員運行用戶運行項目的時候,讀取不到我們配置的用戶變量。

在這裏插入圖片描述

具體的配置說明:

JAVA_HOME=C:\Program Files\Java\jdk1.8.0_181
SPARK_HOME=D:\code\bigData\spark-2.4.0-bin-hadoop2.7
HADOOP_HOME=D:\code\bigData\hadoop-2.8.5
SCALA_HOME=D:\code\bigData\scala-2.11.12

在這裏插入圖片描述

啓動Spark

命令行使用命令spark-shell,過一會兒按下回車鍵。

出現如下界面。
在這裏插入圖片描述

spark在win下啓動成功,spark web UI此時也纔可以正常訪問!!

啓動Spark Example進行調試

下載Spark源碼

我們需要到github下載spark源代碼。

在這裏插入圖片描述

我們選擇最新的分支2.4,使用git下載到本地。

git clone https://github.com/apache/spark.git
在這裏插入圖片描述

由於項目是使用Maven構建的,所以我們可以先配置阿里鏡像源,加快我們項目的構建速度,maven的setting.xml文件,mirrors節點下,添加如下配置:

 <mirror>  
		<id>nexus-aliyun</id>  
		<mirrorOf>central</mirrorOf>    
		<name>aliyun</name>  
		<url>http://maven.aliyun.com/nexus/content/groups/public</url>  
	</mirror> 

然後使用idea打開源碼下面的example項目。(idea需要安裝Scala插件,請自行安裝!

修改pom文件的scope

運行項目的時候如果scope爲provided會遇到下面的異常

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/sql/SparkSession$
	at org.apache.spark.examples.SparkPi$.main(SparkPi.scala:11)
	at org.apache.spark.examples.SparkPi.main(SparkPi.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.sql.SparkSession$
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 2 more

解決方法是修改pom.xml文件全局替換provided爲compile

補充依賴包

此時idea運行項目,看看情況


object SparkPi {
  def main(args: Array[String]) {
    val spark = SparkSession
      .builder
        .master("local[1]")//我們spark環境是在本地,所以設置local模式
      .appName("Spark Pi")
      .getOrCreate()
    val slices = if (args.length > 0) args(0).toInt else 2
    val n = math.min(100000L * slices, Int.MaxValue).toInt // avoid overflow
    val count = spark.sparkContext.parallelize(1 until n, slices).map { i =>
      val x = random * 2 - 1
      val y = random * 2 - 1
      if (x*x + y*y <= 1) 1 else 0
    }.reduce(_ + _)
    println(s"Pi is roughly ${4.0 * count / (n - 1)}")
    spark.stop()
  }
}
  

出現了下面的異常

Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
19/01/09 10:20:29 INFO SparkContext: Running Spark version 3.0.0-SNAPSHOT
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/collect/Maps
...

根據異常提示(或者其他google common的錯誤),我們在pom.xml文件添加依賴包。

    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>18.0</version>
      <scope>compile</scope>
    </dependency>

設置Scala 的SDK

安裝依賴包以後,會看到另外一個異常。

"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:D:\soft\idea\IntelliJ IDEA 2018.2\lib\idea_rt.jar=50319:D:\soft\idea\IntelliJ IDEA 2018.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;D:\code\bigData\spark\examples\target\scala-2.12\classes;C:\Users\win 10\.m2\repository\org\apache\orc\orc-core\1.5.4\orc-core-1.5.4-nohive.jar;C:\Users\win 10\.m2\repository\org\apache\orc\orc-shims\1.5.4\orc-shims-1.5.4.jar;C:\Users\win 10\.m2\repository\io\airlift\aircompressor\0.10\aircompressor-0.10.jar;C:\Users\win 10\.m2\repository\org\apache\orc\orc-mapreduce\1.5.4\orc-mapreduce-1.5.4-nohive.jar;C:\Users\win 10\.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;C:\Users\win 10\.m2\repository\commons-codec\commons-codec\1.10\commons-codec-1.10.jar;C:\Users\win 10\.m2\repository\com\github\scopt\scopt_2.12\3.7.0\scopt_2.12-3.7.0.jar;C:\Users\win 10\.m2\repository\com\google\guava\guava\18.0\guava-18.0.jar;C:\Users\win 10\.m2\repository\com\google\collections\google-collections\1.0\google-collections-1.0.jar" org.apache.spark.examples.SparkPi
Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/Seq
	at org.apache.spark.examples.SparkPi.main(SparkPi.scala)
Caused by: java.lang.ClassNotFoundException: scala.collection.Seq
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 1 more

此時我們,需要進行Scala的SDK設置。
在這裏插入圖片描述
設置sdk以後,還出現了新的問題

Exception in thread "main" java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V
	at org.apache.spark.internal.config.ConfigBuilder.<init>(ConfigBuilder.scala:177)
	at org.apache.spark.internal.config.Tests$.<init>(Tests.scala:24)
	at org.apache.spark.internal.config.Tests$.<clinit>(Tests.scala)
	at org.apache.spark.util.Utils$.isTesting(Utils.scala:1851)
	at org.apache.spark.sql.SparkSession$.org$apache$spark$sql$SparkSession$$assertOnDriver(SparkSession.scala:1085)
	at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:915)
	at org.apache.spark.examples.SparkPi$.main(SparkPi.scala:32)
	at org.apache.spark.examples.SparkPi.main(SparkPi.scala)

Process finished with exit code 1

這個是scala版本錯誤!!
搜索發現依賴的scala版本確實,不一致
在這裏插入圖片描述

那好吧,我們修改scala的sdk試試
在這裏插入圖片描述
重新運行項目,發現正常了,所以我們沒有用我們下載的scala,sdk使用IDEA插件重新下了一個2.12.8的版本。(這裏和官方說的,也就是我們最上面分析的有點出入哦)

運行example例子

經過了重重修改終於可以正常運行了!!

安裝包分享

在這裏插入圖片描述
鏈接:https://pan.baidu.com/s/1ZAwjeqXbEtDIMOKSTtcyxQ
提取碼:hp1k

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章