web-dev-qa-db-fra.com

Comment enregistrer un fichier sur le cluster

Je suis connecté au cluster à l'aide de ssh et j'envoie le programme au cluster à l'aide de 

spark-submit --master yarn myProgram.py

Je veux enregistrer le résultat dans un fichier texte et j'ai essayé d'utiliser les lignes suivantes:

counts.write.json("hdfs://home/myDir/text_file.txt")
counts.write.csv("hdfs://home/myDir/text_file.csv")

Cependant, aucun d'entre eux ne fonctionne. Le programme se termine et je ne trouve pas le fichier texte dans myDir. Avez-vous une idée de comment puis-je faire cela?

De plus, y a-t-il un moyen d'écrire directement sur ma machine locale?

EDIT: J'ai découvert que le répertoire home n'existe pas. J'enregistre donc le résultat sous la forme suivante: counts.write.json("hdfs:///user/username/text_file.txt") Mais cela crée un répertoire nommé text_file.txt. À l'intérieur, j'ai beaucoup de fichiers contenant des résultats partiels. . Mais je veux un fichier avec le résultat final à l'intérieur. Des idées comment je peux faire ceci?

11
lads

Spark enregistrera les résultats dans plusieurs fichiers car le calcul est distribué. Donc écrit:

counts.write.csv("hdfs://home/myDir/text_file.csv")

signifie enregistrer les données sur chaque partition en tant que fichier séparé dans le dossiertext_file.csv. Si vous souhaitez que les données soient enregistrées dans un fichier unique, utilisez d'abord coalesce(1):

counts.coalesce(1).write.csv("hdfs://home/myDir/text_file.csv")

Cela mettra toutes les données dans une seule partition et le nombre de fichiers sauvegardés sera donc de 1. Cependant, cela pourrait être une mauvaise idée si vous avez beaucoup de données. Si les données sont très petites, alors collect() est une alternative. Cela mettra toutes les données sur la machine du pilote sous forme de tableau, qui pourra ensuite être sauvegardé dans un fichier unique.

6
Shaido

Vous pouvez concaténer vos résultats dans un fichier à partir de la ligne de commande:

hadoop fs -cat hdfs:///user/username/text_file.txt/* > path/to/local/file.txt

Cela devrait être plus rapide que d'utiliser coalesce - d'après mon expérience, toutes les opérations de type collect() sont lentes car toutes les données sont acheminées via le nœud maître. De plus, vous pouvez rencontrer des problèmes avec collect() si vos données dépassent la mémoire de votre nœud maître.

Cependant , un inconvénient potentiel de cette approche est que vous devrez supprimer explicitement les fichiers d'une exécution précédente (car l'exécution en cours risque de ne pas produire exactement le même nombre de fichiers). Il peut y avoir un drapeau pour le faire à chaque passage, mais je ne suis pas sûr.

Retirer:

hadoop fs -rm -r hdfs:///user/username/text_file.txt/*
2
pault

Avez-vous une erreur? Peut-être que vous pouvez vérifier si vous disposez des autorisations appropriées pour écrire/lire à partir de ce dossier.

Pensez également que Spark créera par défaut un dossier appelé text_file.txt contenant certains fichiers, en fonction du nombre de partitions que vous avez.

Si vous voulez écrire sur votre ordinateur local, vous pouvez spécifier le chemin avec file:///home/myDir/text_file.txt. Si vous utilisez un chemin tel que /user/hdfs/... est écrit par défaut dans HDFS

0
Javier Montón