spark在哪里查找文本文件?

时间:2015-09-08 18:34:09

标签: apache-spark

我认为加载文本文件只能从群集中的worker /中完成(您只需要确保所有工作者都可以访问相同的路径,方法是在所有节点上提供该文本文件,或者使用一些共享文件夹映射到同一路径)

e.g。 spark-submit / spark-shell可以从任何地方启动,并连接到火花主机,以及您启动spark-submit / spark-shell的机器(这也是我们的驱动程序运行的地方,除非您处于“群集”部署模式),否则与群集无关。因此,任何数据加载只能由工作人员完成,而不是在驱动程序机器上完成,对吗?例如{em}驱动程序计算机上的文件sc.textFile("file:///somePath")无法引发火花(同样,驱动程序在集群外部,例如在“客户端”部署模式/独立版本中)模式),对吧?

嗯,这也是我的想法......

我们的演员

  • 机器A:驱动程序运行的地方
  • 机器B:两个火花主人和一个工人都在运行

第一幕 - 希望

当我从机器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是如何工作的,这总是一种选择)

2 个答案:

答案 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()会将文件下载到本地临时文件。