2015-12-30 127 views
0

我想將文本文件寫入HDFS。 文件必須寫入HDFS的路徑是動態生成的。 如果文件路徑(包括文件名)是新的,則該文件應創建和文字應被寫入。 如果文件路徑(包括文件)已經存在,則字符串必須附加到現有文件。如何使用Scala使用Hadoop客戶端在HDFS中附加文本文件?

我用下面的代碼。文件創建工作正常。但不能將文本追加到現有文件。

def writeJson(uri: String, Json: JValue, time: Time): Unit = { 
    val path = new Path(generateFilePath(Json, time)) 
    val conf = new Configuration() 
    conf.set("fs.defaultFS", uri) 
    conf.set("dfs.replication", "1") 
    conf.set("dfs.support.append", "true") 
    conf.set("dfs.client.block.write.replace-datanode-on-failure.enable","false") 

    val Message = compact(render(Json))+"\n" 
    try{ 
     val fileSystem = FileSystem.get(conf) 
     if(fileSystem.exists(path).equals(true)){ 
     println("File exists.") 
     val outputStream = fileSystem.append(path) 
     val bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream)) 
     bufferedWriter.write(Message.toString) 
     bufferedWriter.close() 
     println("Appended to file in path : " + path) 
     } 
     else { 
     println("File does not exist.") 
     val outputStream = fileSystem.create(path, true) 
     val bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream)) 
     bufferedWriter.write(Message.toString) 
     bufferedWriter.close() 
     println("Created file in path : " + path) 
     } 
    }catch{ 
     case e:Exception=> 
     e.printStackTrace() 
    } 
    } 

的Hadoop版本:2.7.0

每當追加也要做,會生成以下錯誤:

org.apache.hadoop.ipc.RemoteException(java.lang中。 ArrayIndexOutOfBoundsException異常)

回答

1

我可以看到3種可能性:

  1. 最容易的方法是使用由您的Hadoop集羣上的hdfs提供的外部命令,請參閱: https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html。甚至WebHDFS REST功能:https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/WebHDFS.html
  2. 如果你不想使用HDFS commnads,那麼你可能會使用由hadoop-hdfshttp://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.7.1
  3. 使用星火,如果你想幹淨斯卡拉的解決方案,例如提供HDFS API http://spark.apache.org/docs/latest/programming-guide.htmlhttps://databricks.gitbooks.io/databricks-spark-reference-applications/content/logs_analyzer/chapter3/save_the_rdd_to_files.html
相關問題