Je suis le grand tutoriel spark
donc j'essaye à 46m: 00s de charger le README.md
mais échoue à ce que je fais est la suivante:
$ Sudo docker run -i -t -h sandbox sequenceiq/spark:1.1.0 /etc/bootstrap.sh -bash
bash-4.1# cd /usr/local/spark-1.1.0-bin-hadoop2.4
bash-4.1# ls README.md
README.md
bash-4.1# ./bin/spark-Shell
scala> val f = sc.textFile("README.md")
14/12/04 12:11:14 INFO storage.MemoryStore: ensureFreeSpace(164073) called with curMem=0, maxMem=278302556
14/12/04 12:11:14 INFO storage.MemoryStore: Block broadcast_0 stored as values in memory (estimated size 160.2 KB, free 265.3 MB)
f: org.Apache.spark.rdd.RDD[String] = README.md MappedRDD[1] at textFile at <console>:12
scala> val wc = f.flatMap(l => l.split(" ")).map(Word => (Word, 1)).reduceByKey(_ + _)
org.Apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://sandbox:9000/user/root/README.md
at org.Apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.Java:285)
comment puis-je charger ce README.md
?
Essayez de spécifier explicitement sc.textFile("file:///path to the file/")
. L'erreur se produit lorsque l'environnement Hadoop est défini.
SparkContext.textFile appelle en interne org.Apache.hadoop.mapred.FileInputFormat.getSplits
, qui à son tour utilise org.Apache.hadoop.fs.getDefaultUri
si le schéma est absent. Cette méthode lit le paramètre "fs.defaultFS" de Hadoop conf. Si vous définissez la variable d'environnement HADOOP_CONF_DIR, le paramètre est généralement défini sur "hdfs: // ..."; sinon "fichier: //".
la réponse de Gonbe est excellente. Mais je tiens tout de même à mentionner que file:///
= ~/../../
, pas $SPARK_HOME
. J'espère que cela pourrait économiser du temps pour les newbs comme moi.
Il vous suffit de spécifier le chemin du fichier en tant que "fichier: /// répertoire/fichier"
exemple:
val textFile = sc.textFile("file:///usr/local/spark/README.md")
Bien que Spark prenne en charge le chargement de fichiers à partir du système de fichiers local, les fichiers doivent être disponibles sur le même chemin sur tous les nœuds de votre cluster.
Certains systèmes de fichiers réseau, tels que NFS, AFS et la couche NFS de MapR, sont exposés à l’utilisateur sous forme de système de fichiers classique.
Si vos données se trouvent déjà dans l'un de ces systèmes, vous pouvez les utiliser comme entrée en spécifiant simplement un fichier file: // path; Spark le gérera tant que le système de fichiers sera monté sur le même chemin sur chaque nœud. Chaque nœud doit avoir le même chemin
rdd = sc.textFile("file:///path/to/file")
Si votre fichier ne figure pas déjà sur tous les nœuds du cluster, vous pouvez le charger localement sur le pilote sans passer par Spark, puis appeler paralléliser pour distribuer le contenu aux opérateurs.
Prenez soin de mettre le fichier: // devant et l’utilisation de "/" ou "\" selon le système d’exploitation.
J'ai un fichier appelé NewsArticle.txt sur mon bureau.
Dans Spark, j'ai tapé:
val textFile= sc.textFile(“file:///C:/Users/582767/Desktop/NewsArticle.txt”)
Je devais changer tout le caractère\to/pour le chemin du fichier.
Pour vérifier si cela fonctionnait, j'ai tapé:
textFile.foreach(println)
J'utilise Windows 7 et je n'ai pas installé Hadoop.
Cela a été discuté dans la liste de diffusion spark, et s'il vous plaît référez-vous ceci mail .
Vous devriez utiliser hadoop fs -put <localsrc> ... <dst>
copier le fichier dans hdfs
:
${HADOOP_COMMON_HOME}/bin/hadoop fs -put /path/to/README.md README.md
Attention:
Assurez-vous que vous exécutez spark en mode local lorsque vous chargez des données à partir de (sc.textFile("file:///path to the file/")
), sinon vous obtiendrez une erreur comme celle-ci Caused by: Java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not exist
. Les exécuteurs de Becasuse qui s'exécutent sur différents travailleurs ne trouveront pas ce fichier dans son chemin d'accès local.
C’est ce qui m’est arrivé avec Spark 2.3 avec Hadoop également installé dans le répertoire de base commun de l’utilisateur "hadoop". Depuis que Spark et Hadoop ont été installés dans le même répertoire commun, Spark considère par défaut le schéma comme étant hdfs
et commence à fichiers sous hdfs comme spécifié par fs.defaultFS
dans le core-site.xml
de Hadoop. Dans de tels cas, nous devons explicitement spécifier le schéma en tant que file:///<absoloute path to file>
.
Si le fichier se trouve dans votre nœud maître Spark (par exemple, si vous utilisez AWS EMR), lancez d'abord spark-Shell en mode local.
$ spark-Shell --master=local
scala> val df = spark.read.json("file:///usr/lib/spark/examples/src/main/resources/people.json")
df: org.Apache.spark.sql.DataFrame = [age: bigint, name: string]
scala> df.show()
+----+-------+
| age| name|
+----+-------+
|null|Michael|
| 30| Andy|
| 19| Justin|
+----+-------+
Sinon, vous pouvez d'abord copier le fichier sur HDFS à partir du système de fichiers local, puis lancer Spark dans son mode par défaut (par exemple, YARN en cas d'utilisation d'AWS EMR) pour lire le fichier directement.
$ hdfs dfs -mkdir -p /hdfs/spark/examples
$ hadoop fs -put /usr/lib/spark/examples/src/main/resources/people.json /hdfs/spark/examples
$ hadoop fs -ls /hdfs/spark/examples
Found 1 items
-rw-r--r-- 1 hadoop hadoop 73 2017-05-01 00:49 /hdfs/spark/examples/people.json
$ spark-Shell
scala> val df = spark.read.json("/hdfs/spark/examples/people.json")
df: org.Apache.spark.sql.DataFrame = [age: bigint, name: string]
scala> df.show()
+----+-------+
| age| name|
+----+-------+
|null|Michael|
| 30| Andy|
| 19| Justin|
+----+-------+
Si vous essayez de lire le fichier depuis HDFS. essayer de définir le chemin dans SparkConf
val conf = new SparkConf().setMaster("local[*]").setAppName("HDFSFileReader")
conf.set("fs.defaultFS", "hdfs://hostname:9000")
Vous n'êtes pas obligé d'utiliser sc.textFile (...) pour convertir des fichiers locaux en images. L'une des options consiste à lire un fichier local ligne par ligne, puis à le transformer en jeu de données Spark. Voici un exemple pour une machine Windows en Java:
StructType schemata = DataTypes.createStructType(
new StructField[]{
createStructField("COL1", StringType, false),
createStructField("COL2", StringType, false),
...
}
);
String separator = ";";
String filePath = "C:\\work\\myProj\\myFile.csv";
SparkContext sparkContext = new SparkContext(new SparkConf().setAppName("MyApp").setMaster("local"));
JavaSparkContext jsc = new JavaSparkContext (sparkContext );
SQLContext sqlContext = SQLContext.getOrCreate(sparkContext );
List<String[]> result = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = br.readLine()) != null) {
String[] vals = line.split(separator);
result.add(vals);
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
throw new RuntimeException(ex);
}
JavaRDD<String[]> jRdd = jsc.parallelize(result);
JavaRDD<Row> jRowRdd = jRdd .map(RowFactory::create);
Dataset<Row> data = sqlContext.createDataFrame(jRowRdd, schemata);
Vous pouvez maintenant utiliser dataframe data
dans votre code.
J'ai essayé ce qui suit et cela a fonctionné à partir de mon système de fichiers local. Essentiellement, spark peut lire à partir du chemin d'accès local, HDFS et AWS S3
listrdd=sc.textFile("file:////home/cloudera/Downloads/master-data/retail_db/products")
Voici la solution à cette erreur liée au cluster Spark hébergé dans Azure sur un cluster Windows:
Chargez le fichier HVAC.csv brut, analysez-le à l'aide de la fonction
data = sc.textFile("wasb:///HdiSamples/SensorSampleData/hvac/HVAC.csv")
Nous utilisons (wasb: ///) pour permettre à Hadoop d'accéder au fichier de stockage du blog Azure. Les trois barres obliques constituent une référence relative au dossier de conteneur du noeud en cours d'exécution.
Par exemple: Si le chemin d'accès à votre fichier dans l'Explorateur de fichiers du tableau de bord du cluster Spark est:
sflcc1\sflccspark1\HdiSamples\SensorSampleData\hvac
Pour décrire le chemin, procédez comme suit: sflcc1: est le nom du compte de stockage. sflccspark: est le nom du nœud du cluster.
Nous nous référons donc au nom du nœud de cluster actuel avec les trois barres obliques relatives.
J'espère que cela t'aides.