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

时间:2014-12-04 17:12:53

标签: scala apache-spark

我正在关注伟大的spark tutorial

所以我在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

13 个答案:

答案 0 :(得分:154)

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

SparkContext.textFile在内部调用org.apache.hadoop.mapred.FileInputFormat.getSplits,如果缺少架构,则org.apache.hadoop.fs.getDefaultUri使用{{1}}。这个方法读取&#34; fs.defaultFS&#34; Hadoop conf的参数如果设置HADOOP_CONF_DIR环境变量,则参数通常设置为&#34; hdfs://...&#34 ;;否则&#34; file://&#34;。

答案 1 :(得分:11)

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

示例:

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

答案 2 :(得分:10)

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

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

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

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

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

注意将file://放在前面,并根据操作系统使用“/”或“\”。

答案 3 :(得分:7)

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

在Spark中,我输入了:

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

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

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

textFile.foreach(println)

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

答案 4 :(得分:5)

这已在spark邮件列表中讨论过,请参阅此mail

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

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

答案 5 :(得分: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|
+----+-------+

或者,您可以先从本地文件系统将文件复制到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|
+----+-------+

答案 6 :(得分:5)

<强>注意:

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

答案 7 :(得分:4)

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

答案 8 :(得分:0)

这是我在Azure群集中托管在Windows群集上的Spark群集上遇到此错误的解决方案:

加载原始HVAC.csv文件,使用函数

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

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

例如:如果Spark集群仪表板中文件资源管理器中文件的路径为:

sflcc1 \ sflccspark1 \ HdiSamples \ SensorSampleData \ HVAC

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

因此我们引用具有相对三个斜杠的当前群集节点名称。

希望这有帮助。

答案 9 :(得分:0)

如果您尝试从HDFS中读取文件。尝试在SparkConf中设置路径

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

答案 10 :(得分:0)

您不必使用sc.textFile(...)将本地文件转换为数据帧。选项之一是,逐行读取本地文件,然后将其转换为Spark Dataset。这是Java中Windows计算机的示例:

<androidx.recyclerview.widget.RecyclerView
     android:id="@+id/items"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/your_color"
     android:minHeight="200dp"
     tools:listitem="@layout/item_card">
 </androidx.recyclerview.widget.RecyclerView>

现在,您可以在代码中使用数据框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);

答案 11 :(得分:0)

我尝试了以下操作,并且可以从我的本地文件系统运行。基本上,spark可以从本地,HDFS和AWS S3路径读取

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

答案 12 :(得分:-5)

尝试

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