Как загрузить локальный файл в sc.текстовый файл, а не HDFS


Я следую за великим Искра учебник

поэтому я пытаюсь в 46m:00s загрузить README.md но плохо то, что я делаю это:

$ 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)

как я могу загрузить, что README.md?

12 75

12 ответов:

попробуйте явно указать sc.textFile("file:///path to the file/"). Ошибка возникает при установке среды Hadoop.

SparkContext.текстовый файл внутренне называет org.apache.hadoop.mapred.FileInputFormat.getSplits, который в свою очередь использует org.apache.hadoop.fs.getDefaultUri Если схема отсутствует. Этот метод читает "ПС.defaultFS " параметр Hadoop conf. Если вы задаете переменную среды HADOOP_CONF_DIR, параметр обычно задается как " hdfs://..."; иначе "файл://".

ответ гонбе превосходен. Но все же я хочу упомянуть, что file:/// = ~/../../, а не $SPARK_HOME. Надеюсь, это поможет сэкономить время таким новичкам, как я.

вам нужно просто указать путь к файлу как "file: / / / directory / file"

пример:

val textFile = sc.textFile("file:///usr/local/spark/README.md")

у меня есть файл под названием NewsArticle.txt на моем рабочем столе.

в Spark я набрал:

val textFile= sc.textFile(“file:///C:/Users/582767/Desktop/NewsArticle.txt”)

мне нужно было изменить все \ to / символ для пути к файлу.

чтобы проверить, если это сработало, я набрал:

textFile.foreach(println)

Я запускаю Windows 7, и у меня не установлен Hadoop.

хотя Spark поддерживает загрузку файлов из локальной файловой системы, она требует, чтобы файлы были доступны по одному и тому же пути на всех узлах кластера.

некоторые сетевые файловые системы, такие как NFS, AFS и слой NFS MapR, предоставляются пользователю как обычная файловая система.

Если ваши данные уже есть в одной из этих систем, то вы можете использовать его в качестве входных данных, просто указав file:// путь; Spark будет обрабатывать его до тех пор, пока файловая система монтируется по одному и тому же пути на каждом узле. Каждый узел должен иметь один и тот же путь

 rdd = sc.textFile("file:///path/to/file")

Если ваш файл еще не находится на всех узлах кластера, вы можете загрузить его локально на драйвере, не проходя через Spark, а затем вызвать parallelize для распространения содержимого среди рабочих

позаботьтесь о том, чтобы поместить файл:// спереди и использовать "/" или "\" в соответствии с ОС.

Это обсуждалось в списке рассылки spark, и, пожалуйста, обратитесь к этому почта.

вы должны использовать hadoop fs -put <localsrc> ... <dst> скопировать файл в hdfs:

${HADOOP_COMMON_HOME}/bin/hadoop fs -put /path/to/README.md README.md

Если файл находится в вашем узле Spark master (например, в случае использования AWS EMR), то сначала запустите spark-shell в локальном режиме.

$ 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|
+----+-------+
$ 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|
+----+-------+

внимание:

убедитесь, что вы запускаете spark в локальном режиме при загрузке данных из локального(sc.textFile("file:///path to the file/")) или вы получите ошибку, как это Caused by: java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not exist. Потому что исполнители, которые работают на разных рабочих не найдут этот файл в его локальном пути.

это произошло со мной с Spark 2.3 с Hadoop, также установленным в общем домашнем каталоге пользователя "hadoop".Поскольку Spark и Hadoop были установлены в одном общем каталоге, Spark по умолчанию рассматривает схему как hdfs, и начинает искать входные файлы под hdfs, как указано fs.defaultFS в Hadoop core-site.xml. В таких случаях нам нужно явно указать схему как file:///<absoloute path to file>.

Это решение для этой ошибки, которую я получал в кластере Spark, размещенном в Azure в кластере windows:

загрузить сырьем, вентиляции и кондиционирования.CSV-файл, разобрать его с помощью функции

data = sc.textFile("wasb:///HdiSamples/SensorSampleData/hvac/HVAC.csv")

мы используем (wasb:///), чтобы разрешить Hadoop доступ к файлу хранилища блогов azure, а три косые черты-это относительная ссылка на папку контейнера запущенного узла.

например: если путь к файлу в Проводнике в панели мониторинга кластера Spark это:

sflcc1\sflccspark1\HdiSamples\SensorSampleData\hvac

таким образом, чтобы описать путь следующим образом: sflcc1: это имя учетной записи хранения. sflccspark: имя узла кластера.

таким образом, мы ссылаемся на текущее имя узла кластера с относительными тремя косыми чертами.

надеюсь, что это помогает.

Если вы пытаетесь прочитать файл формы HDFS. попытка установки пути в SparkConf

 val conf = new SparkConf().setMaster("local[*]").setAppName("HDFSFileReader")
 conf.set("fs.defaultFS", "hdfs://hostname:9000")

попробовать

val f = sc.textFile("./README.md")