2016-07-06 24 views
3

我在运行读取文件的spark java程序时遇到了一些问题,请执行一些操作,然后在给定路径上生成输出文件。 当主机和从机在同一台机器上时,每件事情都可以正常工作.ie:在独立群集模式下。 但是当我在多机多节点集群设置中部署相同的程序时,问题就开始了。这意味着主人在x.x.x.102上运行,从属人员在x.x.x.104上运行。 两个master-slala都共享了它们的SSH密钥,并且可以互相访问。输出文件在apache火花的slave机器上生成

最初从属无法读取输入文件,因为我知道我需要在sc.textFile()之前拨打sc.addFile()。解决了问题。但是现在我看到在输出路径下的_temporary文件夹中的从属机器上正在生成输出。即:/tmp/emi/_temporary/0/task-xxxx/part-00000 在本地集群模式下,它工作正常,并在/tmp/emi/part-00000中生成输出文件。

我开始知道我需要使用SparkFiles.get()。但我无法了解如何以及在何处使用此方法。

到现在我使用

DataFrame dataobj = ... 
dataObj.javaRDD().coalesce(1).saveAsTextFile("file:/tmp/emi"); 

任何一个可以请让我知道如何调用SparkFiles.get()

总之,我该如何告诉slave在驱动程序运行的机器上创建输出文件?

请帮忙。

非常感谢。

+0

总之,我想知道,在多机多节点群集环境中如何告诉从机将输出文件保存在驱动程序机器中? – summary

回答

1

这里没有什么意外的。每个工作人员分别编写自己的部分数据。使用file方案仅意味着数据是从工作者的角度来看作为本地文件系统中的文件的写入器。

关于SparkFiles它不适用于这种特殊情况。 SparkFiles可用于将通用文件分发给工作机器而不处理结果。

如果要执行某些原因,用于运行驱动程序代码在计算机上写你必须把数据先取到驱动机(无论是collect这需要足够的内存来满足所有数据或toLocalIterator这在收集分区时间并且需要多个作业)和use standard tools将结果写入本地文件系统。一般来说,写驱动程序并不是一个好习惯,大部分时间都是无用的。

+0

谢谢零。如果我需要使用标准方法来收集()然后将其存入数组,然后将其保存为简单的java程序文件,那么我是否会放弃使用spark的动机?我的意思是说,我会打败在apache火花已知的内存计算中使用的优势。有没有更好的方法来做到这一点?因为输出文件将来会很大。 – summary

+0

因为在驱动程序上写这是一个非常糟糕的主意,在实践中通常是无用的。与'.coalese(1)'相同。你可以使用'toLocalIterator'而不是文字'collect',但它要贵得多。 – zero323

+0

嗨零,现在我不使用saveAsTextFile。但是现在它在collect()处发出内存错误GC开销。 列表 mrow = errors.javaRDD()。coalesce(1)。搜集(); JavaRDD data = sc.parallelize(mrow,100); 尝试{为每个数据行打印} 我没有得到任何正确的文档parallize,除了它分割成片。这是否意味着数据是每行100个记录的大块数据。 任何指针?非常感谢 。 – summary

相关问题