web-dev-qa-db-fra.com

Écrire des données sur Hadoop

Je dois écrire des données dans Hadoop (HDFS) à partir de sources externes, comme une boîte de dialogue Windows. À l'heure actuelle, j'ai copié les données sur le nom de code et utilisé la commande put de HDFS pour les intégrer au cluster. Lors de ma navigation dans le code, je n'ai pas vu d'API pour cela. J'espère que quelqu'un pourra me montrer que je me trompe et qu'il existe un moyen simple de coder des clients externes contre HDFS.

18
Steve Severance

Installez Cygwin, installez Hadoop localement (vous avez juste besoin du binaire et des configurations qui pointent sur votre NN - pas besoin d'exécuter les services), lancez hadoop fs -copyFromLocal /path/to/localfile /hdfs/path/

Vous pouvez également utiliser le nouveau bureau Cloudera pour télécharger un fichier via l'interface utilisateur Web, bien que cela puisse ne pas être une bonne option pour les fichiers géants.

Il existe également une superposition WebDAV pour HDFS, mais je ne sais pas dans quelle mesure il est stable/fiable.

11
SquareCog

Il y a une API en Java. Vous pouvez l'utiliser en incluant le code Hadoop dans votre projet. Le JavaDoc est très utile en général, mais vous devez bien sûr savoir ce que vous recherchez * g * http : //hadoop.Apache.org/common/docs/

Pour votre problème particulier, consultez: http://hadoop.Apache.org/common/docs/current/api/org/Apache/hadoop/fs/FileSystem.html (Ceci s'applique à la dernière version, consultez d'autres JavaDocs pour différentes versions!)

Un appel typique serait: Filesystem.get(new JobConf()).create(new Path("however.file")); Qui vous renvoie un flux que vous pouvez gérer avec JavaIO normal.

17
Peter Wippermann

Pour le problème de chargement des données que je devais mettre dans HDFS, j'ai choisi de résoudre le problème. 

Au lieu de télécharger les fichiers sur HDFS à partir du serveur où ils résidaient, j’ai écrit un travail Java Map/Reduce dans lequel le mappeur lisait le fichier sur le serveur de fichiers (dans ce cas via https), puis l’écrivait directement sur HDFS (via le API Java ).

La liste des fichiers est lue depuis l'entrée. J'ai ensuite un script externe qui remplit un fichier avec la liste des fichiers à récupérer, télécharge le fichier dans HDFS (à l'aide de hadoop dfs -put ), puis lance le travail de mappage/réduction avec un nombre correct de mappeurs .

Cela me donne d'excellentes performances de transfert, car plusieurs fichiers sont lus/écrits en même temps.

Peut-être pas la réponse que vous cherchiez, mais j'espère utile quand même :-).

13
Erik Forsberg

Environ deux ans après ma dernière réponse, il existe maintenant deux nouvelles alternatives: Hoop/HttpFS et WebHDFS. 

En ce qui concerne Hoop, il a été annoncé pour la première fois dans le blog de Cloudera et peut être téléchargé à partir du répertoire github . J'ai réussi à faire en sorte que cette version parle avec succès à au moins Hadoop 0.20.1, elle peut probablement aussi parler à des versions légèrement plus anciennes.

Si vous utilisez Hadoop 0.23.1 qui, au moment de l'écriture, n'était toujours pas publié, Hoop fait partie de Hadoop en tant que composant propre, HttpFS. Ce travail a été effectué dans le cadre de HDFS-2178 . Hoop/HttpFS peut être un proxy non seulement pour HDFS, mais également pour d'autres systèmes de fichiers compatibles Hadoop, tels qu'Amazon S3.

Hoop/HttpFS s'exécute en tant que son propre service autonome.

Il y a aussi WebHDFS qui est exécuté dans le cadre des services NameNode et DataNode. Il fournit également une API REST qui, si je comprends bien, est compatible avec l'API HttpFS. WebHDFS fait partie de Hadoop 1.0 et l’une de ses principales fonctionnalités est de fournir une localisation des données. Lorsque vous faites une demande de lecture, vous serez redirigé vers le composant WebHDFS sur le code de données où se trouvent les données.

Le composant à choisir dépend un peu de votre configuration actuelle et de vos besoins. Si vous avez besoin d'une interface HTTP REST vers HDFS maintenant et que vous utilisez une version n'incluant pas WebHDFS, commencer par Hoop à partir du référentiel github semble être l'option la plus simple. Si vous utilisez une version qui inclut WebHDFS, je choisirais cette solution à moins que vous n'ayez besoin de certaines des fonctionnalités de Hoop qui manquent à WebHDFS (accès à d'autres systèmes de fichiers, limitation de la bande passante, etc.).

12
Erik Forsberg

Il semble qu’il existe à présent une page dédiée sur http://wiki.Apache.org/hadoop/MountableHDFS :

Ces projets (énumérés ci-dessous) permettent à HDFS d'être monté (sur la plupart des Versions d'Unix) en tant que système de fichiers standard à l'aide de la commande mount. Une fois monté, l'utilisateur peut utiliser une instance de hdfs. en utilisant des utilitaires Unix standard tels que 'ls', 'cd', 'cp', 'mkdir', 'find', 'grep' ou des librairies standards Posix telles que open, write, lire, fermer à partir de C, C++, Python, Ruby, Perl, Java, Bash, etc.

Plus tard, il décrit ces projets 

  • contrib/Fuse-dfs est construit sur Fuse, de la colle C, libhdfs et le hadoop-dev.jar 
  • Fuse-j-hdfs est construit sur Fuse, Fuse pour Java et le hadoop-dev.jar 
  • hdfs-Fuse - un projet de code Google est très similaire à contrib/Fuse-dfs 
  • webdav - hdfs exposé en tant que ressource webdav mapR - contient un système de fichiers compatible hdfs source fermé prenant en charge l'accès en lecture/écriture NFS 
  • HDFS NFS Proxy - exporte HDFS en tant que NFS sans utiliser Fuse. Prend en charge Kerberos et réordonne les écritures afin qu'elles soient écrites séquentiellement sur hdfs .

Je n’ai essayé aucune de ces solutions, mais je mettrai à jour la réponse car j’ai le même besoin que le PO.

3
Eran Medan

Vous pouvez maintenant aussi utiliser Talend, qui inclut des composants pour l'intégration Hadoop.

0
Guillaume

Vous pouvez également utiliser HadoopDrive ( http://hadoopdrive.effisoft.eu ). C'est une extension Windows Shell.

0
zuko