如何在sc.textFile中加载本地文件,而不是HDFS

Jas*_*Jas 95 scala apache-spark

我正在关注伟大的火花教程

所以我试图在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)
Run Code Online (Sandbox Code Playgroud)

我该如何加载README.md

suz*_*omo 166

尝试明确指定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://".


zax*_*liu 22

gonbe的答案很棒.但我仍然想提及file:///= ~/../../,而不是$SPARK_HOME.希望这可以为像我这样的新手节省一些时间.

  • `file:///`是执行JVM看到的文件系统的根文件夹,而不是主文件夹上面的两个级别.[RFC 8089](https://tools.ietf.org/html/rfc8089)中指定的URI格式为`file:// hostname/absolute/path`.在本地情况下,`hostname`(authority)组件为空. (3认同)

Akl*_*ain 13

虽然Spark支持从本地文件系统加载文件,但它要求文件在群集中所有节点上的相同路径上可用.

某些网络文件系统(如NFS,AFS和MapR的NFS层)作为常规文件系统向用户公开.

如果您的数据已经在其中一个系统中,那么只需指定file:// path 即可将其用作输入; 只要文件系统安装在每个节点上的相同路径上,Spark就会处理它.每个节点都需要具有相同的路径

 rdd = sc.textFile("file:///path/to/file")
Run Code Online (Sandbox Code Playgroud)

如果您的文件尚未在群集中的所有节点上,您可以在驱动程序上本地加载它而无需通过Spark,然后调用parallelize将内容分发给工作人员

注意将file://放在前面,根据操作系统使用"/"或"\".


Ham*_*ref 11

您只需要将文件的路径指定为"file:/// directory/file"

例:

val textFile = sc.textFile("file:///usr/local/spark/README.md")
Run Code Online (Sandbox Code Playgroud)


Mat*_*i66 11

注意:

从local(sc.textFile("file:///path to the file/"))加载数据时,请确保以本地模式运行spark,否则会出现这样的错误Caused by: java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not exist.运行在不同工作程序上的执行程序将无法在其本地路径中找到此文件.


Gen*_*ene 8

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

在Spark中,我键入:

val textFile= sc.textFile(“file:///C:/Users/582767/Desktop/NewsArticle.txt”)
Run Code Online (Sandbox Code Playgroud)

我需要更改文件路径的所有\到/字符.

为了测试它是否有效,我键入:

textFile.foreach(println)
Run Code Online (Sandbox Code Playgroud)

我正在运行Windows 7而我没有安装Hadoop.


Bin*_*ati 6

这发生在我身上,Spark 2.3 和 Hadoop 也安装在公共“hadoop”用户主目录下。由于 Spark 和 Hadoop 都安装在同一个公共目录下,Spark 默认将方案视为hdfs,并开始寻找输入文件fs.defaultFS在 Hadoop 中指定的 hdfs 下core-site.xml。在这种情况下,我们需要将方案明确指定为file:///<absoloute path to file>


Nan*_*iao 5

这已经讨论过火花邮件列表,请参考这封邮件.

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

${HADOOP_COMMON_HOME}/bin/hadoop fs -put /path/to/README.md README.md
Run Code Online (Sandbox Code Playgroud)


Joa*_*mal 5

如果文件位于您的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|
+----+-------+
Run Code Online (Sandbox Code Playgroud)

或者,您可以先将文件从本地文件系统复制到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|
+----+-------+
Run Code Online (Sandbox Code Playgroud)