我认为加载文本文件只能从群集中的工作者/群组中完成(您只需要确保所有工作人员都可以访问相同的路径,方法是在所有节点上提供该文本文件,或者使用映射到的某个共享文件夹相同的路径)
例如spark-submit/ spark-shell可以从任何地方启动,并连接到spark master,你启动的机器spark-submit/ spark-shell(除了你处于"集群"部署模式之外,它也是我们的驱动程序运行的地方)与集群无关.因此,任何数据加载只能由工人进行,而不是在驱动程序机器上进行,对吗?例如,应该没有办法sc.textFile("file:///somePath")导致在驱动程序机器上查找文件的火花(同样,驱动程序在集群外部,例如在"客户端"部署模式/独立模式下),对吧?
嗯,这也是我想的......
我们演员
第一幕 - 希望
当我从机器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-shell或spark-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用于解析下载位置).
| 归档时间: |
|
| 查看次数: |
2976 次 |
| 最近记录: |