我有 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 tfsent
hastf
和sentiment
which 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())
其中,我想存储而不分发它。