Como carregar o arquivo local em sc.textFile, em vez de HDFS


100

Estou seguindo o ótimo tutorial de faísca

então, estou tentando a 46m: 00s carregar o, README.mdmas não consigo o que estou fazendo:

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

como posso carregar isso README.md?

Respostas:


177

Tente especificar explicitamente sc.textFile("file:///path to the file/"). O erro ocorre quando o ambiente Hadoop é definido.

SparkContext.textFile chama internamente org.apache.hadoop.mapred.FileInputFormat.getSplits, que por sua vez usa org.apache.hadoop.fs.getDefaultUrise o esquema estiver ausente. Este método lê o parâmetro "fs.defaultFS" do Hadoop conf. Se você definir a variável de ambiente HADOOP_CONF_DIR, o parâmetro geralmente é definido como "hdfs: // ..."; caso contrário, "arquivo: //".


Por acaso, você sabe como fazer isso com Java? Não vejo um método. É muito frustrante não haver uma maneira fácil de fornecer um caminho para carregar um arquivo de um sistema de arquivos simples.
Brad Ellis

respondendo a mim mesmo. Existe um switch --file que você passa com o spark-submit. Portanto, o caminho do arquivo pode ser codificado permanentemente ou, no entanto, sua configuração está configurada para o aplicativo, mas você também sinaliza esse caminho. quando você envia para que os executores possam ver o caminho.
Brad Ellis

24

a resposta de gonbe é excelente. Mas ainda quero mencionar que file:///= ~/../../, não $SPARK_HOME. Espero que isso possa economizar algum tempo para novatos como eu.


4
file:///é a pasta raiz do sistema de arquivos conforme vista pela JVM em execução, não dois níveis acima da pasta inicial. O formato URI conforme especificado no RFC 8089 é file://hostname/absolute/path. No caso local, o hostnamecomponente (autoridade) está vazio.
Hristo Iliev de

17

Embora o Spark dê suporte ao carregamento de arquivos do sistema de arquivos local, ele requer que os arquivos estejam disponíveis no mesmo caminho em todos os nós do cluster.

Alguns sistemas de arquivos de rede, como NFS, AFS e a camada NFS do MapR, são expostos ao usuário como um sistema de arquivos regular.

Se seus dados já estiverem em um desses sistemas, você pode usá-los como uma entrada apenas especificando um arquivo: // caminho; O Spark cuidará disso, desde que o sistema de arquivos seja montado no mesmo caminho em cada nó. Cada nó precisa ter o mesmo caminho

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

Se o seu arquivo ainda não estiver em todos os nós do cluster, você pode carregá-lo localmente no driver sem passar pelo Spark e, em seguida, chamar o paralelize para distribuir o conteúdo aos trabalhadores

Tome cuidado ao colocar file: // na frente e usar "/" ou "\" de acordo com o sistema operacional.


1
Existe uma maneira de o Spark copiar automaticamente os dados de seu diretório $ SPARK_HOME para todos os nós de computação. Ou você precisa fazer isso manualmente?
Matthias

onde está o código-fonte do Spark manipulando diferentes formatos de sistema de arquivos?
Saher Ahwal

12

Você precisa apenas especificar o caminho do arquivo como "arquivo: /// diretório / arquivo"

exemplo:

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

12

Atenção:

Certifique-se de executar o spark no modo local ao carregar dados de local ( sc.textFile("file:///path to the file/")) ou obterá um erro como este Caused by: java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not exist. Porque os executores que rodam em diferentes workers não irão encontrar este arquivo em seu caminho local.


11

Se o arquivo estiver localizado em seu nó mestre Spark (por exemplo, no caso de usar AWS EMR), inicie o spark-shell no modo local primeiro.

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

Como alternativa, você pode primeiro copiar o arquivo para HDFS do sistema de arquivos local e, em seguida, iniciar o Spark em seu modo padrão (por exemplo, YARN no caso de usar AWS EMR) para ler o arquivo diretamente.

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

9

Eu tenho um arquivo chamado NewsArticle.txt na minha área de trabalho.

No Spark, digitei:

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

Eu precisava mudar todos os caracteres \ para / para o caminho de arquivo.

Para testar se funcionou, digitei:

textFile.foreach(println)

Estou executando o Windows 7 e não tenho o Hadoop instalado.


5

Isso foi discutido na lista de discussão do Spark, consulte este e- mail .

Você deve hadoop fs -put <localsrc> ... <dst>copiar o arquivo em hdfs:

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

5

Isso aconteceu comigo com o Spark 2.3 e o Hadoop também instalado no diretório inicial do usuário "hadoop" comum. Como o Spark e o Hadoop foram instalados no mesmo diretório comum, o Spark, por padrão, considera o esquema como hdfse começa a procurar os arquivos de entrada sob hdfs conforme especificado por fs.defaultFSno Hadoop's core-site.xml. Nesses casos, precisamos especificar explicitamente o esquema como file:///<absoloute path to file>.


0

Esta é a solução para este erro que estava recebendo no cluster Spark que está hospedado no Azure em um cluster do Windows:

Carregue o arquivo HVAC.csv bruto, analise-o usando a função

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

Usamos (wasb: ///) para permitir que o Hadoop acesse o arquivo de armazenamento do blog do azure e as três barras são uma referência relativa à pasta do contêiner do nó em execução.

Por exemplo: se o caminho para seu arquivo no File Explorer no painel do cluster Spark for:

sflcc1 \ sflccspark1 \ HdiSamples \ SensorSampleData \ hvac

Portanto, para descrever o caminho é o seguinte: sflcc1: é o nome da conta de armazenamento. sflccspark: é o nome do nó do cluster.

Portanto, nos referimos ao nome do nó do cluster atual com as três barras relativas.

Espero que isto ajude.


0

Se você está tentando ler o arquivo do HDFS. tentando definir o caminho no SparkConf

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

Adicione recuo de 4 espaços / tabulação ao seu código para que seja formatado como código. Atenciosamente
YakovL

0

Você não precisa usar sc.textFile (...) para converter arquivos locais em dataframes. Uma das opções é ler um arquivo local linha por linha e depois transformá-lo em Spark Dataset. Aqui está um exemplo para máquina Windows em 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);

Agora você pode usar dataframe dataem seu código.


0

Tentei o seguinte e funcionou no meu sistema de arquivos local. Basicamente, o Spark pode ler o caminho local, HDFS e AWS S3

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

-6

experimentar

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

scala> val f = sc.textFile("./README.md") 14/12/04 12:54:33 INFO storage.MemoryStore: ensureFreeSpace(81443) called with curMem=164073, maxMem=278302556 14/12/04 12:54:33 INFO storage.MemoryStore: Block broadcast_1 stored as values in memory (estimated size 79.5 KB, free 265.2 MB) f: org.apache.spark.rdd.RDD[String] = ./README.md MappedRDD[5] 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
Jas

Você pode fazer um pwdno shell bashbash-4.1#
Soumya Simanta

bash-4.1 # pwd /usr/local/spark-1.1.0-bin-hadoop2.4
Jas

Isso funciona para mim no Spark sem hadoop / hdfs. No entanto, não parece estar funcionando para o OP, pois forneceu um dump de erro.
Paul
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.