2013-04-14 16 views
43

Chcę utworzyć plik w HDFS i zapisać w nim dane. Użyłem tego kodu:Napisz plik w formacie hdf z Javą

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(); 
} 

Tworzy plik, ale nic w nim nie pisze. Szukałem dużo, ale nic nie znalazłem. Jaki jest mój problem? Czy potrzebuję pozwolenia na pisanie w HDFS?

Dzięki.

+0

Kod ten tworzy plik 'HDFS' z jednej partycji, możemy ustawić liczbę partycji dla input.txt? – vdep

Odpowiedz

-2

Proszę spróbować poniższego podejścia.

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

użytkownik chce tylko napisać plik, a nie konkretnie plik sekwencji. – Tariq

+0

Czy załączyłeś odcinki konfiguracji zadań? – Uselesssss

15

Albo zdefiniować zmienną środowiskową HADOOP_CONF_DIR do folderu konfiguracyjnego Hadoop lub dodać następujące 2 linie w kodzie:

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

Jeśli nie dodawać tego, klient będzie próbował pisać lokalny FS, co skutkuje wyjątkiem odmowy uprawnień.

57

alternatywą @ asnwer Tariqa można przekazać URI, gdy uzyskanie plików

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

Jak uzyskać zmienną "bytesWritten"? –

+0

Spróbuj przejrzeć dokumenty OutputStream? ex: https://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html –

+1

przydatne będą instrukcje importu ... Gdzie jest Konfiguracja w szczególności? –