1. 程式人生 > >Spark基礎到高階 第 二 課 安裝和測試spark

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/*