1. 程式人生 > >基於IDEA構建Spark應用並部署

基於IDEA構建Spark應用並部署

前言本章將介紹如何通過IDEA構建Spark應用,並最終部署。構建應用Java應用1、新建一個maven專案,並在POM中新增如下依賴:
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency> <!-- Spark dependency -->
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.11</artifactId>
        <version>2.3.0</version>
    </dependency>
</dependencies>

<build>

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
    </plugins>

</build>
2、基於java8編寫一個main類,讀取spark的README.md檔案,統計包含a、b分別有多少行:
public class SimpleJavaApp {
    public static void main(String[] args) {
        String logFile = "D:/spark-2.3.0-bin-hadoop2.7/README.md";
        SparkConf conf = new SparkConf().setMaster("local[8]");
        SparkSession spark = SparkSession.builder().config(conf).appName("Simple Application").getOrCreate();
        Dataset<String> logData = spark.read().textFile(logFile).cache();
        long numAs = logData.filter((FilterFunction<String>) str -> str.contains("a")).count();
        long numBs = logData.filter((FilterFunction<String>) str -> str.contains("b")).count();

        System.out.println("Lines with a: " + numAs + ", lines with b: " + numBs);
        spark.stop();
    }
}
Note:
  • 通過SparkConf設定master引數,即可設定執行計算模式,先主要介紹Local模式:
Local模式就是執行在一臺計算機上的模式,通常就是用於在本機上練手和測試,有如下幾個方式:
  • local: 所有計算都執行在一個執行緒當中,沒有任何平行計算,通常我們在本機執行一些測試程式碼,或者練手,就用這種模式;
  • local[K]: 指定使用幾個執行緒來執行計算,比如local[4]就是執行4個worker執行緒。通常我們的cpu有幾個core,就指定幾個執行緒,最大化利用cpu的計算能力;
  • local[*]: 這種模式直接幫你按照cpu最多cores來設定執行緒數了;
實際的大規模計算還是需要cluster模式。3、控制檯列印:

Scala應用Scala 原始碼被編譯成Java位元組碼,所以它可以運行於JVM之上,並可以呼叫現有的Java類庫。而Spark正是由Scala開發的,所以天然通過Scala構建的應用將是最佳方案,本小節將直接在當前專案中採用scala實現相同功能。1、在idea中新增scala類庫配置:2、編寫main方法如下:
object SimpleApp {
  def main(args: Array[String]) {
    val logFile = "D:/spark-2.3.0-bin-hadoop2.7/README.md"
    val conf = new SparkConf().setMaster("local[8]")
    val spark = SparkSession.builder.config(conf).appName("Simple Application").getOrCreate()
    val logData = spark.read.textFile(logFile).cache()
    val numAs = logData.filter(line => line.contains("a")).count()
    val numBs = logData.filter(line => line.contains("b")).count()
    println(s"Lines with a: $numAs, Lines with b: $numBs")
    spark.stop()
  }
}
3、控制檯列印:
Local模式部署>spark-submit --class com.shf.spark.SimpleJavaApp --master local[4] --name demo D:\learnworkspace\spark-demo\target\spark-demo-1.0-SNAPSHOT.jar檢視到如下列印資訊表明部署成功:
擴充套件上述的開發環境除錯和部署均採用local模式,實際生產者中必須採用cluster模式,先簡單介紹下概念:cluster模式cluster模式肯定就是執行很多機器上了,但是它又分為以下三種模式,區別在於誰去管理資源排程。這種模式下,Spark會自己負責資源的管理排程。它將cluster中的機器分為master機器和worker機器,master通常就一個,可以簡單的理解為那個後勤管家,worker就是負責幹計算任務活的苦勞力。具體怎麼配置可以參考Spark Standalone Mode使用standalone模式示例:/bin/spark-submit --cluster cluster_name --master spark://host:port ...--master就是指定master那臺機器的地址和埠,我想這也正是--master引數名稱的由來吧。mesos模式這裡就很好理解了,如果使用mesos來管理資源排程,自然就應該用mesos模式了,示例如下:/bin/spark-submit --cluster cluster_name --master mesos://host:port ...yarn模式同樣,如果採用yarn來管理資源排程,就應該用yarn模式,由於很多時候我們需要和mapreduce使用同一個叢集,所以都採用Yarn來管理資源排程,這也是生產環境大多采用yarn模式的原因。yarn模式又分為yarn cluster模式和yarn client模式:
  • yarn cluster: 這個就是生產環境常用的模式,所有的資源排程和計算都在叢集環境上執行。
  • yarn client: 這個是說Spark Driver和ApplicationMaster程序均在本機執行,而計算任務在cluster上。