web-dev-qa-db-fra.com

Écrivez un fichier en hdfs avec Java

Je veux créer un fichier dans HDFS et y écrire des données. J'ai utilisé ce code:

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

Il crée le fichier, mais n'y écrit rien. J'ai beaucoup cherché mais je n'ai rien trouvé. Quel est mon problème? Ai-je besoin d'une autorisation pour écrire en HDFS?

Merci.

50
user1878364

une alternative à la réponse de @ Tariq, vous pouvez transmettre l'URI lors de l'obtention du système de fichiers

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();
67
Miguel Pereira

Soit définir le HADOOP_CONF_DIR variable d’environnement dans votre dossier de configuration Hadoop ou ajoutez les 2 lignes suivantes dans votre code:

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

Si vous n’ajoutez pas cela, votre client essaiera d’écrire dans le système de fichiers local, ce qui entraînera une exception d’autorisation refusée.

22
Tariq