Spark集群 + Akka + Kafka + Scala 開發(2) : 開發一個Spark應用


[comment]: # Spark集群 + Akka + Kafka + Scala 開發(2) : 開發一個Spark應用

前言

Spark集群 + Akka + Kafka + Scala 開發(1) : 配置開發環境,我們已經部署好了一個Spark的開發環境。
本文的目標是寫一個Spark應用,並可以在集群中測試。

創建一個Scala的工程- SimpleAPP

  • 建一個目錄SimpleAPP
mkdir SimpleAPP
mkdir -p SimpleAPP/src/main/scala
  • 建一個SimpleAPP/src/main/scala/SimpleApp.scala文件
    這個程序會進行MapReduce計算,計算從1到輸入參數n的平方和。
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object SimpleApp {
  def main(args: Array[String]) {
    squareSum(10000)
  }

  private def squareSum(n: Long): Long = {
    val conf = new SparkConf().setAppName("Simple Application")
    val sc = new SparkContext(conf)

    val squareSum = sc.parallelize(1L until n).map { i => 
      i * i
    }.reduce(_ + _)

    println(s"============== The square sum of $n is $squareSum. ==============")

    squareSum
  }
}
  • 建一個SimpleAPP/build.sbt文件
name := "Simple Application Project"

version := "1.0"

scalaVersion := "2.11.8"

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.0.0"

構建你的工程

  • 構建工程
# move to the project folder
cd SimpleAPP

# build the project
sbt package

Output:

[info] Packaging .../target/scala-2.11/simple-application-project_2.11-1.0.jar ...
[info] Done packaging.

粗體的部分是構建出來的jar文件相對路徑。需要記住,運行的時候有用。

  • 運行工程
    使用spark提供的命令運行我們的spark應用。
    --master local[4]表示在local模式下運行,使用4個線程。
# run the project in local with 4 threads
$SPARK_HOME/bin/spark-submit --master local[4] --class SimpleApp target/scala-2.11/simple-application-project_2.11-1.0.jar

輸出 (會有很多的log輸出):

...
============== The square sum of 10000 is 333283335000. ==============
...

現在,我們完成了一個簡單的spark工程的開發。下一步,看看如何在集群中運行。

啟動一個standalone集群環境。

部署一個standalone集群環境不是本文要講的內容。
所以,現在我們只使用單機上的集群功能。
如果想部署一個有多個機器的standalone集群環境,可以查看在官網上的說明。部署起來也比較簡單。

基本概念

  • Master server
    集群環境中,主從架構里的主服務器。
    可以有多個master server,只能有一個是leader,其它的都是standby。(我猜的)
    Spark使用ZooKeeper的實現主服務器的災難恢復。

  • Slave worker
    集群環境中,主從架構里的從服務器。

  • Master URL
    在standalone集群環境中,master服務器啟動后,master服務器提供了一個master URL用於和slave workers交互。
    默認的Master URL是:spark://$(hostname):7077
    實際的Master URL可以在master服務器的日志中找到。
    這個Master URL用於:

    • 啟動slave workers。
    • Spark應用的--master配置。
  • Master Web UI
    在master服務器啟動后,master服務器提供了一個web應用,可以通過瀏覽器來查看運行的狀態。
    默認的Master Web UI URL是:http://localhost:8080
    實際的Master Web UI URL可以在master服務器的日志中找到。

  • Slave Web UI
    在Slave worker啟動后,slave worker提供了一個web應用,可以通過瀏覽器來查看運行的狀態。
    默認的Slave Web UI URL是:http://localhost:8081
    實際的Slave Web UI URL可以在master服務器的日志中找到。

啟動master和slave服務

  • 啟動master服務器
# start master
$SPARK_HOME/sbin/start-master.sh

輸出:

starting org.apache.spark.deploy.master.Master, logging to /opt/spark/logs/spark-steven-org.apache.spark.deploy.master.Master-1-sycentos.localdomain.out

  • 如果需要,查看一個Master URL
# We need get the spark master url
cat $SPARK_HOME/logs/spark-steven-org.apache.spark.deploy.master.Master-1-sycentos.localdomain.out | grep Master:
# or
cat $SPARK_HOME/logs/spark-$(whoami)-org.apache.spark.deploy.master.Master-1-$(hostname).out | grep Master:

輸出:

16/09/23 19:45:37 INFO Master: Started daemon with process name: 4604@sycentos.localdomain
16/09/23 19:45:42 INFO Master: Starting Spark master at spark://sycentos.localdomain:7077
16/09/23 19:45:42 INFO Master: Running Spark version 2.0.0
16/09/23 19:45:44 INFO Master: I have been elected leader! New state: ALIVE
16/09/23 19:59:26 INFO Master: Registering worker 10.0.2.15:36442 with 4 cores, 2.7 GB RAM
16/09/23 20:15:13 INFO Master: 10.0.2.15:42662 got disassociated, removing it.
16/09/23 20:15:13 INFO Master: 10.0.2.15:36442 got disassociated, removing it.
16/09/23 20:15:13 INFO Master: Removing worker worker-20160923195923-10.0.2.15-36442 on 10.0.2.15:36442
16/09/23 20:15:39 INFO Master: Registering worker 10.0.2.15:42462 with 4 cores, 2.7 GB RAM

Note: Master: I have been elected leader! New state: ALIVE
粗體就是Master URL.

  • 啟動slave
$SPARK_HOME/sbin/start-slave.sh spark://$(hostname):7077
# or
# $SPARK_HOME/sbin/start-slave.sh spark://sycentos.localdomain:7077

輸出:

starting org.apache.spark.deploy.worker.Worker, logging to /opt/spark/logs/spark-steven-org.apache.spark.deploy.worker.Worker-1-sycentos.localdomain.out

  • 如果需要,檢測是否slave被成功啟動了。
cat $SPARK_HOME/logs/spark-$(whoami)-org.apache.spark.deploy.worker.Worker-1-$(hostname).out | grep spark://
# or
# cat $SPARK_HOME/logs/spark-steven-org.apache.spark.deploy.worker.Worker-1-sycentos.localdomain.out

輸出:

16/09/23 20:15:39 INFO Worker: Successfully registered with master spark://sycentos.localdomain:7077

這時,spart的master和slave服務都已經啟動。

說明一下,關閉Master的命令是:

$SPARK_HOME/sbin/stop-master.sh
$SPARK_HOME/sbin/stop-slave.sh

在集群環境上,運行SimpleAPP

進入到SimpleApp的目錄,並運行:

# run the project
$SPARK_HOME/bin/spark-submit --master spark://$(hostname):7077 --class SimpleApp target/scala-2.11/simple-application-project_2.11-1.0.jar

輸出:

...
16/09/23 20:34:40 INFO StandaloneAppClient\(ClientEndpoint: Connecting to master spark://sycentos.localdomain:7077... ... 16/09/23 20:34:40 INFO StandaloneAppClient\)ClientEndpoint: Executor added: app-20160923203440-0000/0 on worker-20160923201537-10.0.2.15-42462 (10.0.2.15:42462) with 4 cores
...

通過查找關鍵字master和worker,可以確認是在集群上運行。

訪問master web UI.

獲取Master Web UI的地址。

從master服務的log里,可以找到master URL。

# Query master web UI url from master service log.
cat /opt/spark/logs/spark-steven-org.apache.spark.deploy.master.Master-1-sycentos.localdomain.out | grep MasterWebUI

輸出:

16/09/23 19:45:43 INFO MasterWebUI: Bound MasterWebUI to 0.0.0.0, and started at http://10.0.2.15:8080

訪問Master Web UI

通過瀏覽器訪問http://localhost:8080/,可以看到有一個完成的應用。

現在,我們已經可以在集群環境中運行SimpleApp

理解Spark Application

  • 一個Spark Application是一個運行在Spark環境中的Java應用。
  • 需要在安裝了Spark的機器上,通過Spark命令來啟動。
  • Spark Application是通過Spark Master URL和Spark Master Server交互,因此,不一定需要在Spark的Master或者Slave上啟動。
  • Spark Application是通過SparkConf和SparkContext與Spark系統交互。

下面請看

至此,我們已經寫好了一個spark集群scala的應用。下一步請看:
Spark集群 + Akka + Kafka + Scala 開發(3) : 開發一個Akka + Spark的應用
Spark集群 + Akka + Kafka + Scala 開發(4) : 開發一個Kafka + Spark的應用

參照


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM