Découverte de Hadoop REST API – WebHDFS
Introduction
Si vous pratiquez un peu hadoop, vous n’êtes pas sans ignorer l’existence de l’API native Java « hadoop fs » prenant en charge les opérations sur système de fichiers telles que la création, le renommage ou la suppression de fichiers des répertoires, mais aussi la lecture ou l’écrire des fichiers. Cela est idéal pour les applications s'exécutant dans le cluster Hadoop, mais il peut y avoir des cas où une application externe, web par exemple, peut avoir besoin de manipuler HDFS. Ainsi, Hortonworks est à l’origine du développement d’une API supplémentaire prenant en charge ces exigences basé sur des fonctionnalités standards du protocole REST (REpresentational State Transfer). Ce protocole REST est un « style » architectural ainsi qu’un mode de communication utilisé dans le développement de services Web. A noter que le recours à REST est souvent privilégié par rapport au SOAP, plus lourd. En effet, REST est moins consommateur en bande passante, ce qui rend son utilisation plus pratique sur Internet.Hadoop, plusieurs chemin pour atteindre ses données sur HDFS
Tous les chemins mènent à Rome, mais pour HDFS pas d'expression proverbiale latine mais plusieurs outils accessible pour vous mener aux données stockées sur HDFS.- FileSystem (FS) shell commands
- WebHDFS
- HttpFS
Hadoop WebHDFS REST API
WebHDFS est basé sur les commandes HTTP classiques GET, PUT, POST et DELETE. Ainsi les opérations OPEN, GETFILESTATUS, LISTSTATUS s’appuient le HTTP GET, les opérations comme par exemple CREATE, MKDIRS, RENAME, SETPERMISSIONS sont relayées via du HTTP PUT. Enfin, les APPEND passent par du HTTP POST, tandis que le DELETE utilise, en toute logique, HTTP DELETE. Pour la partie autorisation, l’utilisateur est passé à hadoop par l’intermédiaire d’un paramètre user.name, élément par entière de la requête http (dans « l’url » donc) ou lié directement à Kerberos le cas échéant De façon simple, voici à quoi ressemble le format d’une URL utilisant WebHDFS REST API : Si vous avez commencé à pratiquer, vous avez sans doute constaté que, dans certains cas l’exécution d’une commande, le namenode retourne une URL à l'aide du mécanisme de redirection temporaire HTTP 307 en précisant une URL de localisation faisant référence au datanode approprié. Ensuite, et dans ce cas, vous devez suivre cette URL pour exécuter les opérations de fichier sur ce datanode particulier. J’en reparlerai plus-tard, pas de panique. Une dernière chose, vérifiez bien votre configuration (hdfs-site.xml) pour vous assurer que WebHDFS est actif (dfs.webhdfs.enabled)Quelques exemples
Maintenant que la théorie est comprise, du moins je l’espère, passons à la pratique. Je vous propose donc quelques exemples pour vous familiariser avec le fonctionnement de l’Api. Avant de vous lancer corps et âme dans l’aventure, je vous invite à jeter un coup d’œil à la commande système « curl » utilisée dans nos exemples.- Vérifier le statut d’un répertoire WebHDFS
1 |
curl -i http://172.28.203.244:50070/webhdfs/v1/tmp?user.name=hive&op=GETFILESTATUS">http://172.28.203.244:50070/webhdfs/v1/tmp?user.name=hive&op=GETFILESTATUS |
1 |
{"FileStatus":{"accessTime":0,"blockSize":0,"childrenNum":11,"fileId":16386,"group":"hdfs","length":0,"modificationTime":1484578587086,"owner":"hdfs","pathSuffix":"","permission":"777","replication":0,"storagePolicy":0,"type":"DIRECTORY"}} |
1 2 3 4 5 |
{"RemoteException":{ "exception":"FileNotFoundException", "javaClassName":"java.io.FileNotFoundException", "message":"File does not exist: /missing_dir" }} |
1 |
hadoop fs -ls /tmp |
- Création d’un répertoire
1 |
curl -i -X PUT http://172.28.203.244:50070/webhdfs/v1/tmp/testwebhdfs?user.name=hive&op=MKDIRS">http://172.28.203.244:50070/webhdfs/v1/tmp/testwebhdfs?user.name=hive&op=MKDIRS |
1 |
{"boolean":true} |
1 2 3 4 |
{"RemoteException":{ "exception":"AccessControlException", "javaClassName":"org.apache.hadoop.security.AccessControlException", "message":"Permission denied: user=hive, access=WRITE, inode=\"/\":hdfs:hdfs:drwxr-xr-x"}} |
- Création d’un fichier
1 |
curl -i -X PUT "http://172.28.203.244:50070/webhdfs/v1/tmp/webhdfs/fichier-test.txt?user.name=hive&op=CREATE" |
1 |
curl -i -T fichier-test.txt http://172.28.203.244:50075/webhdfs/v1/tmp/webhdfs/fichier-testA.txt?op=CREATE&user.name=hive&namenoderpcaddress=sandbox.hortonworks.com:8020&overwrite=false">http://172.28.203.244:50075/webhdfs/v1/tmp/webhdfs/fichier-testA.txt?op=CREATE&user.name=hive&namenoderpcaddress=sandbox.hortonworks.com:8020&overwrite=false |