2015-03-13 28 views
0

我试图使用Apache Spark进行简单的情感分类。我开始使用包含行号,目标(分数)和评论文字的文本文件:Spark执行RDD.zip()和RDD.join()缓慢

lineNumber [;] 0 [;]这是一篇综述。

我两个RDDS分裂像这样

scores = lines.map(lambda line: (line.split("[;]")[0], line.split("[;]")[1])) 
    reviews = lines.map(lambda line: (line.split("[;]")[0], line.split("[;]")[2])) 

我真的就审查RDD执行某些操作(如文字分裂,移除停止字等),然后尝试建立TFIDF :

hash = HashingTF().transform(reviews.values()) 
    idf = IDF().fit(hash) 
    tfidf = idf.transform(hash) 
    f = reviews.keys().zip(tfidf) 

之后,我想加入包含TFIDF与评分的评论和分类。

reviewsAndScores = scores.join(f).values() 

然而,两者的上述操作(TFIDF +邮编,加入)把我的机器上相当长的时间,我开始与6G司机和6G内存执行人。在一个相对较小的文件(330MB)上,两个taks都需要1个小时。 对于连接,spark ui告诉我它获得了427MB的输入,并且需要洗牌写入178.4MB。但是,我不确定这意味着什么。

你有什么提示,为什么这些操作如此缓慢?

回答

0

运行时间为

join() 

方法并不奇怪 - 给它需要n ** 2点的操作。现在zip()很难理解 - 但可能由于内存限制。记忆方面有一定的开销。

你可能会考虑将数据分割成像,分区段,然后再次使用

foreachPartition() 

但是 - 也考虑让更多的内存。首先:您可以减少驱动程序的内存,并为员工提供更多内容:例如3GB和9 GB