Spark MLlib和Sprk GraphX

Spark MLlib

MLlib 是 Spark 可以扩展的机器学习库

MLlib is Apache Spark’s scalable machine learning library.

一、MLlib概述

MLlib 是 Spark 可以扩展的机器学习库

Spark在机器学习方面具有得天独厚的有事,有以下几个原因:

1、机器学习算法

一般都有多个步骤迭代计算,需要在多次迭代后,获得足够小的误差或者收敛才会停止

double wucha = 1.0
while(wucha>=0.00001){
    建模  wucha -= 某个值
}

模型计算完毕

当迭代使用Hadoop的MapReduce计算框架时,每次都要读写硬盘以及任务启动工作,导致很大的IO开销

而Spark基于内存的计算模型天生擅长迭代计算。只有在必要时,才会读写硬盘

所以Spark是机器学习比较理想的平台

2、通信

Hadoop的MapReduce计算框架,通过heartbeat方式来进行通信和传递数据,执行速度慢

spark 有高效的 Akka 和 Netty 的通信系统,通行效率高

Spark MLlib 是Spark 对常用的机器学习算法的实现库,同时包括相关测试和数据生成器

二、什么是机器学习

1、机器学习的定义

A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P,
if its performance at tasks in T, as measured by P, improves with experience E

三个关键词:算法、经验、模型评价

在数据的基础上,通过算法构建出模型,并进行评价
如果达到要求,则用该模型测试其他数据
如果不达到要求,要调整算法来重新建立模型,再次进行评估
循环往复,知道获得满意的经验

应用:金融反欺诈、语音识别、自然语言处理、翻译、模式识别、智能控制等等

2、基于大数据的机器学习

传统的机器学习算法,由于技术和单机存储的现值,只能在少量数据上使用
即,依赖于数据抽样
问题:很难做好随机,导致学习的模型不准确

在大数据上进行机器学习,直接处理全量数据并进行大量迭代计算

Spark本身计算优势,适合机器学习

另外 spark-shell pyspark 都可以提供及时查询工具

3、MLlib

MLlib是Spark机器学习库,简化机器学习的工程实践工作,方便扩展到更大规模
集成了通用的学习算法:分类、回归、聚类、协同过滤、降维等等

另外,MLlib本身在Spark中,数据清洗、SQL、建模放在一起

sample_linear_regression_data.txt
1 1:1.9
2 1:3.1
3 1:4
3.5 1:4.45
4 1:5.02
9 1:9.97
-2 1:-0.98

package day7

import org.apache.spark.sql.SparkSession
import org.apache.spark.ml.regression.LinearRegression

/*
 * 1.3850645873427236 1:0.14476184437006356 2:-0.11280617018445871 3:-0.4385084538142101 4:-0.5961619435136434 5:0.419554626795412 6:-0.5047767472761191 7:0.457180284958592 8:-0.9129360314541999 9:-0.6320022059786656 10:-0.44989608519659363
 * 
 */
object Demo1 {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("Demo1").master("local").getOrCreate()

    val data_path = "H:\\sample_linear_regression_data.txt"

    //读取训练数据
    val trainning = spark.read.format("libsvm").load(data_path)

    //定义模型
    val lr = new LinearRegression().setMaxIter(10000)

    //训练模型
    val lrModel = lr.fit(trainning)

    //获取模型训练结果
    val trainningSummary = lrModel.summary

    //获取预测值
    trainningSummary.predictions.show()

    //获取误差
    print(trainningSummary.rootMeanSquaredError)

    spark.stop()
  }
}

Spark Graphx

一、Spark Graphx 是什么?

1、是Spark 的一个模块,主要用于进行以图为核心的计算,还有分布式图计算

2、Graphx 底层基于RDD计算,和RDD共用一种存储形态。在展示形态上,可以用数据集来表示,也可以用图来表示

二、Spark GraphX 有哪些抽象?

1、顶点

RDD[(VertexId,VD)]表示
VertexId 代表了顶点的ID,是Long类型
VD 是顶点的属性,可以是任何类型

2、边

RDD[Edge[ED]]表示
Edge表示一个边
包含一个ED类型参数来设定属性
另外,边还包含了源顶点ID和目标顶点ID

3、三元组

三元组结构用RDD[EdgeTriplet[VD,ED]]表示
三元组包含一个边、边的属性、源顶点ID、源顶点属性、目标顶点ID、目标顶点属性

4、图

Graph表示,通过顶点和边来构建

package day7

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.graphx.Edge
import org.apache.spark.graphx.Graph

object Demo2 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("Demo2").setMaster("local")

    //创建Spark Context对象
    val sc = new SparkContext(conf)

    //定义点
    val users = sc.parallelize(Array((3L,("TIme","student")),(5L,("Andy","student")),
        (7L,("Mary","student")),(2L,("Lily","post"))))

    //定义边
    val relationship = sc.parallelize(Array(Edge(3L,7L,"col"),Edge(5L,3L,"ad"),Edge(2L,5L,"col"),Edge(5L,7L,"heh"))) 

    //构建图
    val graph = Graph(users, relationship)

    //图的操作
    val post_count = graph.vertices.filter{ case (id,(name,pos)) => pos=="post"}.count

    println("post count is " + post_count)

    val edges_count = graph.edges.filter(e => e.srcId > e.dstId).count()

    println("the value is " + edges_count)
  }
}
上一篇:.Net学习 第3季02 winform应用程序 MDI窗体设计 menuStrip


下一篇:「The Monthly Echo」十月社区成长回顾