[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的应用

参照

Spark集群 + Akka + Kafka + Scala 开发(2) : 开发一个Spark应用的更多相关文章

  1. Spark集群 + Akka + Kafka + Scala 开发(3) : 开发一个Akka + Spark的应用

    前言 在Spark集群 + Akka + Kafka + Scala 开发(1) : 配置开发环境中,我们已经部署好了一个Spark的开发环境. 在Spark集群 + Akka + Kafka + S ...

  2. Spark集群 + Akka + Kafka + Scala 开发(1) : 配置开发环境

    目标 配置一个spark standalone集群 + akka + kafka + scala的开发环境. 创建一个基于spark的scala工程,并在spark standalone的集群环境中运 ...

  3. Spark集群 + Akka + Kafka + Scala 开发(4) : 开发一个Kafka + Spark的应用

    前言 在Spark集群 + Akka + Kafka + Scala 开发(1) : 配置开发环境中,我们已经部署好了一个Spark的开发环境. 在Spark集群 + Akka + Kafka + S ...

  4. zhihu spark集群,书籍,论文

    spark集群中的节点可以只处理自身独立数据库里的数据,然后汇总吗? 修改 我将spark搭建在两台机器上,其中一台既是master又是slave,另一台是slave,两台机器上均装有独立的mongo ...

  5. Spark系列—01 Spark集群的安装

    一.概述 关于Spark是什么.为什么学习Spark等等,在这就不说了,直接看这个:http://spark.apache.org, 我就直接说一下Spark的一些优势: 1.快 与Hadoop的Ma ...

  6. 大数据技术之_19_Spark学习_01_Spark 基础解析 + Spark 概述 + Spark 集群安装 + 执行 Spark 程序

    第1章 Spark 概述1.1 什么是 Spark1.2 Spark 特点1.3 Spark 的用户和用途第2章 Spark 集群安装2.1 集群角色2.2 机器准备2.3 下载 Spark 安装包2 ...

  7. 【Spark-core学习之三】 Spark集群搭建 & spark-shell & Master HA

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  8. CentOS6安装各种大数据软件 第十章:Spark集群安装和部署

    相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ...

  9. Spark学习笔记--Linux安装Spark集群详解

    本文主要讲解如何在Linux环境下安装Spark集群,安装之前我们需要Linux已经安装了JDK和Scala,因为Spark集群依赖这些.下面就如何安装Spark进行讲解说明. 一.安装环境 操作系统 ...

随机推荐

  1. Linux下chkconfig命令详解 这个简单明了啊

    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...

  2. Netty学习五:Buffers

    1. Netty中的缓冲 在Netty中并没有使用Java自带的ByteBuffer,而是自己实现提供了一个缓存区来用于标识一个字节序列,并帮助用户操作原始字节或者自定义的POJO. Java NIO ...

  3. java容器详细解析

    前言:在java开发中我们肯定会大量的使用集合,在这里我将总结常见的集合类,每个集合类的优点和缺点,以便我们能更好的使用集合.下面我用一幅图来表示 其中淡绿色的表示接口,红色的表示我们经常使用的类. ...

  4. WP中的语音识别(下):语音指令

    除了系统集成的可以用于搜索.启动应用程序等语音命令外,在我们的应用程序内部还能自己定义语音指令,使得我们的APP能与语音操控结合得更加完全. 语音指令是通过一个XML文件来定义的.比如,咱小舅子开了家 ...

  5. 详解JavaScript模块化开发

    什么是模块化开发? 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了,jQuery,Ajax,Node.Js,MVC,MVVM等 ...

  6. php分享(三十六)mysql中关联表更新

    一:关联不同的表更新 1: 通过where关联更新 update student s, city c set s.province_name = c.province_name, s.city_nam ...

  7. Spring学习总结(六)——Spring整合MyBatis完整示例

    为了梳理前面学习的内容<Spring整合MyBatis(Maven+MySQL)一>与<Spring整合MyBatis(Maven+MySQL)二>,做一个完整的示例完成一个简 ...

  8. MySQL ibdata1文件迁移

    目的:主机系统/var目录快满了,经查询最大的文件是mysql的ibdata1文件,有17G大小,故需要迁移这个文件到其他目录下,以释放/var目录空间. 1.先备份下数据库是个好习惯 # mysql ...

  9. 推荐20款基于 jQuery & CSS 的文本效果插件

    jQuery 和 CSS 可以说是设计和开发行业的一次革命.这一切如此简单,快捷的一站式服务.jQuery 允许你在你的网页中添加一些真正令人惊叹的东西而不用付出很大的努力,要感谢那些优秀的 jQue ...

  10. 十款让 Web 前端开发人员更轻松的实用工具

    这篇文章介绍十款让 Web 前端开发人员生活更轻松的实用工具.每个 Web 开发人员都有自己的工具箱,这样工作中碰到的每个问题都有一个好的解决方案供选择. 对于每一项工作,开发人员需要特定的辅助工具, ...