2017-10-04 27 views
1

我想从hdfs路径中选择一个随机的文件样本。以下是代码片段,它将每个匹配通配符的文件编译并添加到我的RDD中。Spark作业无限期挂在rdd上takeSample

PATH_TO_RAW_DATA = "hdfs:/user/myname/documents/d*" 
tf = sc.binaryFiles(PATH_TO_RAW_DATA, 100000) 

这包含〜5000个文件和编译正确

我想选择一个随机子充裕上述RDD的,说100个文件。

特下面的代码是我用来做什么:

PATH_TO_RAW_DATA = "hdfs:/user/myname/documents/d*" 
tf = sc.binaryFiles(PATH_TO_RAW_DATA, 100000) 
tf = tf.takeSample(False, 100, seed = 1) 

按照docs,这应该给我一个RDD从原来的100个RDD文件。

我,然而,得到的错误:java.lang.OutOfMemoryError: Java heap space

这是Spark/Pyspark一个bug,或我错误地使用此功能?

回答

0

首先我会建议减少并行

 tf = sc.binaryFiles(PATH_TO_RAW_DATA, 100000) 

除非数据是非常巨大的,没有理由让百万分区的。分区太多会产生反效果。

增加驱动程序内存java.lang.OutOfMemoryError:Java堆空间发生的原因很可能是因为takeSample无法将100个项目传递给驱动程序。所以尝试增加驱动程序内存可以解决问题。 否则尝试取较少的样本,取10取代100,看看是否可行