Spark Example分析总结(一)

本文分析了Spark的几个示例,包括Pi迭代、KMeans聚类和逻辑回归。Pi迭代展示了如何将单机算法转化为Spark的并行计算;KMeans示例演示了Spark如何处理分布式聚类;逻辑回归展示了简单的MapReduce过程,适用于Spark的迭代计算。每个示例都探讨了如何利用Spark的分布式特性进行并行计算。
摘要由CSDN通过智能技术生成

 

目录

 

前言

(一)Pi Iteration

总结

(二)KMeans

Spark 例子中的本地实现 : 

KMeans的Spark 版本

总结

(三)逻辑回归 LR Logistic regression

Local 

SparkLR

SparkHdfsLR

Spark LR 总结

HdfsTest


 

 

 

前言

这段时间会做一系列 Spark 的Example 的分析,主要是对于官方提供的例子,对于RDD, Streaming,ML 等相关的例子进行分析,也包括对于平时使用 Spark 应用的场景进行约简之后的pattern。  想进行这次总结的原因是发现日常开发虽然经常用spark ,但是场景并不多, 对于 Spark 的使用 Pattern 没有一个完整全面的理解。 希望经过这些总结加深一些 Spark 使用层面的印象。

 

 

(一)Pi Iteration

https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/LocalPi.scala

 

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值

 

Spark 版本https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/SparkPi.scala

/** 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 例子中的本地实现 : 

https://github.com/apache/spark/blob/master/examples/src/m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值