J'essaie d'utiliser map/reduce
pour traiter de grandes quantités de données binaires. L'application est caractérisée par ce qui suit: le nombre d'enregistrements est potentiellement important, de sorte que je ne veux pas vraiment stocker chaque enregistrement comme un fichier séparé dans HDFS
(j'avais prévu de les concaténer tous dans un seul fichier de séquence binaire), et chaque enregistrement est un grand blob cohérent (c'est-à-dire non divisible), d'une taille comprise entre une et plusieurs centaines de Mo. Les enregistrements seront consommés et traités par un exécutable C++. S'il n'y avait pas la taille des enregistrements, l'API Hadoop Pipes irait bien: mais cela semble être basé sur le fait de passer l'entrée pour mapper/réduire des tâches comme un bloc contigu d'octets, ce qui n'est pas pratique dans ce cas.Hadoop Pipes: comment transmettre des enregistrements de données volumineux pour mapper/réduire des tâches
Je ne suis pas sûr de la meilleure façon de le faire. Existe-t-il un type d'interface tamponnée qui permettrait à chaque tâche M/R d'extraire plusieurs blocs de données dans des blocs gérables? Sinon, je pense à transmettre des offsets de fichiers via l'API et à les diffuser dans les données brutes de HDFS côté C++.
Je voudrais avoir des opinions de quelqu'un qui a essayé quelque chose de similaire - je suis assez nouveau pour hadoop.
Merci. En ce qui concerne les lectures HDFS non locales, n'y a-t-il pas moyen de définir un format d'entrée personnalisé qui comprenne que les enregistrements sont en fait des pointeurs de fichiers dans HDFS contenant les données réelles et pouvant fournir les informations requises sur la localité de données? (Il me semble que le traitement des listes de noms de fichiers doit être un cas d'utilisation relativement courant - je suis surpris qu'il n'y ait pas de meilleur support pour cela ...) –
Je ne vois pas un moyen simple de le faire. Lorsque vous écrivez des fichiers HDFS, ils se retrouvent sur des nœuds un peu partout, il n'y a donc aucune garantie que tous les fichiers nommés dans une entrée se trouvent sur les mêmes nœuds de données. –
Merci beaucoup Spike - c'est une discussion très utile pour moi. Une dernière question rapide - Je comprends de ce qui précède que puisque toutes les données d'une division d'entrée va à un mappeur, c'est un problème de définir la localité de données si cette division contient plusieurs noms de fichiers dans HDFS. Mais que se passerait-il si chaque partition d'entrée était contrainte à contenir un seul nom de fichier? Ne pourriez-vous pas remplacer la définition par défaut de la localité de données pour que la division d'entrée soit celle du fichier auquel il est fait référence? Ou y a-t-il une raison pour laquelle ce serait une mauvaise idée? –