【问题标题】:How do I run RDD operations after a groupby in Spark?如何在 Spark 中的 groupby 之后运行 RDD 操作?
【发布时间】:2016-09-04 15:08:34
【问题描述】:

我有大量数据要对其执行聚类。问题是,我不希望对整个集合进行一个聚类,而是对每个用户进行一个聚类。基本上我会先做一个 groupby 用户 ID,然后运行 ​​KMeans。

问题是,一旦您执行 groupby,任何映射都会在 spark 控制器上下文之外,因此任何创建 RDD 的尝试都会失败。在 mllib 中 Spark 的 KMeans 库需要一个 RDD(因此它可以并行化)。

我看到了两种解决方法,但我希望有更好的解决方案。

1) 手动遍历控制器中的所有数千个用户(当事情变大时可能是数百万个),并为每个用户运行 kmeans。

2) 在控制器中进行 groupby,然后在 map 中运行由外部库提供的非并行 kmeans。

请告诉我还有另一种方法,我宁愿拥有一切 ||尽可能。

【问题讨论】:

    标签: apache-spark pyspark bigdata


    【解决方案1】:

    编辑:在回复时我不知道是pyspark。但是,我将把它留作一个可以改编的想法

    我遇到了类似的问题,并且能够提高性能,但这对我来说仍然不是理想的解决方案。也许对你来说它可以工作。

    这个想法是将 RDD 分解为许多较小的 RDD(每个用户 id 一个新的 RDD),将它们保存到一个数组中,然后为每个“子 RDD”调用处理函数(在您的情况下为集群)。建议的代码如下(cmets 中的解释):

    // A case class just to use as example
    case class MyClass(userId: Long, value: Long, ...)
    
    // A Scala local array with the user IDs (Could be another iterator, such as List or Array):
    val userList: Seq[Long] = rdd.map{ _.userId }.distinct.collect.toSeq  // Just a suggestion!
    
    // Now we can create the new rdds:
    val rddsList: Seq[RDD[MyClass]] = userList.map { 
      userId => rdd.filter({ item: MyClass => item.userId == userId }) 
    }.toSeq
    
    // Finally, we call the function we want for each RDD, saving the results in a new list. 
    // Note the ".par" call, which is used to start the expensive execution for multiple RDDs at the same time
    val results = rddsList.par.map {
      r => myFunction(r)
    }
    

    我知道这与您的第一个选项大致相同,但是通过使用 .par 调用,我能够提高性能。

    此调用将rddsList 对象转换为ParSeq 对象。这个新的 Scala 对象允许并行计算,因此,理想情况下,map 函数将同时为多个 RDD 调用 myFunction(r),这样可以提高性能。

    更多并行集合详情请查看Scala Documentation

    【讨论】:

    • userList 的类型是什么?大批?我正在尝试找到“par”方法
    • userList 是一个 Scala 本地迭代器(数组、列表、序列...)
    • 嗯,par 也是 Spark api 的一部分吗?它是如何附加到原生 Scala 类型的?我在文档中能找到的最接近的东西是 var rdd = sc.parallelize(data);这与您在这里所说的不同。你能指出一个关于这个的文档页面吗?
    • 我将链接添加到响应中。 par 是一种 Scala 方法,可用于主要的 Scala 集合。在我的示例中,我将其称为 RDD 数组,通过多次过滤主 RDD 创建。
    • 我可以通过使用这个 API 在 pyspark 中做一个类似的版本:docs.python.org/3.5/library/concurrent.futures.html to ||我的地图
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多