前言
這篇博客是在同事的幫忙下完成的,這裏我做一個記錄,感謝牛逼的同事一波先。哈哈。
本篇博客目的是指導搭建一個Spark的調試環境,在Win10下面。
本人使用的開發工具是IDEA,博客裏面用的的所有依賴包會在博客後面分享給需要的朋友,希望能幫助你,跨好大數據入門的一步。
準備工作
爲了搭建Spark的調試環境,我們下面需要準備一些工具:
- hadoop-2.8.5.tar(Spark需要依賴於Hadoop)
- scala-2.11.12
- winutils-master(hadoop不可以直接在Win下運行,所以需要這個工具)
- IDEA 2018
- jdk1.8、maven等基礎環境
下載安裝包
-
下載Spark
我們知道Spark的啓動需要依賴於Hadoop,通過官方的說明,可以知道它是在Hadoop對應的版本上面進行構建的。
我們先到Spark官網看看,然後選擇我們需要的Spark版本。
我下載spark-2.4.0-bin-hadoop2.7這個版本。根據官網提供的信息,這個Spark版本,構建在Hadoop2.7之後的版本,並且需要Scala版本2.11
-
下載Scala
根據我們Spark的版本,我們到Scala官網下載2.11.12這個Scala SDK版本
-
下載Hadoop
接下來,我們需要到Hadoop官網下載,對應版本的Hadoop.
-
下載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