我认为加载文本文件只能从群集中的worker /中完成(您只需要确保所有工作者都可以访问相同的路径,方法是在所有节点上提供该文本文件,或者使用一些共享文件夹映射到同一路径)
e.g。 spark-submit
/ spark-shell
可以从任何地方启动,并连接到火花主机,以及您启动spark-submit
/ spark-shell
的机器(这也是我们的驱动程序运行的地方,除非您处于“群集”部署模式),否则与群集无关。因此,任何数据加载只能由工作人员完成,而不是在驱动程序机器上完成,对吗?例如{em}驱动程序计算机上的文件sc.textFile("file:///somePath")
无法引发火花(同样,驱动程序在集群外部,例如在“客户端”部署模式/独立版本中)模式),对吧?
嗯,这也是我的想法......
我们的演员
第一幕 - 希望
当我从机器B启动一个火花炮弹来轰击B上的主人时,我得到了这个:
scala> sc.master
res3: String = spark://machinB:7077
scala> sc.textFile("/tmp/data/myfile.csv").count()
res4: Long = 976
第二幕 - 冲突
但是当我从机器A启动一个spark-shell,指向B上的spark master时,我得到了这个:
scala> sc.master
res2: String = spark://machineB:7077
scala> sc.textFile("/tmp/data/myfile.csv").count()
org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: file:/tmp/data/myfile.csv
确实机器A上不存在/tmp/data/myfile.csv
,但机器A不在群集上,它就是驱动程序运行的地方
第三幕 - 惊奇
甚至更奇怪的是,如果我在机器A上提供此文件,它不会再抛出此错误。 (相反,它创建了一个作业,但没有任务,只是由于超时而失败,这是另一个需要单独问题的问题)
Spark有什么方式可以解决我错过的问题吗?我认为连接到遥控器时火花壳,与你运行的机器无关。那么当我在机器A上提供该文件时,为什么错误会停止?这意味着sc.textFile的位置包括启动 spark-shell 或 spark-submit 的位置(在我的情况下也是驱动程序运行的位置)?这对我来说毫无意义。但同样,我愿意学习新事物。
结语
tl; dr - sc.textFile(“file:/ somePath”)在机器A上运行一个驱动程序到机器B,C,D上的一个集群......(驱动程序不是集群的一部分)
似乎它正在寻找路径文件:/ somePath 也在驱动程序上,是真的(还是仅仅是我)?那知道吗?这是设计的吗?
我有一种感觉,这是我的工作场所网络所特有的一些奇怪的网络/ VPN拓扑问题,但这仍然是我发生的事情,而且我完全不知道这只是我还是已知行为。 (或者我根本不知道Spark是如何工作的,这总是一种选择)
答案 0 :(得分:10)
所以真正的简短版本的答案是,如果您引用“file:// ...”,它应该可以在群集中的所有节点上访问,包括dirver程序。有时一些工作会发生在工人身上。一般来说,解决这个问题的方法就是不使用本地文件,而是使用S3,HDFS或其他网络文件系统。有 function myFunction() {
var $checkboxes = $("input[id*='check']");
for (i = 0; i <= $checkboxes.length; i++) {
if ($checkboxes.get(i).checked) {
var orderNo = i + 1;
var content= "Item " + orderNo + " Option " + orderNo + ": "+ $("#textbox"+ orderNo).val();
alert(content);
}
}
}
方法可用于将文件从驱动程序分发到所有其他节点(然后使用sc.addFile
来解析下载位置。)
答案 1 :(得分:0)
Spark可以在本地或在HDFS上查找文件。
如果您想使用sc.textFile()读取文件并利用其RDD格式,则该文件应位于HDFS上。如果您只是想以正常方式读取文件,那么它与您的操作相同(取决于API(Scala,Java,Python)。
如果您使用驱动程序提交本地文件,则addFile()会将文件分发到每个节点,SparkFiles.get()会将文件下载到本地临时文件。