2014-05-20 3 views
5

Je souhaite copier le fichier test.tar.gz de S3 vers HDFS. Cela peut être fait par distcp ou s3distcp. Mais mon exigence est quand je transfère des fichiers à HDFS, il devrait être extrait à la volée et dans HDFS je devrais avoir seulement les fichiers extraits pas tar.gz.Copier et extraire des fichiers de s3 vers HDFS

Toutes les suggestions s'il vous plaît.

Répondre

0

Quel est le problème d'utilisation d'un script bash? Je veux dire:

s3distcp --src [file-location] --dst . #Without the hdfs prefix 
tar -zxvf test.tar.gz 
hadoop fs -mkdir /input 
hadoop fs -mkdir /input/test 
hadoop fs -copyFromLocal test/ /input/test 
+0

C'est une bonne option. Mais je ne devrais utiliser aucun système de fichiers local pour placer le fichier tar.gz. C'est comme le fichier tar.gz dans S3 et la structure du répertoire extrait avec des fichiers seulement, dans HDFS. – Ilango

+1

oui et n'est pas non plus modifiable – mtariq

2

Lorsque vous effectuez un transfert par réseau, il est généralement préférable que les fichiers restent compressés. Imaginez que vous transférez 100 Go au lieu de transférer un fichier compressé bz2 de 20 Go. Je vous suggère d'utiliser un code basé sur API Hadoop ou un programme MapReduce pour extraire vos fichiers compressés une fois le transfert effectué vers HDFS. Une fois dans HDFS, vous avez tout le pouvoir d'extraire les fichiers sans les copier sur le système de fichiers local.

  1. Une solution serait d'utiliser un simple code Hadoop API based ou un MapReduce code (updated) qui décompresse en parallèle.

    Addendum: Pour ZIP, vous pouvez suivre this link. Et, vous pouvez trouver quelque chose de similaire pour tar.gz.

  2. vous pouvez probablement utiliser un Hadoop API based program qui se lit dans le cas où vous la taille du fichier est énorme 100GB.zip, un flux de l'archive Zip, extraits (check this link pour la façon dont il a été fait dans le ZipFileRecordReader dans l'additif ci-dessus), puis l'écrire retour à HDFS. Je pense qu'un seul fichier ZIP n'est pas séparable et extractible en parallèle (si je ne me trompe pas). Donc, si vous avez une seule archive zip de 100 Go, vous ne pourrez probablement pas libérer le plein potentiel d'un programme MapReduce. Par conséquent, ne pointez pas l'utiliser.

  3. Une autre solution est de ne pas décompresser du tout. Pour divers formats compressés intégrés, Hadoop dispose d'un utilitaire de ligne de commande qui vous permet d'afficher les fichiers compressés tels quels si vous avez l'intention de les conserver non compressés dans HDFS.

    Hadoop fs -text /path/fileinHDFS.bz2"

+0

Impossible d'accéder au code MapReduce. Les formats de compression ne fonctionnent pas avec les fichiers tar ou zip. La décompression sur HDFS est excellente, mais pouvez-vous partager du code pour tar/zip. (il y avait une méthode unTar mais ne semble pas fonctionner sur HDFS) – mtariq

+0

J'ai ajouté un addendum ci-dessus. Vérifiez s'il vous plaît. –

+0

Pas utile, comme mon cas ses 100 de GB zip (extrait à 600GB) donc besoin d'un moyen possible de décompresser dans HDFS (comme le téléchargement de fichiers avec distcp à HDFS) – mtariq

0

Vous devriez être en mesure d'y parvenir avec une tuyauterie intelligente ...

Quelque chose comme ça (totalement non testé):

s3cmd get [s3 path] - | tar -zxfO | hadoop dfs -put - [hadoop path] 

s3cmd get [s3 path] - obtient le fichier de S3 et tuyaux à stdout (-). tar -zxfO obtient le contenu du fichier piped de stdin et l'extrait à stdout (l'option -O). hadoop dfs -put - [hadoop path] met les informations provenant de stdin (-) dans le fichier HDFS fourni.

+0

pipe ne fonctionnera pas avec zip et second si tar a plus d'un fichier, il concaténera et deviendra un. – mtariq

Questions connexes