Spark核心技术与高级应用
上QQ阅读APP看书,第一时间看更新

3.3 独立应用程序编程

不同于使用Spark Shell自动初始化SparkContext的例子,独立应用程序需要初始化一个SparkContext作为程序的一部分,然后将一个包含应用程序信息的SparkConf对象传递给SparkContext构造函数。

接下来编写简单应用程序SimpleApp,并描述一些简单的编码流程。

3.3.1 创建SparkContext对象

编写一个Spark程序,首先创建SparkConf对象,该对象包含应用的信息。SparkConf对象构建完毕,需要创建SparkContext对象,该对象可以访问Spark集群。

          // 创建SparkConf对象
          val conf = new SparkConf().setAppName("Simple Application")
          // 创建SparkContext对象
          val sc = new SparkContext(conf)

3.3.2 编写简单应用程序

一个常见的Hadoop数据流模式是MapReduce,Spark可以轻易地实现MapReduce数据流,我们通过Spark API创建一个简单的Spark应用程序SimpleApp.scala。

          import org.apache.spark.SparkContext
          import org.apache.spark.SparkContext._
          import org.apache.spark.SparkConf
          object SimpleApp {
          def main(args: Array[String]) {
          val logFile = "$YOUR_SPARK_HOME/README.md" //测试文件
          val conf = new SparkConf().setAppName("Simple Application")
          val sc = new SparkContext(conf)
          val logData = sc.textFile(logFile, 2).cache()
          val numAs = logData.filter(line =>line.contains("a")).count()
          val numBs = logData.filter(line =>line.contains("b")).count()
          println("Lines with a: %s, Lines with b: %s".format(numAs, numBs))
              }
          }

这个程序统计了Spark的README.md中含有“a”的行数和含有“b”的行数。实际需要用Spark的安装路径替换YOUR_SPARK_HOME。

3.3.3 编译并提交应用程序

可以采用IDEA生成Jar包的方式,也可以采取sbt或者mvn的方式打成Jar包。以sbt package为例,创建一个包含应用程序代码的Jar包。

一旦用户的应用程序被打包,就可以使用$SPARK_HOME./bin/spark-submit脚本启动应用程序。spark-submit脚本负责建立Spark的类路径和相关依赖,并支持不同的集群管理(Local、Standalone、YARN)和部署模式(Client、Cluster),通过提交参数进行区别。

1. 使用sbt打成Jar包

使用sbt打成Jar包过程如下:

            sbt package
            ...
            [info] Packaging {..}/{..}/target/scala-2.10/simple-project_2.10-1.0.jar

2. 应用程序提交模板

应用程序提交模板如下:

            ./bin/spark-submit \
                --class <main-class>\
                --master <master-url>\
                --deploy-mode <deploy-mode>\
                ... # other options
            <application-jar>\
            [application-arguments]

选项解释说明:

□--class:应用程序入口位置,如org.apache.spark.examples.SparkPi。

□--master:集群的master的URL,如spark://xxx.xxx.xxx.xxx:7077;或使用local在本地单线程地运行,或使用local[N]在本地以N个线程运行。通常应该由运行local进行测试开始。

□--deploy-mode:集群部署模式,Cluster模式和Client模式(默认模式)。

□ application-jar:包含应用程序和所有依赖的Jar包的路径。该URL必须是在集群中全局可见的,如一个hdfs://路径或者一个在所有Worker节点都出现的f ile://路径。

□ application-arguments:传递给主类的main函数的参数。

对于Python应用,在<application-jar>的位置传入一个.py文件代替一个Jar包,并且以-py-f iles的方式在搜索路径下加入Python.zip、.egg或.py文件。

注意

常见的部署策略是从同一物理位置,即同一个网关的服务器上提交应用程序。在这种设置中,采用Client模式比较合适。在Client模式中,Driver直接在用户的spark-submit进程中启动,应用程序的输入和输出连接到控制台(console)。因此,这个模式对于涉及REPL(Read-Eval-Print Loop,“读取-求值-输出”循环)的应用程序尤其合适。

另外,如果你的应用程序是从远离Worker机器的某台机器上提交的(如你的笔记本电脑上),一般要用Cluster模式,使Drivers和Executors之间的网络延迟最小化。(目前Standalone部署模式、Mesos集群模式和Python编写的应用不支持Cluster模式。)

传递给Spark的Master URL可以是如表3-1所示的某个格式。

表3-1 Spark的Master URL格式及说明

3.以Local模式提交应用程序

以Local模式在4个CPU核上运行应用程序,命令如下:

          $ YOUR_SPARK_HOME/bin/spark-submit \
              --class "SimpleApp" \
              --master local[4] \
              target/scala-2.10/simple-project_2.10-1.0.jar
          ...

4.以Standalone模式提交应用程序

以Standalone模式运行应用程序,命令如下:

          ./bin/spark-submit \
              --class "SimpleApp" \
              --master spark://*.*.*.*:7077 \
              --executor-memory 2G \
              --total-executor-cores 10 \
          target/scala-2.10/simple-project_2.10-1.0.jar

5.以YARN模式提交应用程序

以YARN模式运行应用程序,命令如下:

          ./bin/spark-submit \
              --class "SimpleApp" \
              --master yarn-cluster \ # 也可以是 'yarn-client' 模式
                --executor-memory 2G \
                --num-executors 10 \
            target/scala-2.10/simple-project_2.10-1.0.jar