Spark机器学习(三)-Spark基础知识

目录

Spark基础知识

Spark是什么?

Spark支持哪些开发语言?

Spark运行模式

SparkContext

RDD


Spark基础知识

这本书主要是讲Spark的机器学习内容,Spark的基础知识,讲得比较简单。如果大家需要更深入学习Spark,可以找Spark相关书籍再详细研究。这里我简单总结一下一些关键知识点。

Spark是什么?

官网(https://spark.apache.org/)描述:

Apache Spar is a unified analytics engine for large-scale data processing.

Apache Spark是一个开源集群运算框架,最初是由加州大学柏克莱分校AMPLab所开发。相对于Hadoop的MapReduce会在运行完工作后将中介资料存放到磁盘中,Spark使用了存储器内运算技术,能在资料尚未写入硬盘时即在存储器内分析运算。Spark在存储器内运行程序的运算速度能做到比Hadoop MapReduce的运算速度快上100倍,即便是运行程序于硬盘时,Spark也能快上10倍速度。Spark允许用户将资料加载至集群存储器,并多次对其进行查询,非常适合用于机器学习算法。

使用Spark需要搭配集群管理员和分布式存储系统。Spark支持独立模式(本地Spark集群)、Hadoop YARN或Apache Mesos的集群管理。在分布式存储方面,Spark可以和 Alluxio, HDFS、 Cassandra、OpenStack Swift和Amazon S3等接口搭载。 Spark也支持伪分布式(pseudo-distributed)本地模式,不过通常只用于开发或测试时以本机文件系统取代分布式存储系统。在这样的情况下,Spark仅在一台机器上使用每个CPU核心运行程序。

Spark支持哪些开发语言?

目前Spark支持Scala,Java,Python三种编程语言。那我们如何选择?

我的建议是:如果项目是独立出来的,我建议用Scala来完成。如果还涉及其它编程语言项目的集成,例如Java项目、Python项目,就和它们对应即可。

Spark运行模式

Spark支持以下几种运行模式:

  • 本地单机模式

  • 集群单机模式

  • 基于Mesos

  • 基于YARN

注:在本地模式的时候,local[N]的N表示要使用的线程数目。

SparkContext

Spark程序的入口是从SparkContext开始,SparkContext初始化时需要一个SparkConf对象,通过SparkConf来配置运行参数。因此,Spark程序初始化代码大致如下:

 

package com.ispeasant

import org.apache.spark.{SparkConf, SparkContext}

object SparkContextTest {
  def main(args: Array[String]): Unit = {
    // 创建一个SparkConf对象
    val conf = new SparkConf()
    // 配置相应的参数,如应用名称、运行模式
    conf.setAppName("SparkContextTest")
      .setMaster("local[2]")

    // 创建SparkContext
    val sparkContext = new SparkContext(conf)

    // 打印看看是否创建成功
    println("sparkContext:==" + sparkContext)
  }
}

 

可以看看运行后的结果:

除了这种方式外,我们还有另外一种方式来创建SparkContext。我们可以看看SparkContext这个类的构造函数。

从上面截图可以看出,我们可以直接采取默认参数来构建,如下:

 

package com.ispeasant

import org.apache.spark.{SparkConf, SparkContext}

object SparkContextTest2 {
  def main(args: Array[String]): Unit = {
    // 创建SparkContext
    val sparkContext = new SparkContext("local[2]","SparkContextTest2")

    // 打印看看是否创建成功
    println("sparkContext:==" + sparkContext)
  }
}

 

我们看看运行结果:

因此,两种创建方式都是可以的,但我个人比较偏向于第一种,在实际开发中,我们经常配置多种参数,第二种未必能满足。

RDD

RDD,弹性分布式数据集(Resilient Distributed Dataset,RDD)是 Spark 中的核心概念。我觉得RDD的最重要的一个特性是容错性,可以这样理解,RDD是分布在集群的节点上,以函数式操作集合的方式进行各种并行操作,同时,当某个节点或者任务失败时,RDD会在余下的节点上自动重建,以便任务能最终完成。

RDD的操作分为转换(transformation)和执行(action)两种。(注,面试的时候,经常会考这个问题,大家可以深入研究一下。)

那我们写一个RDD的例子看看。

 

package com.ispeasant

import org.apache.spark.{SparkConf, SparkContext}

object TestRDD {
  def main(args: Array[String]): Unit = {
    // 创建一个SparkConf对象
    val conf = new SparkConf()
    // 配置相应的参数,如应用名称、运行模式
    conf.setAppName("SparkContextTest")
      .setMaster("local[2]")

    // 创建SparkContext
    val sparkContext = new SparkContext(conf)
    val data = Array(1, 2, 3, 4, 5)
    val distData = sparkContext.parallelize(data)
    println("distData=====" + distData)
    val cout = distData.count()
    println("cout====" + cout)
  }
}

 

运行结果如下:

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页