前言
接下來下定決心好好學習Spark了。。。ps:關於Spark安裝和使用以及Spark分佈式集羣環境搭建,請見參考內容1-4,這裏就不作闡述了。
步驟
-
首先安裝Scala插件,File->Settings->Plugins,搜索出Scla插件,點擊Install安裝;
-
File->New Project->maven,新建一個Maven項目,填寫GroupId和ArtifactId;
-
編輯pom.xml文件,添加項目所需要的依賴:前面幾行是系統自動生成的,我們只需要從
<version>1.0-SNAPSHOT</version>
之後開始添加就行。關於spark.version和scala.version需要在服務器通過啓動spark-shell查詢。<?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>test</groupId> <artifactId>SparkPi</artifactId> <version>1.0-SNAPSHOT</version> <properties> <spark.version>2.4.4</spark.version> <scala.version>2.11</scala.version> </properties> <repositories> <repository> <id>nexus-aliyun</id> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </repository> </repositories> <dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_${scala.version}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming_${scala.version}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_${scala.version}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_${scala.version}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-mllib_${scala.version}</artifactId> <version>${spark.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.scala-tools</groupId> <artifactId>maven-scala-plugin</artifactId> <version>2.15.2</version> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.19</version> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build> </project>
-
File->Project Structure->Libraries,選擇和Spark運行環境一致的Scala版本
-
File->Project Structure->Modules,在src/main/下面增加一個scala文件夾,並且設置成source文件夾
-
在scala文件夾下面新建一個scala文件SparkPi
SparkPi文件的代碼如下:其中,setMaster用來指定spark集羣master的位置;setJars用來指定程序jar包的位置,此位置在下面1步中添加程序jar包的output directory可以看到。import scala.math.random import org.apache.spark._ object SparkPi { def main(args: Array[String]) { val conf = new SparkConf().setAppName("Spark Pi").setMaster("spark://222.201.187.178:7077").setJars(Seq("E:\\IdeaProjects\\SparkPi\\out\\artifacts\\SparkPi_jar\\SparkPi.jar")) val spark = new SparkContext(conf) val slices = if (args.length > 0) args(0).toInt else 2 println("Time:" + spark.startTime) val n = math.min(1000L * slices, Int.MaxValue).toInt // avoid overflow val count = spark.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("Pi is roughly " + 4.0 * count / n) spark.stop() } }
-
File->Project Structure->Artifacts,新建一個Jar->From modules with dependencies…,選擇Main Class,之後在Output Layput中刪掉不必要的jar
這裏的output directory即爲前面SparkPi.scala代碼裏setJars用來指定程序jar包的位置
注意這裏如果沒有刪除沒用的jar包,後面執行會報錯java.lang.ClassNotFoundException: SparkPi$$anonfun$1
-
在服務器集羣配置文件/usr/local/spark/conf/spark-env.sh中加入以下代碼:
export SPARK_SUBMIT_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"
address:JVM在5005端口上監聽請求,這個設定爲一個不衝突的端口即可。 server:y表示啓動的JVM是被調試者,n表示啓動的JVM是調試器。 suspend:y表示啓動的JVM會暫停等待,直到調試器連接上才繼續執行,n則JVM不會暫停等待。
-
在服務器Master節點主機上啓動hadoop集羣,然後再啓動spark集羣,最後運行jps命令檢查進程。
cd /usr/local/hadoop/ sbin/start-all.sh # 啓動hadoop集羣 cd /usr/local/spark/ sbin/start-master.sh # 啓動Master節點 sbin/start-slaves.sh # 啓動所有Slave節點 jps
-
在IDEA上添加遠程配置,根據spark集羣中spark-env.sh的SPARK_SUBMIT_OPTS的變量,對遠程執行進行配置,保持端口號一致
-
配置完成,右鍵run執行scala程序。初次運行報錯如下,選擇右下角彈窗中的enable auto import,然後再重新執行一次。
完美!!! -
結束記得關閉spark集羣哦
sbin/stop-master.sh # 關閉Master節點 sbin/stop-slaves.sh # 關閉Worker節點 cd /usr/local/hadoop/ sbin/stop-all.sh # 關閉Hadoop集羣
參考內容
- Hadoop安裝教程_單機/僞分佈式配置_Hadoop2.6.0/Ubuntu14.04_廈大數據庫實驗室博客
http://dblab.xmu.edu.cn/blog/install-hadoop/ - Hadoop集羣安裝配置教程_Hadoop2.6.0_Ubuntu/CentOS_廈大數據庫實驗室博客
http://dblab.xmu.edu.cn/blog/install-hadoop-cluster/ - Spark安裝和使用_廈大數據庫實驗室博客
http://dblab.xmu.edu.cn/blog/931-2/ - Spark 2.0分佈式集羣環境搭建_廈大數據庫實驗室博客
http://dblab.xmu.edu.cn/blog/1187-2/ - 利用idea對spark程序進行遠程提交和調試 - yiluohan0307的專欄 - CSDN博客
https://blog.csdn.net/yiluohan0307/article/details/80048765 - 使用Intellij IDEA開發並提交Spark應用到遠程Spark集羣 - Camu7s的專欄 - CSDN博客
https://blog.csdn.net/Camu7s/article/details/45530295 - Intellij IDEA連接Spark集羣 - MSTK - 博客園
https://www.cnblogs.com/mstk/p/6875068.html?utm_source=itdadao&utm_medium=referral - java.lang.ClassNotFoundException: SparkPi$$anonfun$1 - weixin_34019144的博客 - CSDN博客
https://blog.csdn.net/weixin_34019144/article/details/86440499