Spark基礎到高階 第 二 課 安裝和測試spark
二 spark安裝
2.1 linux的機器部署
這裡我們使用的是叢集模式來安裝,準備兩臺以上Linux伺服器,安裝好JDK1.8。
<?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>com.atguigu</groupId> <artifactId>spark</artifactId> <version>1.0-SNAPSHOT</version> <modules> <module>sparkcore</module> </modules> <!-- 表明當前專案是一個父專案,沒有具體程式碼,只有宣告的共有資訊 --> <packaging>pom</packaging> <!-- 宣告公有的屬性 --> <properties> <spark.version>2.1.1</spark.version> <scala.version>2.11.8</scala.version> <log4j.version>1.2.17</log4j.version> <slf4j.version>1.7.22</slf4j.version> </properties> <!-- 宣告並引入公有的依賴 --> <dependencies> <!-- Logging --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <!-- Logging End --> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>${scala.version}</version> <!--<scope>provided</scope>--> </dependency> </dependencies> <!-- 僅宣告公有的依賴 --> <dependencyManagement> <dependencies> <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>${spark.version}</version> <!-- 編譯環境能用,執行環境不可用 --> <!--<scope>provided</scope>--> </dependency> </dependencies> </dependencyManagement> <!-- 配置構建資訊 --> <build> <!-- 宣告並引入構建的外掛 --> <plugins> <!-- 設定專案的編譯版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <!-- 用於編譯Scala程式碼到class --> <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>3.2.2</version> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> </plugins> <!-- 僅宣告構建的外掛 --> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </pluginManagement> </build> </project>
2.2 安裝JDK
1)解除安裝現有jdk
(1)查詢是否安裝java軟體:
[[email protected] opt]# rpm -qa|grep java
(2)如果安裝的版本低於1.7,解除安裝該jdk:
[[email protected] opt]# rpm -e 軟體包
(1)下載 登入Oracle官網http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html,同意協議條款,選擇64位Linux版tar包連結,可以直接單擊連結下載,推薦通過多執行緒下載工具(比如迅雷)加速下載。
2)用SecureCRT工具將jdk、Hadoop-2.7.2.tar.gz匯入到opt目錄下面的software資料夾下面
3)在linux系統下的opt目錄中檢視軟體包是否匯入成功。
[[email protected]]# cd software/
[[email protected]]# ls
hadoop-2.7.2.tar.gz jdk-8u144-linux-x64.tar.gz
4)解壓jdk到/opt/module目錄下
[[email protected]]# tar -zxvf jdk-8u144-linux-x64.tar.gz -C /opt/module/
5)配置jdk環境變數
(1)先獲取jdk路徑:
[[email protected] jdk1.8.0_144]# pwd
/opt/module/jdk1.8.0_144
(2)開啟/etc/profile檔案:
[[email protected] jdk1.8.0_144]# vi /etc/profile
在profie檔案末尾新增jdk路徑:
##JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
(3)儲存後退出:
:wq!
(4)讓修改後的檔案生效:
[[email protected] jdk1.8.0_144]# source /etc/profile
(5)重啟(如果java -version可以用就不用重啟):
[[email protected] jdk1.8.0_144]# sync
[[email protected] jdk1.8.0_144]# reboot
6)測試jdk安裝成功
[[email protected] jdk1.8.0_144]# java -version
java version "1.8.0_144"
2.2 下載Spark安裝
(1)登入Spark官網http://spark.apache.org/downloads.html (2)第1個選擇spark發行版(選擇2.2.0版),第2個選擇軟體包型別(選擇Hadoop 2.7),第3個選擇下載型別(直接下載較慢,選擇Select Apache Mirror) (3)單擊spark-2.2.0-bin-hadoop2.7.tgz連結,選擇國內映象 其他方式,也可以
把下載好的檔案上傳到opt目錄下,解壓到
(4)然後解壓縮/opt目錄。我們約定Linux平臺下第三方軟體包都放到/opt目錄下。
[[email protected] ~]# tar -zxvf spark-2.2.0-bin-hadoop2.7.tgz -C /opt
2.3 配置spark - 這裡我們使用的是standalone模式
將slaves.template複製為slaves 將spark-env.sh.template複製為spark-env.sh 配置Spark【Standalone】 Spark的部署模式有Local、Standalone、Yarn、Mesos,我們選擇最具代表的standalone模式 修改spark-env.sh檔案,新增如下配置: 重新命名並修改slaves.template檔案 mv slaves.template slaves vi slaves 在該檔案中新增子節點所在的位置(Worker節點) linux102 linux103 linux104 儲存退出
將配置好的Spark檔案分發到其他節點上 Spark叢集配置完畢,目前是1個Master,2個Work,master01上啟動Spark叢集 /home/bigdata/hadoop/spark-2.1.1-bin-hadoop2.7/sbin/start-all.sh 啟動後執行jps命令,主節點上有Master程序,其他子節點上有Work進行,登入Spark管理介面檢視叢集狀態(主節點):http://master01:8080/
注意:如果遇到 “JAVA_HOME not set” 異常,可以在sbin目錄下的spark-config.sh 檔案中加入如下配置: export JAVA_HOME=XXXX
2.3.1 測試是否OK
啟動後執行jps命令,主節點上有Master程序,其他子節點上有Work進行,登入Spark管理介面檢視叢集狀態(主節點):http://linux102:8080/
三 執行Spark 程式
3.1 執行第一個spark應用程式
/opt/module/sparktest/bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master spark://linux102:7077 \ --executor-memory 1G \ --total-executor-cores 2 \ /opt/module/sparktest/examples/jars/spark-examples_2.11-2.1.1.jar \ 100
該演算法是利用蒙特·卡羅演算法求PI
3.2 Spark-shell
/opt/module/sparktest/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node01:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
/usr/local/spark-1.6.1-bin-hadoop2.6/lib/spark-examples-1.6.1-hadoop2.6.0.jar \
100
該演算法是利用蒙特·卡羅演算法求PI
引數說明:
--master spark://master01:7077 指定Master的地址
--executor-memory 1G 指定每個executor可用記憶體為1G
--total-executor-cores 2 指定每個executor使用的cup核數為2個
3.2 Spark shell中編寫WordCount
3.2.1 啟動sparkshell
spark-shell是Spark自帶的互動式Shell程式,方便使用者進行互動式程式設計,使用者可以在該命令列下用scala編寫spark程式。
/home/bigdata/hadoop/spark-2.1.1-bin-hadoop2.7/bin/spark-shell \
--master spark://master01:7077 \
--executor-memory 2g \
--total-executor-cores 2
注意:
如果啟動spark shell時沒有指定master地址,但是也可以正常啟動spark shell和執行spark shell中的程式,其實是啟動了spark的local模式,該模式僅在本機啟動一個程序,沒有與叢集建立聯絡。
Spark Shell中已經預設將SparkContext類初始化為物件sc。使用者程式碼如果需要用到,則直接應用sc即可
3.2.2 在spark-shell中編寫wordCount
1.首先啟動hdfs 2.向hdfs上傳一個檔案到hdfs://node01:9000/words.txt 3.在spark shell中用scala語言編寫spark程式 sc.textFile("hdfs://node01:9000/words.txt").flatMap(_.split(" ")) .map((_,1)).reduceByKey(_+_).saveAsTextFile("hdfs://node01:9000/out")
4.使用hdfs命令檢視結果 hdfs dfs -ls hdfs://node01:9000/out/p*
說明: sc是SparkContext物件,該物件是提交spark程式的入口 textFile(hdfs://node01:9000/words.txt)是hdfs中讀取資料 flatMap(_.split(" "))先map再壓平 map((_,1))將單詞和1構成元組 reduceByKey(_+_)按照key進行reduce,並將value累加 saveAsTextFile("hdfs://node01:9000/out")將結果寫入到hdfs中
3.3 在idea中編寫spark程式
spark shell僅在測試和驗證我們的程式時使用的較多,在生產環境中,通常會在IDE中編制程式,然後打成jar包,然後提交到叢集,最常用的是建立一個Maven專案,利用Maven來管理jar包的依賴。
spark shell僅在測試和驗證我們的程式時使用的較多,在生產環境中,通常會在IDE中編制程式,然後打成jar包,然後提交到叢集,最常用的是建立一個Maven專案,利用Maven來管理jar包的依賴。
1.建立一個專案
2.選擇Maven專案,然後點選next
3.填寫maven的GAV,然後點選next
4.填寫專案名稱,然後點選finish
5.建立好maven專案後,點選Enable Auto-Import
6.配置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>
<groupId>com.atguigu</groupId>
<artifactId>spark</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>sparkcore</module>
</modules>
<!-- 表明當前專案是一個父專案,沒有具體程式碼,只有宣告的共有資訊 -->
<packaging>pom</packaging>
<!-- 宣告公有的屬性 -->
<properties>
<spark.version>2.1.1</spark.version>
<scala.version>2.11.8</scala.version>
<log4j.version>1.2.17</log4j.version>
<slf4j.version>1.7.22</slf4j.version>
</properties>
<!-- 宣告並引入公有的依賴 -->
<dependencies>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- Logging End -->
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
<!--<scope>provided</scope>-->
</dependency>
</dependencies>
<!-- 僅宣告公有的依賴 -->
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
<!-- 編譯環境能用,執行環境不可用 -->
<!--<scope>provided</scope>-->
</dependency>
</dependencies>
</dependencyManagement>
<!-- 配置構建資訊 -->
<build>
<!-- 宣告並引入構建的外掛 -->
<plugins>
<!-- 設定專案的編譯版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- 用於編譯Scala程式碼到class -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<!-- 僅宣告構建的外掛 -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
7. 在專案的目錄結構中,建立scala資料夾,並標記為source
8.以上配置都完成後,就可以在scala上點選右鍵建立scala class了
9.編寫spark程式 package com.qf.spark
import org.apache.spark.{SparkContext, SparkConf}
object WordCount { def main(args: Array[String]) { //建立SparkConf()並設定App名稱 val conf = new SparkConf().setAppName("WC") //建立SparkContext,該物件是提交spark App的入口 val sc = new SparkContext(conf) //使用sc建立RDD並執行相應的transformation和action sc.textFile(args(0)).flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_, 1).sortBy(_._2, false).saveAsTextFile(args(1)) //停止sc,結束該任務 sc.stop() } }
10.使用Maven打包:首先修改pom.xml中的main class
點選idea右側的Maven Project選項
點選Lifecycle,選擇clean和package,然後點選Run Maven Build
11.選擇編譯成功的jar包,並將該jar上傳到Spark叢集中的某個節點上
12.首先啟動hdfs和Spark叢集 啟動hdfs /usr/local/hadoop-2.6.1/sbin/start-dfs.sh 啟動spark /usr/local/spark-1.6.1-bin-hadoop2.6/sbin/start-all.sh
13.使用spark-submit命令提交Spark應用(注意引數的順序)
/opt/module/sparktest/bin/spark-submit \
--class com.itstar.spark.WordCount\
--master spark://master01:7077\
--executor-memory 1G \
--total-executor-cores 2 \
wordcount-jar-with-dependencies.jar\
hdfs://master01:9000/RELEASE\
hdfs://master01:9000/out
檢視程式執行結果
使用hdfs命令檢視結果
hdfs dfs -cat hdfs://linux102:9001/hbase/*