zoukankan      html  css  js  c++  java
  • 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的应用

    参照

  • 相关阅读:
    Flask中的CBV以及正则表达式
    Flask中的渲染变量
    Flask中的request和response
    Flask中的cookie和session
    Flask的请求扩展
    [NOIP2000] 提高组 洛谷P1018 乘积最大
    [NOIP2000] 提高组 洛谷P1017 进制转换
    洛谷P2563 [AHOI2001]质数和分解
    巴蜀4384 -- 【模拟试题】作诗(Poetize)
    [NOIP1999] 提高组 洛谷P1016 旅行家的预算
  • 原文地址:https://www.cnblogs.com/steven-yang/p/5926553.html
Copyright © 2011-2022 走看看