L'utilisation d'Hadoop pour trouver les fichiers qui contiennent une chaîne de caractères
Que j'ai autour de 1000 files
et chaque fichier est de la taille de 1GB
. Et j'ai besoin de trouver une Chaîne de caractères dans tous ces 1000 files
et aussi les fichiers contenant la Chaîne de caractères particulière. Je suis en train de travailler avec Hadoop Système de Fichiers et tous ceux 1000 files
sont dans Hadoop Système de Fichiers.
Tous les 1000 files
sont sous dossier, donc Si je fais comme ci-dessous, je seront obtenir tous les 1000 files
. Et j'ai besoin de trouver les fichiers qui contient une Chaîne de caractères bonjour en vertu de dossier.
bash-3.00$ hadoop fs -ls /technology/dps/real
Et c'est ma structure de données dans hdfs-
row format delimited
fields terminated by ''
collection items terminated by ','
map keys terminated by ':'
stored as textfile
Comment je peux écrire de tâches MapReduce pour faire de ce problème afin que je puisse trouver les fichiers qui contient une chaîne de caractères? Un simple exemple sera d'une grande aide pour moi.
Mise à jour:-
Avec l'utilisation de grep dans Unix je peux résoudre le problème ci-dessus scénario, mais il est très très lent et il faut beaucoup de temps pour obtenir le résultat réel-
hadoop fs -ls /technology/dps/real | awk '{print $8}' | while read f; do hadoop fs -cat $f | grep cec7051a1380a47a4497a107fecb84c1 >/dev/null && echo $f; done
De sorte que c'est la raison pour laquelle je cherchais des tâches MapReduce pour faire ce genre de problème...
Je pense que l'OP signifie que la recherche dans le contenu du fichier. Sinon il n'aurait pas mentionner la taille du fichier.
J'ai besoin de trouver la chaîne à l'intérieur de tous ces 1000 fichiers de contenu. Et les fichiers contenant la Chaîne de caractères est mon objectif.
double possible de Rechercher une Chaîne de caractères dans 1000 fichiers et chaque taille du fichier est de 1 GO
Dans cette question, je suis juste essayer de trouver Unix alternative à faire de cette façon, pas le travail de MapReduce et puis quelqu'un m'a suggéré de vous permettre de mieux dans le travail de MapReduce, de sorte que c'est la raison que j'ai posté une nouvelle question.
OriginalL'auteur arsenal | 2012-07-31
Vous devez vous connecter pour publier un commentaire.
Il semble que vous êtes à la recherche pour un grep-comme programme, qui est facile à mettre en œuvre à l'aide de Hadoop Streaming (Hadoop API Java serait trop de travail):
Tout d'abord, écrire un mappeur qui affiche le nom du fichier à traiter, si la ligne en cours de traitement contient votre chaîne de recherche. J'ai utilisé Python, mais toute langue de travail:
Ce code lit la chaîne de recherche à partir de la
SEARCH_STRING
variable d'environnement. Ici, j'ai divisé l'entrée de la ligne et de vérifier si la chaîne de recherche correspond à l'une des fissures; vous pouvez changer cette option pour effectuer une sous-chaîne de recherche ou utiliser des expressions régulières pour vérifier les correspondances.Ensuite, exécutez un Hadoop streaming de travail à l'aide de cette mappeur et pas de réducteurs:
La sortie sera écrit en plusieurs parties; pour obtenir une liste des correspondances, vous pouvez simplement chat les fichiers (à condition qu'elles ne sont pas trop gros):
Je suis en utilisant Hadoop Streaming API, ce qui me permet d'écrire les cartographes et les réducteurs à l'aide de scripts shell ou d'autres utilitaires. Dans ma réponse, le programme Python agit en tant que mappeur. Si vous êtes nouveau à MapReduce, Google Code, l'Université a une belle vue d'ensemble le modèle MapReduce , et la Hadoop MapReduce Tutoriel qui explique comment écrire des programmes MapReduce dans Hadoop.
Ainsi, le programme Python que vous avez écrit, c'est un Mappeur? Et je peux exécuter l'exemple que vous avez donné à moi directement sur le cluster hadoop.. droit? Et aussi ce qui ne
-input
signifie ici, elle signifie que le dossier dans lequel toutes les 1000 fichiers?Il fonctionne avec n'importe quel type de format de fichier ?
OriginalL'auteur Josh Rosen
Pour obtenir le nom de fichier que vous êtes en cours de traitement, n':
Lorsque vous êtes à la recherche de votre fichier d'enregistrement par enregistrement, lorsque vous voyez
hello
, émettent au-dessus de la trajectoire (et peut-être la ligne ou quoi que ce soit d'autre).Définir le nombre de réducteurs à 0, ils ne font rien ici.
N'ligne format délimité par des " signifie que les lignes sont séparées par un saut de ligne? auquel cas
TextInputFormat
etLineRecordReader
fonctionnent très bien ici.Pouvez-vous me donner quelques exemple d'échantillon de base sur mon scénario afin que je puisse comprendre plus. Il sera d'une grande aide pour moi dans la compréhension de la coutume de Mapper et de Réduire la chose.
OriginalL'auteur Donald Miner
Vous pouvez essayer quelque chose comme cela, si je ne suis pas sûr si c'est un moyen efficace d'aller à ce sujet. Laissez-moi savoir si ça fonctionne, je n'ai pas testé ou quoi que ce soit.
Vous pouvez l'utiliser comme ceci: java SearchFiles /technologie/dps/real bonjour de s'assurer que vous exécutez à partir du répertoire de cours.
Tiens... je suis à jour un peu.
Cette réponse ne fonctionnera pas avec Hadoop. C'est en supposant que les fichiers locaux, pas de fichiers HDFS. De Plus il prendrait une éternité.
Je viens de voir votre modification de ce paramètre chose.
Je n'ai jamais travaillé avec Hadoop avant, figuré Java serait de travailler vu que c'est tous de la croix-plate-forme, etc. Aucune idée de comment je pourrais faire autrement, mais il prendrait des lustres oui. Aussi pas plus vite que grep... jamais.
OriginalL'auteur rtheunissen