Как загрузить локальный файл в 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 ответов:
попробуйте явно указать
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
в Hadoopcore-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: имя узла кластера.
таким образом, мы ссылаемся на текущее имя узла кластера с относительными тремя косыми чертами.
надеюсь, что это помогает.