Spark 同步提交应用/多文件输出

一、Spark 怎么同步提交应用?

请问,spark 怎么同步提交应用?我知道可以sparksubmit,但怎么知道应用执行成功和失败?

解决

给楼主举个例子

spark 提交到yarn
在命令行输入如下命令:

./spark-submit  --class SparkSQLTest --master spark:hadoop1:7077 --executor-memory 2g --num-executors 3  /home/kaiseu/MyProject/IdeaProjects/SparkProject/Saprk131/out/artifacts/SparkSQLTest_jar/SparkSQLTest.jar

这里写图片描述

在web监控界面可以看到:

Spark 同步提交应用/多文件输出_第1张图片

  • 貌似可以通过sparklistener 监听到
  • SparkListener接口来监听任务执行期间的各种事件,可以实现一个Listener来监控任务执行进度以及收集任务级别的统计信息(目前任务级别的统计由SparkListener采集,任务进度则由Spark提供的专门的API来监控)
  • 这个似乎只是用来监控的。至于获取数据,应该可以从spark的输出文件中读取

二、Spark如何实现多文件输出

因为Spark内部写文件方式其实调用的都是Hadoop的函数,所以我们也可以通过Spark实现多文件输出。Spark内部没有多文件输出的函数供大家直接调用,我们自己实现这个功能也是很简单的。我们可以通过调用saveAsHadoopFile函数并自定义一个OutputFormat类即可,代码如下:

import org.apache.hadoop.io.NullWritable

import org.apache.spark._
import org.apache.spark.SparkContext._


import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat

class RDDMultipleTextOutputFormat extends MultipleTextOutputFormat[Any, Any] {
  override def generateFileNameForKeyValue(key: Any, value: Any, name: String): String =
    key.asInstanceOf[String]
}

object Split {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("SplitTest")
    val sc = new SparkContext(conf)
    sc.parallelize(List(("w", "www"), ("b", "blog"), ("c", "com"), ("w", "bt")))
      .map(value => (value._1, value._2 + "Test"))
      .partitionBy(new HashPartitioner(3))
      .saveAsHadoopFile("/iteblog", classOf[String], classOf[String],
        classOf[RDDMultipleTextOutputFormat])
    sc.stop()
  }
}

RDDMultipleTextOutputFormat类中的generateFileNameForKeyValue函数有三个参数,key和value就是我们RDD的Key和Value,而name参数是每个Reduce的编号。本例中没有使用该参数,而是直接将同一个Key的数据输出到同一个文件中。执行:

bin/spark-submit --master yarn-cluster
--class Split ./a-1.0-SNAPSHOT.jar

然后我们可以看到在HDFS上输出的文件列表如下

bin/hadoop fs -ls /a

https://github.com/apache/spark/pull/4895,很有可能会在Spark 1.4.0版本添加。

你可能感兴趣的:(Spark 同步提交应用/多文件输出)