java.io.IOException: No FileSystem for scheme: file spark hadoop

問題描述

在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時,最終只有一個文件被保留,所以被重寫的那個文件系統就無法找到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章