目录
(三)逻辑回归 LR Logistic regression
前言
这段时间会做一系列 Spark 的Example 的分析,主要是对于官方提供的例子,对于RDD, Streaming,ML 等相关的例子进行分析,也包括对于平时使用 Spark 应用的场景进行约简之后的pattern。 想进行这次总结的原因是发现日常开发虽然经常用spark ,但是场景并不多, 对于 Spark 的使用 Pattern 没有一个完整全面的理解。 希望经过这些总结加深一些 Spark 使用层面的印象。
(一)Pi Iteration
var count = 0
for (i <- 1 to 100000) {
val x = random * 2 - 1
val y = random * 2 - 1
if (x*x + y*y <= 1) count += 1
}
println(s"Pi is roughly ${4 * count / 100000.0}")
单机版算法是一个迭代算法, 通过每一次循环迭代 count值, 来估计Pi值
/** Computes an approximation to pi */
object SparkPi {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder
.appName("Spark Pi")
.getOrCreate()
val slices = if (args.length > 0) args(0).toInt else 2
val n = math.min(100000L * slices, Int.MaxValue).toInt // avoid overflow
val count = spark.sparkContext.parallelize(1 until n, slices).map { i =>
val x = random * 2 - 1
val y = random * 2 - 1
if (x*x + y*y <= 1) 1 else 0
}.reduce(_ + _)
println(s"Pi is roughly ${4.0 * count / (n - 1)}")
spark.stop()
}
}
通过Spark 的RDD, 原来单机中内存变量 i 的100000次迭代,转化成 RDD , RDD 的map转换 每次处理一个 i 值, 将单机版本中的count 累加改成 reduce ,得到单机版本同样的count 结果,在 Driver 中计算最终的Pi值。
这个Pi的例子,关键点是将单机算法中的循环变量编程 RDD ,表示迭代次数,然后迭代之间可以并行计算,最后使用累积的值 0 或 1 , 累计成count 。
总结
这个例子其实并没有太多用到RDD的特性,只是对于计算Pi的这个算法,计算是能够并形成多个任务,然后通过reduce 来聚合计算需要的值。好处就是能利用分布式特点,利用多个机器并行计算,而local 版本只能窜行。
但其实通过把计算count 放到多核上计算也是可以的,例如JDK中 CyclicBarrior 并发控制,通过线程的方式共享count,最后计算是计算partial count 的进程全部完成再计算 Pi = 4.0 * count / (n - 1)} ,这样就不需要构造RDD中的数据
(二)KMeans
kmeans 是经典的聚类算法, 对于向量数组 data Array[DenseVector[Double]] , 计算 K = 10 个聚类, convergeDist = 0.001 。

本文分析了Spark的几个示例,包括Pi迭代、KMeans聚类和逻辑回归。Pi迭代展示了如何将单机算法转化为Spark的并行计算;KMeans示例演示了Spark如何处理分布式聚类;逻辑回归展示了简单的MapReduce过程,适用于Spark的迭代计算。每个示例都探讨了如何利用Spark的分布式特性进行并行计算。
最低0.47元/天 解锁文章
1764

被折叠的 条评论
为什么被折叠?



