2013-04-14 76 views
43

我想在HDFS中創建一個文件並在其中寫入數據。我用這個代碼:使用Java編寫hdfs文件

Configuration config = new Configuration();  
FileSystem fs = FileSystem.get(config); 
Path filenamePath = new Path("input.txt"); 
try { 
    if (fs.exists(filenamePath)) { 
     fs.delete(filenamePath, true); 
    } 

    FSDataOutputStream fin = fs.create(filenamePath); 
    fin.writeUTF("hello"); 
    fin.close(); 
} 

它創建文件,但它沒有寫任何東西。我搜查了很多,但 沒有找到任何東西。我的問題是什麼?我需要在HDFS中寫入任何權限嗎?

謝謝。

+0

這段代碼創建一個分區了'HDFS'文件時,你可以通過URI,我們可以設置爲input.txt中分區的數量? – vdep

回答

-2

請嘗試下面的方法。

FileSystem fs = path.getFileSystem(conf); 
SequenceFile.Writer inputWriter = new SequenceFile.Writer(fs, conf, path, LongWritable.class, MyWritable.class); 
inputWriter.append(new LongWritable(uniqueId++), new MyWritable(data)); 
inputWriter.close(); 
+0

用戶只是想寫一個文件,而不是專門的序列文件。 – Tariq

+0

您是否包含作業配置存根? – Uselesssss

15

要麼定義HADOOP_CONF_DIR環境變量設置爲Hadoop配置文件夾或者在你的代碼中添加以下兩行:

config.addResource(new Path("/HADOOP_HOME/conf/core-site.xml")); 
config.addResource(new Path("/HADOOP_HOME/conf/hdfs-site.xml")); 

如果不加這個,你的客戶會嘗試寫入本地FS,因此導致許可被拒絕異常。

57

替代@塔裏克的asnwer獲取文件系統

Configuration configuration = new Configuration(); 
FileSystem hdfs = FileSystem.get(new URI("hdfs://localhost:54310"), configuration); 
Path file = new Path("hdfs://localhost:54310/s2013/batch/table.html"); 
if (hdfs.exists(file)) { hdfs.delete(file, true); } 
OutputStream os = hdfs.create(file, 
    new Progressable() { 
     public void progress() { 
      out.println("...bytes written: [ "+bytesWritten+" ]"); 
     } }); 
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); 
br.write("Hello World"); 
br.close(); 
hdfs.close(); 
+3

如何獲得變量'bytesWritten'? –

+0

嘗試查看OutputStream文檔?例如:https://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html –

+1

import語句會有幫助...特別是來自哪裏的配置? –