0

我有 3 台机器:1x Master,4x CPU,8G RAM;2x 执行器,4x CPU 和 16G RAM。

master 是独立模式(无 YARN),我使用的是 pyspark。

即使它不是一个巨大的基础设施,我仍然希望它有一些性能。运行reduce操作时:

tfsent = tfsent.reduce(lambda x,y: Row(tf=spvecadd(x.tf, y.tf), sentiment=spvecadd(x.sentiment, y.sentiment)))

where tfsenthastfsentimentwhich are SparseVector, andspvecadd是要添加的自制函数SparseVector

这样做,在 3x 4CPU 上,只有一个在 executor 上运行 100%。其他都是0%,内存在5G/16G左右。我不明白: * 为什么这么长 * 为什么只有 1x CPU 工作。

我应该自己对数据进行分区吗?(我的意思是明确地在两个执行者上分发数据?即使在我看来那是 Spark 的工作)。

感谢您提供任何帮助、想法或提示 pltrdy

附加信息

  • 两个 executor 都连接到 master 并“分配”给任务(可以使用 spark web UI 检查它)

  • 我有大约 380k 线。两个向量维度都小于 100。(不是很多)。

  • 复杂性可能更依赖于维度而不是行数。

更新

事实证明,我必须使用repartition(8)才能使 RDD 分布式。这解决了我的问题,但不完全是我的问题:为什么我必须这样做?

我想这是因为我如何获取数据。我正在从数据库中读取,即

df = (sqlContext
        .read.format('jdbc')
        .options(url=c.url, dbtable='(%s) tmp '%initial_query, user=c.user, password=c.password)
        .load())

其中,我想存储而不分发它。

4

0 回答 0