Spark缓慢执行RDD.zip()和RDD.join()

时间:2015-03-13 17:47:32

标签: apache-spark

我正在尝试使用Apache Spark进行简单的情绪分类。我开始使用包含行号,目标(分数)和评论文本的文本文件:

  

lineNumber [;] 0 [;]这是一篇评论。

我分成两个RDD,如此

    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 + Zip,Join)在我的机器上花了很长时间,我开始使用6G驱动程序和6G执行程序内存。在一个相对较小的文件(330MB)上,两个每个小时需要1小时。 对于连接,spark ui告诉我它输入了427MB并且需要随机写入178.4MB。但是,我不确定这意味着什么。

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

1 个答案:

答案 0 :(得分:0)

的运行时间
join()

方法并不奇怪 - 因为它需要n ** 2次操作。现在zip()更难理解 - 但可能是由于内存限制。记忆方面存在相当大的开销。

您可以考虑将数据拆分为类似分区的细分,然后使用

foreachPartition()

但是再次 - 也考虑获得更多的记忆。首先:您可以减少驱动程序的内存并为工作人员提供更多内容:例如3GB和9 GB