it-roy-ru.com

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

Я следую великому урок искры

поэтому я пытаюсь в 46m: 00 загрузить 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?

84
Jas

Попробуйте явно указать 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: //".

149
gonbe

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

20
zaxliu

Вам нужно просто указать путь к файлу как «Файл: /// каталог/файл»

пример:

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

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

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

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

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

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

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

9
Aklank Jain

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

В Spark я набрал:

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

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

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

textFile.foreach(println)

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

7
Gene

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

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

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

Внимание:

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

5
Matiji66

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

4
Binita Bharati

Если файл находится в главном узле Spark (например, в случае использования 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 из локальной файловой системы, а затем запустить 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|
+----+-------+
3
Joarder Kamal

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

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

Вам не нужно использовать sc.textFile (...) для преобразования локальных файлов в кадры данных. Один из вариантов - читать локальный файл построчно, а затем преобразовывать его в набор данных Spark. Вот пример для машины Windows в 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);

Теперь вы можете использовать dataframe data в своем коде.

0
Andrushenko Alexander

Я попробовал следующее, и это сработало из моей локальной файловой системы. В основном, спарк может читать с локального пути, HDFS и AWS S3.

listrdd=sc.textFile("file:////home/cloudera/Downloads/master-data/retail_db/products")
0
cloudguru

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

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

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

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

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

sflcc1\sflccspark1\HdiSamples\SensorSampleData\ОВК

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

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

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

0
Mostafa