求大神解答,或者我们来讨论下!今天碰到一个很奇怪的问题,关于spark-submit 三种运行模式:
(1)本地local模式
(2)在Hadoop YARN-client模式
(3)Standalone Cluster模式
1 问题描述
首先说明一下我的集群,一个master节点和两个slave节点,slave1和slave2。
我一直在master节点上练习spark-submit三种模式。运行的列子就是统计单词的个数。
首先我运行的spark-submit的local模式,可以成功,并且成功的写入了Linux下制定的输出目录,然后在Hadoop YARN-client模式下运行,成功的写入了HDFS目录下,最后在Stand alone Cluster模式下也成功运行,但是问题来了,我再次在master节点上运行本地模式,输出的结果写到了HDFS下,我明明制定了本地运行模式,而且代码里写的输出路径为Linux路径,不是HDFS路径,为什么没有写入Linux目录下呢?
此时,我在slave1节点和slave2节点运行本地模式,都成功的写进了Linux目录下,并没有写入HDFS目录下。
我再次运行本地模式,说目录已存在,但是Linux目录下没有,我就把HDFS下的目录删掉,然后运行。
说明:Linux目录和HDFS目录名一样,开始写代码的时候没注意,发现最后一模一样,这样不知道到底写到了哪里,应该注意的。
然后查看Linux目录下是否有输出文件,发现没有。然后我在HDFS目录下查看,确实输出到了HDFS目录下。
下面是slave1节点运行本地模式信息
可以看出slave1成功运行本地模式,并输出到制定Linux目录
下面是slave2运行本地模式信息
可以看出slave2成功运行本地模式,并输出到制定Linux目录 。
2运行代码
object RunWordCount {
def main(args: Array[String]): Unit = {
Logger.getLogger("org").setLevel(Level.OFF)
System.setProperty("spark.ui.showConsoleProgress","false")
println("开始运行RunWordCount")
val sc = new SparkContext(new SparkConf().setAppName("wordCount").setMaster("local[4]"))
println("开始读取文本文件")
val textFile = sc.textFile("/root/test/LICENSE.txt")
println("开始创建RDD....")
val countsRDD = textFile.flatMap(line => line.split(" ")).map(word => (word,1)).reduceByKey(_+_)
println(countsRDD)
println("开始保存到文本文件")
try{
countsRDD.saveAsTextFile("/root/test/output2")
println("已经存盘成功")
}catch {
case e:Exception => println("输出目录已经存在,请先删除原有目录")
}
}
}