我正在关注伟大的火花教程
所以我试图在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: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环境变量,则该参数通常设置为"hdfs:// ..."; 否则"file://".
gonbe的答案很棒.但我仍然想提及file:///
= ~/../../
,而不是$SPARK_HOME
.希望这可以为像我这样的新手节省一些时间.
如果文件位于您的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| +----+-------+
您只需要将文件的路径指定为"file:/// directory/file"
例:
val textFile = sc.textFile("file:///usr/local/spark/README.md")
虽然Spark支持从本地文件系统加载文件,但它要求文件在群集中所有节点上的相同路径上可用.
某些网络文件系统(如NFS,AFS和MapR的NFS层)作为常规文件系统向用户公开.
如果您的数据已经在其中一个系统中,那么只需指定file:// path 即可将其用作输入; 只要文件系统安装在每个节点上的相同路径上,Spark就会处理它.每个节点都需要具有相同的路径
rdd = sc.textFile("file:///path/to/file")
如果您的文件尚未在群集中的所有节点上,您可以在驱动程序上本地加载它而无需通过Spark,然后调用parallelize将内容分发给工作人员
注意将file://放在前面,根据操作系统使用"/"或"\".
注意:
从local(sc.textFile("file:///path to the file/")
)加载数据时,请确保以本地模式运行spark,否则会出现这样的错误Caused by: java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not exist
.运行在不同工作程序上的执行程序将无法在其本地路径中找到此文件.
我的桌面上有一个名为NewsArticle.txt的文件.
在Spark中,我键入:
val textFile= sc.textFile(“file:///C:/Users/582767/Desktop/NewsArticle.txt”)
我需要更改文件路径的所有\到/字符.
为了测试它是否有效,我键入:
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