在客户端模式下运行应用程序时,到底在哪里可以激发读取本地文件



我正在部署一个 Spark独立集群.172.16.133.15 是一个在一台机器中有两个 worker 的主节点,它部署在 ubuntu14.10 中。

正如文档所说,我可以使用"客户端模式"或"集群模式"运行应用程序。

我的问题是:

1( 在客户端模式下运行应用程序时在哪里加载文件(在 Windows 机器中(?

SparkConf conf = new SparkConf().setAppName("Test")
.setMaster("172.16.133.15")
.set("spark.submit.deployMode", "client");
JavaSparkContext sc = new JavaSparkContext(conf);
String path = "file:///C:\Users\Me\Desktop\demo\1530699196271";
JavaPairRDD<String, String> rdd = sc.wholeTextFiles(path);
JavaPairRDD<String, String> transformed = rdd.mapToPair(tuple2 ->{
String fname = tuple2._1();
String content = tuple2._2();
content = YUVSimpleTrans.transform(content);
return new Tuple2<>(fname, content);
});
transformed.saveAsTextFile("file:///C:/Users/Me/Desktop/demo/out");

当我运行代码时,我得到异常:

Caused by: java.lang.RuntimeException: Error while running command to get 
file permissions : java.io.IOException: (null) entry in command string: null ls -F C:UsersMeDesktopdemo1530699196271split_0.yuv
at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:762)
....
test.sparker4m.Sparker4mApplication.main(Sparker4mApplication.java:51)
...

我不知道为什么它使用"ls -F"。

所以我在 172.16.133.15 中用 samba 构建了一个 cifs 目录,并上传 direcotry "/usr/local/test/1530699196271"中的所有文件,并修改 "path" 变量,然后它抛出异常:

Caused by: org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: file:/usr/local/test/1530699196271
at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:321)
... 31 more

我很困惑"客户端模式"到底在做什么。


  1. 使用"火花提交"时,"集群模式"是否将jar文件上传到主服务器?

如果是真的,如果我运行我的代码,请在群集模式下使用"Spark-submit"(上传文件 到有两个工人的大师(172.16.133.15(它会工作吗?

与任何其他模式完全相同。它在每个节点(驱动程序节点和每个执行程序节点(上解析。

因此,如果使用本地路径,则每个执行程序将尝试在给定路径中读取其自己的文件系统上的本地文件。显然,您的 Ubuntu 节点上没有"file:///C:\Users\Me\Desktop\demo\1530699196271"- 因此失败是预期行为。

要么使用分布式文件系统,要么使用同构集群,在同一路径上的每个节点上复制输入(显然不适用于混合 Windows 和 Linux 节点(。

最新更新