問題描述
在IDEA中新建maven工程運行基本的spark程序如下:
// 創建一個Scala版本的Spark Context
val conf = new SparkConf().setAppName("wordCount").setMaster("local")
val sc = new SparkContext(conf)
// 讀取我們的輸入數據
val input = sc.textFile(logFile)
// 把它切分成一個個單詞
val words = input.flatMap(line => line.split(" "))
// 轉換爲鍵值對並計數
val counts = words.map(word => (word, 1)).reduceByKey{case (x, y) => x + y}
// 將統計出來的單詞總數存入一個文本文件,引發求值
println(counts.collect().mkString(","))
結果報錯如下:
Exception in thread "main" java.lang.RuntimeException: java.io.IOException: No FileSystem for scheme: file
at org.apache.hadoop.mapred.JobConf.getWorkingDirectory(JobConf.java:658)
at org.apache.hadoop.mapred.FileInputFormat.setInputPaths(FileInputFormat.java:436)
at org.apache.hadoop.mapred.FileInputFormat.setInputPaths(FileInputFormat.java:409)
at org.apache.spark.SparkContext$$anonfun$hadoopFile$1$$anonfun$33.apply(SparkContext.scala:1015)
at org.apache.spark.SparkContext$$anonfun$hadoopFile$1$$anonfun$33.apply(SparkContext.scala:1015)
at org.apache.spark.rdd.HadoopRDD$$anonfun$getJobConf$6.apply(HadoopRDD.scala:176)
at org.apache.spark.rdd.HadoopRDD$$anonfun$getJobConf$6.apply(HadoopRDD.scala:176)
at scala.Option.map(Option.scala:145)
......
解決方案(加入了三句話):
// 創建一個Scala版本的Spark Context
val conf = new SparkConf().setAppName("wordCount").setMaster("local")
val sc = new SparkContext(conf)
val h_conf = sc.hadoopConfiguration
h_conf.set("fs.hdfs.impl", classOf[org.apache.hadoop.hdfs.DistributedFileSystem].getName)
h_conf.set("fs.file.impl", classOf[org.apache.hadoop.fs.LocalFileSystem].getName)
// 讀取我們的輸入數據
val input = sc.textFile(logFile)
// 把它切分成一個個單詞
val words = input.flatMap(line => line.split(" "))
// 轉換爲鍵值對並計數
val counts = words.map(word => (word, 1)).reduceByKey{case (x, y) => x + y}
// 將統計出來的單詞總數存入一個文本文件,引發求值
println(counts.collect().mkString(","))
報錯原因:
在hadoop-commons和hadoop-hdfs兩個jar文件中在META-INFO/services下包含相同的文件名org.apache.hadoop.fs.FileSystem,而我們使用maven-assembly-plugin時,最終只有一個文件被保留,所以被重寫的那個文件系統就無法找到。