目录
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)
}
}
运行结果如下: