如何在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

尝试显式指定sc.textFile("file:///path to the file/") 。 Hadoop环境设置时发生错误。

SparkContext.textFile在内部调用org.apache.hadoop.mapred.FileInputFormat.getSplits ,如果架构不存在,它反过来使用org.apache.hadoop.fs.getDefaultUri 。 这个方法读取Hadoop conf的“fs.defaultFS”参数。 如果设置HADOOP_CONF_DIR环境variables,通常将参数设置为“hdfs:// …”; 否则为“file://”。

冈贝的回答非常好。 但是我还是想提一下file:/// = ~/../../ ,而不是$SPARK_HOME 。 希望这能为像我这样的新人节省一些时间。

您只需要将文件的path指定为“file:/// directory / file”

例:

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

我的桌面上有一个名为NewsArticle.txt的文件。

在Spark中,我input:

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

我需要改变所有的文件path\ /字符。

为了testing它是否工作,我input:

 textFile.foreach(println) 

我正在运行Windows 7,我没有安装Hadoop。

这已被讨论到火花邮件列表,请参阅此邮件 。

您应该使用hadoop fs -put <localsrc> ... <dst>将文件复制到hdfs

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

注意:

当你从本地加载数据( sc.textFile("file:///path to the file/") )时,确保你在本地模式下运行spark,否则你会得到如下错误Caused by: java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not exist 。 在不同的员工上运行的执行者不会在本地path中find这个文件。

这是我遇到的在Windows群集上的Azure托pipe的Spark群集中的错误的解决scheme:

加载原始的HVAC.csv文件,使用该函数parsing它

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

我们使用(wasb:///)来允许Hadoop访问azure博客存储文件,三个斜杠是对运行节点容器文件夹的相对引用。

例如:如果Spark集群仪表板中文件资源pipe理器中的文件path为:

sflcc1 \ sflccspark1 \ HdiSamples \ SensorSampleData \ HVAC

所以要描述的path如下:sflcc1:是存储帐户的名称。 sflccspark:是集群节点名称。

所以我们用相对三个斜杠来引用当前的集群节点名称。

希望这可以帮助。

如果文件位于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(例如,在使用AWS EMR的情况下为YARN)直接读取文件。

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

如果你想读HDFS文件。 尝试在SparkConf中设置path

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

尝试

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