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