Bonjour,

Je voudrais créer un client webHDFS qui se base uniquement sur les APIs HDFS et zéro dependences sur Hadoop.
Le but de ce client est de l'utiliser pour lister les fichiers dans HDFS et les ouvrir. J'ai fait deux solutions.
La première est j'ai crée un client webHDFS mais j'ai eu une erreur:

error: package org.apache.hadoop.hdfs.web.WebHdfsFileSystem does not exist
J'ai utilisé la classe Configuration() dans mon code, donc je pense j'aurais besoin au dependences hadoop lors de l'éxecution.
Mon code de ma première solution est le suivant:

Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.web.WebHdfsFileSystem;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class HdfsWebClient implements AutoCloseable
{
    /*public static void main(String args [])
    {
        System.out.print("main for testing the Hdfs WEB API");
        
    }*/
 
 
    private static final Logger logger = LoggerFactory.getLogger(HdfsWebClient.class);
 
    private WebHdfsFileSystem hdfs;
 
    public HdfsWebClient(String nameNodeHosts, String user)
    {
        final String baseUrl_1 = nameNodeHosts.split(",")[0]; // to be inserted in the path +"webhdfs/v1";
        final String baseUrl_2 = nameNodeHosts.split(",")[1]; // to be inserted in the path +"webhdfs/v1";
        Configuration conf = new Configuration();
 
        /* A WebHDFS FileSystem URI has the following format
        webhdfs://<HOST>:<HTTP_PORT>/<PATH>*/
 
        conf.set("fs.AbstractFileSystem.webhdfs.impl","webhdfs://"+baseUrl_1+":8443");
        conf.set("fs.AbstractFileSystem.webhdfs.impl","webhdfs://"+baseUrl_2+":8443");
        conf.set("dfs.namenode.http-address.hadoopcluster.namenode1",baseUrl_2+":50070");
        conf.set("dfs.namenode.http-address.hadoopcluster.namenode2",baseUrl_1+":50070");
        conf.set("dfs.webhdfs.enabled","true");
          try 
        {           
            hdfs = (WebHdfsFileSystem) FileSystem.get(new URI((String)conf.get("fs.AbstractFileSystem.webhdfs.impl")),conf, user);
 
 
            logger.debug("Filesystem URI : " + hdfs.getUri());
            logger.debug("Filesystem Home Directory : " + hdfs.getHomeDirectory());
            logger.debug("Filesystem Working Directory : " + hdfs.getWorkingDirectory());
            logger.info("HDFS FileSystem is '{}' ", hdfs);
 
        } 
        catch (Exception e) 
        {
            logger.error("Exception :", e);
        }       
 
    }   
 
 
        @Override
    public void close() throws Exception 
    {
        if(hdfs!=null)
            hdfs.close();
    }
 
}

Deuxième solution:
Puisque cette solution, ça n'a pas réussi, j'ai fait une deuxième solution, j'ai utilisé HttpURLConnection. J'ai crée une fonction qui ouvre un fichier dans HDFS. Je l'ai testé ça fonctionne, je suis en train de faire une deuxième fonction pour lister les fichiers dans HDFS. Je suis un peu bloquée je n'ai pas encore trouver une solution pour lister les fichiers.


Mon code pour ouvrir un fichier dans HDFS est le suivant:

Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 System.out.print("main for testing the Hdfs WEB API");
        URL url = new URL("http://URI/webhdfs/v1/PATH_TO_File?op=OPEN");
 
        try {
                HttpURLConnection con = (HttpURLConnection) url.openConnection() ;
                con.setRequestMethod("GET");
                con.setDoInput(true);
                InputStream in = con.getInputStream();
                int ch;
                while((ch=in.read())!=-1)
                {
                    System.out.print((char) ch);
                }
 
            } catch (IOException e) {
 
                e.printStackTrace();
            }
    }

La fonction pour lister les fichiers dans HDFS est la suivante:

Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   System.out.print("main for testing the Hdfs WEB API");
            URL url = new URL("http://URI/webhdfs/v1/PATH_TO_File?op=LISTSTATUS");
 
            try {
                    HttpURLConnection con = (HttpURLConnection) url.openConnection() ;
                    con.setRequestMethod("GET");
                    con.setDoInput(true);
                    InputStream in = con.getInputStream();
 
                    logger.info("list is '{}' ", url.openStream());
 
                } catch (IOException e) {
 
                    e.printStackTrace();
                }
        }
Dans la deuxième solution, je ne sais pas comment je peux intégrer mes deux fonctions dans le client webHDFS.

Pourriez-vous s'il vous plait m'aider afin de créer un client webHDFS qui se base uniquement sur les APIs HDFS et zéro dependences sur Hadoop soit avec ma première solution soit avec ma deuxième solution ? Je vous remercie d'avance.