Spark机器学习

Spark机器学习

注:http://blog.csdn.net/u013719780/article/details/51768381

 

Spark python简介

Spark简介

Spark是一个分布式计算框架,旨在简化运行于计算集群上的并行程序的编写。该框架对资源调度,任务的提交/执行和跟踪,节点间的通信以及数据并行处理的内在底层操作都进行了抽象。它提供了一个更高级别的API用于处理分布式数据。

Spark支持的四种运行模式:

本地单机模式:所有Spark进程都运行在同一个JVM中。

集群单机模式:使用spark自己内置的任务调度框架。

基于Mesos:Mesos是一个流行的开源集群计算框架。

基于YARN:与Hadoop关联的集群计算和资源调度框架。

Spark Python安装

1、 下载配置 hadopp、spark(bin\sbin)的环境变量

2、 在cmd模式下运行pyspark命令,验证是否安装成功

3、 将spark安装包下的pyhon/pyspark包拷贝到python安装包下的lib/site-packages下

Spark编程模式

SparkContext类与SparkConf类

SparkConf类:包含了Spark集群配置的各种参数(比如主节点的URL)

SparkContext类:可用SparkContext对象所包含的各种方法来建和操作分布式数据集和共享变量。

例如scala代码:

val conf = new SparkConf().setAppName("Test Spark App").setMaster("local[4]")

val sc = new SparkContext(conf)

这段代码会创建一个4线程的SparkContext对象,并将其相应的任务命名为Test SparkAPP。我们也可通过如下方式调SparkContext的简单构造函数,以默认的参数值来创建相应的对象。其效果和上述的完全相同:
val sc = new SparkContext("local[4]", "Test Spark App")

Spark shell

Spark支持用Scala或Python REPL(Read-Eval-Print-Loop,即交互式shell)来进行交互式的程序编写。由于输入的代码会被立即计算,shell能在输入代码时给出实时反馈。

通过Scala来使用Spark shell,只需从Spark的主目录执行./bin/spark-shell。命令执行结果的值与类型在代码执行完后也会显示出来。

在Python shell中使用Spark,直接运行./bin/pyspark命令即可,如果配置了pyspark的环境变量,则直接运行pyspark命令即可。

启动Scala shell/Python shell并初始化一个SparkContext对象。我们可以通过sc这个Scala值来调用这个对象。

弹性分布式数据集RDD

RDD(Resilient Distributed Dataset,弹性分布式数据集)是Spark的核心概念之一。一个RDD代表一系列的“记录”(严格来说,某种类型的对象)。这些记录被分配或分区到一个集群的多个节点上(在本地模式下,可以类似地理解为单个进程里的多个线程上)。Spark中的RDD具备容错性,即当某个节点或任务失败时(因非用户代码错误的原因而引起,如硬件故障、网络不通等),RDD会在余下的节点上自动重建,以便任务能最终完成。

RDD也可以基于Hadoop的输入源创建,比如本地文件系统、HDFS和Amazon S3。基于Hadoop的RDD可以使用任何实现了Hadoop InputFormat接口的输入格式,包括文本文件、其他Hadoop标准格式、Hbase、Cassandra等。

创建RDD:

集合创建

collection = list(["a", "b", "c", "d", "e"])
rddFromCollection = sc.parallelize(collection)

用一个本地文件系统里的文件创建RDD:

rddFromTextFile = sc.textFile("LICENSE")

Spark操作:

创建RDD后,便有了一个可供操作的分布式记录集。在Spark编程模式下,所有的操作分为两种:

1、 转换操作(最常用的转换操作便是map操作):对一个数据集里的所有记录执行某种函数,从而使记录发生改变。

2、 执行:运行某些计算或聚合操作,并将结果返回运行SparkContext的那个驱动程序。

Map操作:对一个RDD里的每一条记录都执行某个函数,从而将输入映射成为新的输出。例如:将每一个字符串都转换为一个整数,从而返回一个由若干Int构成的RDD对象。
intsFromStringsRDD = rddFromTextFile.map(lambda line: line.size)

 

RDD缓存策略

调用RDD的cache函数把数据缓存在集群的内存里。例如:rddFromTextFile.cache

调用一个RDD的cache函数将会告诉Spark将这个RDD缓存在内存中。在RDD首次调用一个执行操作时,这个操作对应的计算会立即执行,数据会从数据源里读出并保存到内存。因此,首次调用cache函数所需要的时间会部分取决于Spark从输入源读取数据所需要的时间。但是,当下一次访问该数据集的时候,数据可以直接从内存中读出从而减少低效的I/O操作,加快计算。多数情况下,这会取得数倍的速度提升。

Spark的另一个核心功能是能创建两种特殊类型的变量:广播变量和累加器。

1、 广播变量(broadcast variable)为只读变量,它由运行SparkContext的驱动程序创建后发送给会参与计算的节点。对那些需要让各工作节点高效地访问相同数据的应用场景,比如机器学习,这非常有用。例如:broadcastAList = sc.broadcast(list(["a", "b", "c", "d", "e"]))//创建广播变量

  广播变量也可以被非驱动程序所在的节点(即工作节点)访问,访问的方法是调用该变量的value方法:

sc.parallelize(list(["1", "2", "3"])).map(lambda x: broadcastAList.value).collect()

2、 累加器(accumulator)也是一种被广播到工作节点的变量。累加器与广播变量的关键不同,是后者只能读取而前者却可累加。但支持的累加操作有一定的限制。具体来说,这种累加必须是一种有关联的操作,即它得能保证在全局范围内累加起来的值能被正确地并行计算以及返回驱动程序。每一个工作节点只能访问和操作其自己本地的累加器,全局累加器则只允许驱动程序访问。累加器同样可以在Spark代码中通过value访问。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章