spark在哪里寻找文本文件?

Era*_*dan 11 apache-spark

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

例如spark-submit/ spark-shell可以从任何地方启动,并连接到spark master,你启动的机器spark-submit/ spark-shell(除了你处于"集群"部署模式之外,它也是我们的驱动程序运行的地方)与集群无关.因此,任何数据加载只能由工人进行,而不是在驱动程序机器上进行,对吗?例如,应该没有办法sc.textFile("file:///somePath")导致在驱动程序机器上查找文件的火花(同样,驱动程序在集群外部,例如在"客户端"部署模式/独立模式下),对吧?

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

我们演员

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

第一幕 - 希望

当我从机器B启动一个spark-shell来激发BI上的主人得到这个:

scala> sc.master
res3: String = spark://machinB:7077

scala> sc.textFile("/tmp/data/myfile.csv").count()
res4: Long = 976
Run Code Online (Sandbox Code Playgroud)

第二幕 - 冲突

但是当我从机器A启动一个spark-shell时,指向BI上的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
Run Code Online (Sandbox Code Playgroud)

确实/tmp/data/myfile.csv在机器A上不存在,但是机器A不在集群上,它只是驱动程序运行的地方

第三幕 - 惊奇

甚至更奇怪的是,如果我在机器A上提供此文件,它不会再抛出此错误.(相反,它创建了一个作业,但没有任务,只是由于超时而失败,这是另一个值得单独提问的问题)

Spark有什么方式可以解决我错过的问题吗?我认为连接到遥控器时火花壳,与你运行的机器无关.那么当我在机器A上提供该文件时,为什么错误会停止?这意味着sc.textFile的位置包括启动spark-shellspark-submit的位置(在我的情况下也是驱动程序运行的位置)?这对我来说毫无意义.但同样,我愿意学习新事物.

结语

tl; dr - sc.textFile("file:/ somePath")在机器A上运行一个驱动程序到机器B,C,D上的一个集群...(驱动程序不是集群的一部分)

看起来它正在寻找路径文件:/ somePath也在驱动程序上,是真的(还是仅仅是我)?那知道吗?这是设计的吗?

我有一种感觉,这是我的工作场所网络所特有的一些奇怪的网络/ VPN拓扑问题,但这仍然是我发生的事情,而且我完全混淆它是仅仅是我还是已知的行为.(或者我根本没有得到Spark如何工作,这总是一个选项)

Hol*_*den 11

所以答案的真正简短版本是,如果您引用"file:// ...",它应该可以在群集中的所有节点上访问,包括dirver程序.有时一些工作会发生在工人身上.一般来说,解决这个问题的方法就是不使用本地文件,而是使用S3,HDFS或其他网络文件系统.有一种sc.addFile方法可用于将文件从驱动程序分发到所有其他节点(然后SparkFiles.get用于解析下载位置).

  • 是的,我知道这有点奇怪,本地fs访问在Spark中有点时髦.我不确定它是否记录在任何地方,但我会看看,如果它不在文档中我会添加它. (2认同)