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:
J'ai utilisé la classe Configuration() dans mon code, donc je pense j'aurais besoin au dependences hadoop lors de l'éxecution.error: package org.apache.hadoop.hdfs.web.WebHdfsFileSystem does not exist
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:
Dans la deuxième solution, je ne sais pas comment je peux intégrer mes deux fonctions dans le client webHDFS.
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(); } }
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.
Partager