一、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监控界面可以看到:
- 貌似可以通过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版本添加。