web-dev-qa-db-fra.com

lire un fichier en hdfs depuis pyspark

J'essaie de lire un fichier dans mes hdfs. Voici une présentation de ma structure de fichiers hadoop.

hduser@GVM:/usr/local/spark/bin$ hadoop fs -ls -R /
drwxr-xr-x   - hduser supergroup          0 2016-03-06 17:28 /inputFiles
drwxr-xr-x   - hduser supergroup          0 2016-03-06 17:31 /inputFiles/CountOfMonteCristo
-rw-r--r--   1 hduser supergroup    2685300 2016-03-06 17:31 /inputFiles/CountOfMonteCristo/BookText.txt

Voici mon code pyspark:

from pyspark import SparkContext, SparkConf

conf = SparkConf().setAppName("myFirstApp").setMaster("local")
sc = SparkContext(conf=conf)

textFile = sc.textFile("hdfs://inputFiles/CountOfMonteCristo/BookText.txt")
textFile.first()

L'erreur que j'obtiens est:

Py4JJavaError: An error occurred while calling o64.partitions.
: Java.lang.IllegalArgumentException: Java.net.UnknownHostException: inputFiles

Est-ce parce que je ne configure pas correctement mon sparkContext? J'exécute cela dans une machine virtuelle ubuntu 14.04 via une boîte virtuelle.

Je ne sais pas ce que je fais mal ici ...

9
user1357015

Vous pouvez accéder aux fichiers HDFS via le chemin d'accès complet si aucune configuration n'est fournie (namenodehost est votre hôte local si hdfs est situé dans l'environnement local).

hdfs://namenodehost/inputFiles/CountOfMonteCristo/BookText.txt
11
Shawn Guo

Étant donné que vous ne fournissez pas d'autorité, l'URI devrait ressembler à ceci:

hdfs:///inputFiles/CountOfMonteCristo/BookText.txt

sinon inputFiles est interprété comme un nom d'hôte. Avec une configuration correcte, vous ne devriez pas du tout avoir besoin d'un schéma:

/inputFiles/CountOfMonteCristo/BookText.txt

au lieu.

7
zero323

Il existe deux façons générales de lire des fichiers dans Spark, une pour les fichiers très distribués pour les traiter en parallèle, une pour lire les petits fichiers comme les tables de recherche et la configuration sur HDFS. Pour ce dernier, vous souhaiterez peut-être lire un fichier dans le nœud du pilote ou les travailleurs en une seule lecture (pas une lecture distribuée). Dans ce cas, vous devez utiliser le module SparkFiles comme ci-dessous.

# spark is a SparkSession instance
from pyspark import SparkFiles

spark.sparkContext.addFile('hdfs:///user/bekce/myfile.json')
with open(SparkFiles.get('myfile.json'), 'rb') as handle:
    j = json.load(handle)
    or_do_whatever_with(handle)
2
bekce

Tout d'abord, vous devez exécuter

export PYSPARK_PYTHON=python3.4 #what so ever is your python version

code

from pyspark.sql import SparkSession
from pyspark import SparkConf, SparkContext

spark = SparkSession.builder.appName("HDFS").getOrCreate()
sparkcont = SparkContext.getOrCreate(SparkConf().setAppName("HDFS"))
logs = sparkcont.setLogLevel("ERROR")

data = [('First', 1), ('Second', 2), ('Third', 3), ('Fourth', 4), ('Fifth', 5)]
df = spark.createDataFrame(data)

df.write.csv("hdfs:///mnt/data/")
print("Data Written")

Pour exécuter le code

spark-submit --master yarn --deploy-mode client <py file>
0
Sahil Nagpal