Scala 如何在sc.textFile而不是HDFS中加载本地文件
我在追随伟大的梦想 因此,我尝试在46m:00s加载Scala 如何在sc.textFile而不是HDFS中加载本地文件,scala,apache-spark,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> va
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)
$sudo docker run-i-t-h沙盒序列IQ/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
自述文件
bash-4.1#/料仓/火花壳
scala>val f=sc.textFile(“README.md”)
14/12/04 12:11:14 INFO storage.MemoryStore:ensureRefreeSpace(164073)调用时curMem=0,maxMem=278302556
14/12/04 12:11:14 INFO storage.MemoryStore:块广播0作为值存储在内存中(估计大小160.2 KB,可用容量265.3 MB)
f:org.apache.spark.rdd.rdd[String]=README.md MappedRDD[1]位于文本文件的位置:12
scala>val wc=f.flatMap(l=>l.split(“”).map(word=>(word,1)).reduceByKey(+382;)
org.apache.hadoop.mapred.InvalidInputException:输入路径不存在:hdfs://sandbox:9000/user/root/README.md
位于org.apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:285)
如何加载该README.md
?试试看
val f = sc.textFile("./README.md")
尝试显式指定
sc.textFile(“file:///path 到文件“/”
。设置Hadoop环境时会发生此错误
SparkContext.textFile在内部调用
org.apache.hadoop.mapred.FileInputFormat.getSplits
,如果缺少架构,则反过来使用org.apache.hadoop.fs.getDefaultUri
。此方法读取Hadoop conf的“fs.defaultFS”参数。如果设置Hadoop_conf_DIR环境变量,该参数通常设置为hdfs://..."; 否则“file://”这已在spark邮件列表中讨论过,请参考此
您应该使用hadoop fs-put代码>将文件复制到hdfs
:
${HADOOP_COMMON_HOME}/bin/hadoop fs -put /path/to/README.md README.md
冈贝的回答很好。但我还是想提到
文件://
=~/../../../
,而不是$SPARK\u HOME
。希望这能为像我这样的新手节省一些时间。这是我在Spark群集上遇到的错误的解决方案,Spark群集托管在Azure的windows群集上:
加载原始HVAC.csv文件,使用函数对其进行解析
data = sc.textFile("wasb:///HdiSamples/SensorSampleData/hvac/HVAC.csv")
我们使用(wasb://)来允许Hadoop访问azure博客存储文件,三个斜杠是对正在运行的节点容器文件夹的相对引用
例如:如果Spark cluster dashboard中文件资源管理器中的文件路径为:
sflcc1\sflccspark1\HdiSamples\SensorSampleData\hvac
因此,对路径的描述如下:sflcc1:是存储帐户的名称。sflccspark:是群集节点名称
因此,我们使用相对的三个斜杠引用当前集群节点名称
希望这有帮助。您只需将文件路径指定为“file:///directory/file" 例如:
val textFile = sc.textFile("file:///usr/local/spark/README.md")
我的桌面上有一个名为NewsArticle.txt的文件 在Spark中,我键入:
val textFile= sc.textFile(“file:///C:/Users/582767/Desktop/NewsArticle.txt”)
textFile.foreach(println)
我需要更改文件路径的所有\to/字符
为了测试它是否有效,我键入:
val textFile= sc.textFile(“file:///C:/Users/582767/Desktop/NewsArticle.txt”)
textFile.foreach(println)
我正在运行Windows7,但没有安装Hadoop 如果文件位于Spark master节点中(例如,在使用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的情况下启动Spark)以直接读取文件
$ 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|
+----+-------+
注意: 从本地(
sc.textFile)加载数据时,请确保在本地模式下运行sparkfile:///path 或者,您将得到类似以下的错误:java.io.FileNotFoundException:file file:/data/sparkjob/config2.properties不存在
。
因为在不同工作进程上运行的执行器将无法在其本地路径中找到此文件。如果您尝试从HDFS读取文件。正在尝试在SparkConf中设置路径
val conf = new SparkConf().setMaster("local[*]").setAppName("HDFSFileReader")
conf.set("fs.defaultFS", "hdfs://hostname:9000")
虽然Spark支持从本地文件系统加载文件,但它要求这些文件在集群中所有节点的同一路径上可用
一些网络文件系统,如NFS、AFS和MapR的NFS层,作为常规文件系统向用户公开
如果您的数据已经在其中一个系统中,那么您只需指定一个file://path;只要文件系统安装在每个节点上的相同路径上,Spark就会处理它。每个节点都需要有相同的路径
rdd = sc.textFile("file:///path/to/file")
如果您的文件不在集群中的所有节点上,您可以在驱动程序上本地加载它,而无需通过Spark,然后调用parallelize将内容分发给工作人员
注意将file://放在前面,并根据操作系统使用“/”或“\” 对于Spark 2.3,Hadoop也安装在公共的“Hadoop”用户主目录下,这种情况就发生在我身上。由于Spark和Hadoop都安装在同一个公共目录下,Spark默认将方案视为hdfs
,并开始在Hadoop的core site.xml
中的fs.defaultFS
指定的hdfs下查找输入文件。在这种情况下,我们需要显式地将方案指定为文件://
您不必使用sc.textFile(…)将本地文件转换为数据帧。其中一个选项是,逐行读取本地文件,然后将其转换为Spark数据集。以下是Java中Windows机器的一个示例:
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);
StructType schemata=DataTypes.createStructType(
新结构域[]{
createStructField(“COL1”,StringType,false),
createStructField(“COL2”,StringType,false),
...
}
);
字符串分隔符=“;”;
String filePath=“C:\\work\\myProj\\myFile.csv”;
SparkContext SparkContext=新的SparkContext(新的SparkContext().setAppName(“MyApp”).setMaster(“本地”);
JavaSparkContext jsc=新的JavaSparkContext(sparkContext);
SQLContext SQLContext=SQLContext.getOrCreate(sparkContext);
列表结果=新建