Как загрузить локальный файл в sc.textFile вместо 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?

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Пример:

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

Ответ 4

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

В Spark я набрал:

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

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

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

textFile.foreach(println)

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

Ответ 5

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

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

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

Ответ 6

Внимание:

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

Ответ 7

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

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

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

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

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

Постарайтесь поставить файл://спереди и использовать "/" или "\" в соответствии с ОС.

Ответ 8

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

Загрузите необработанный файл HVAC.csv, проанализируйте его с помощью функции

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

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

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

sflcc1\sflccspark1\HdiSamples\SensorSampleData\ОВК

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

Итак, мы ссылаемся на текущее имя кластера node с относительными тремя слэшами.

Надеюсь, что это поможет.

Ответ 9

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

$ 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 из локальной файловой системы, а затем запустить Spark в режиме по умолчанию (например, YARN в случае использования AWS EMR) для непосредственного чтения файла.

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

Ответ 10

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

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

Ответ 11

попробуйте

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