我在spark scala中有一个很大的rdd,其中每个元素都是来自数组的数组。
val rdd = sc.parallelize[array1[array1_1[], array1_2[], ....array1_24]], .... , array240[array240_1[], array240_2[], ....array240_24]]
所有元素都不同,我应该对每个元素应用k-means算法。
但是,Spark中的k-means仅适用于RDD,而不适用于数组。
所以,我接下来做
for (i <= 0 to 240) {
val rdd = sc.parallelize[array1[array1_1[], array1_2[], ....array1_24]]]
但它太慢了......
我有来自5个大节点的集群,他们可以做更多......
如果没有for循环,我如何解决我的问题?
答案 0 :(得分:3)
看起来你在这里遇到了严重的设计问题。
如果每个阵列都小到足以在单个分区上本地有效处理,那么使用Spark MLlib就无法获得任何好处。只需使用您最喜欢的未分发的机器学习库,就可以单独训练每个项目的K-means。对于大型集群和小型数据,Spark将花费大部分时间来传递消息。
如果不是这种情况,那么使用数组来存储这样的数据并不合理。每个样本都应该是一个单独的RDD,或者这些样本可以组合在一起但是用标签展平。
根据您的描述,这似乎是第一种情况。如果出于所有原因你想要使用MLLib,那么尝试显着降低每个RDD的并行性,并根据调度程序单独构建你的工作来完成剩下的工作。