Hadoop生态之 Spark, Pyspark

Spark

基于内存的迭代计算框架,适合实时统计分析的计算需求
在这里插入图片描述
Spark是一个类似于MapReduce的分布式计算框架,其核心是弹性分布式数据集,提供了比MapReduce更丰富的模型,可以快速在内存中对数据集进行多次迭代,以支持复杂的数据挖掘算法和图形计算算法

特点:
1.速度快
2.通用性
3.容错性

两类操作
在这里插入图片描述

安装

目前Apache Spark主要支持三种分布式部署方式:分别是standalone、Spark on mesos和spark on YARN,其中,第一种类似于MapReduce 1.0所采用的模式,内部实现了容错性和资源管理,后两种则是未来发展的趋势,部分容错性和资源管理交由统一的资源管理系统完成:让Spark运行在一个通用的资源管理系统之上,这样可以与其他计算框架,比如MapReduce共用一个集群资源,最大的好处是降低运维成本和提高资源利用率(资源按需分配)。

1.Spark运行模式概述

在实际应用中,Spark应用程序的运行模式取决于传递给SparkContext的MASTER环境变量的值,个别模式还需要依赖辅助的程序接口来配合使用,目前所支持的MASTER环境变量由特定的字符串或URL所组成,如下所示。

(1)Local[N]:本地模式,使用多个线程。

(2)Local cluster[worker, core, Memory]:伪分布式模式,可以配置所需要启动的虚拟工作节点的数量,以及每个工作节点所管理的CPU数量和内存尺寸。

(3)Spark://hostname:port:Standalone模式,需要部署Spark到相关节点,URL为Spark Master主机地址和端口。

(4)Mesos://hostname:port:Mesos模式,需要部署Spark和Mesos到相关节点,URL为Mesos主机地址和端口。

(5)YARN standalone/Yarn cluster:YARN模式一,主程序逻辑和任务都运行在YARN集群中。

(6)YARN client:YARN模式二,主程序逻辑运行在本地,具体任务运行在YARN集群中。

此外还有一些用于调试的URL,因为和应用无关,我们在这里就不列举了。

2.Local模式部署及程序运行

Local模式,顾名思义就是在本地运行,如果不加任何配置,Spark默认设置为Local模式。以SparkPi为例,Local模式下的应用程序的启动命令如下:

./bin/run-example org.apache.spark.examples.SparkPi local

在SparkPi代码的具体实现中,是根据用户传入的参数来选择运行模式的,如果需要自己在代码中指定运行模式,可以通过在代码中配置Master为Local来实现,如以下程序所示。

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

val conf = new SparkConf()

.setMaster(“local”)

.setAppName(“My application”)

.set(“spark.executor.memory”, “1g”)

val sc = new SparkContext(conf)

当然,为了使应用程序能够更灵活地在各种部署环境下使用,不建议把与运行环境相关的设置直接在代码中写死。

3.Local本地模式内部实现原理

Local本地模式使用LocalBackend配合TaskSchedulerImpl,内部逻辑结构如下图所示:

在这里插入图片描述
LocalBackend响应Scheduler的receiveOffers请求,根据可用的CPU核的设定值[N]直接生成CPU资源返回给Scheduler,并通过Executor类在线程池中依次启动和运行Scheduler返回的任务列表,其核心事件循环由内部类LocalActor以Akka Actor的消息处理形式来实现。

spark local 模式安装

spark 运行依赖于jdk和scala环境
现在已经安装好了jdk1.7
1.使用wget命令,下载所需的Spark安装包spark-1.6.0-bin-hadoop2.6.tgz以及Scala安装包scala2.10.4.tgz
此处建议使用scala-2.10.4版本。官网中指出,若使用scala2.11.x版本,需要重新编译Spark,并且编译时,需要指定Scala版本的类型。
关于Spark版本,没有严格要求。所以我们使用Spark1.6版本。
2.安装scala
切换目录到/data/spark1目录下,将scala-2.10.4.tgz解压缩到/apps目录下,并将解压后的目录名改为/apps/scala

cd /data/spark1/  
tar -xzvf /data/spark1/scala-2.10.4.tgz -C /apps/  
cd /apps  
mv /apps/scala-2.10.4/ /apps/scala  

使用vim打开用户环境变量~/.bashrc

vim ~/.bashrc 
#scala  
export SCALA_HOME=/apps/scala  
export PATH=$SCALA_HOME/bin:$PATH
source ~/.bashrc 

4.安装spark
切换目录到/data/spark1目录下,将spark的安装包spark-1.6.0-bin-hadoop2.6.tgz,解压缩到/apps目录下,并将解压后的目录名重命名为spark

cd /data/spark1  
tar -xzvf /data/spark1/spark-1.6.0-bin-hadoop2.6.tgz -C /apps/  
cd /apps/  
mv /apps/spark-1.6.0-bin-hadoop2.6/ /apps/spark  

vim ~/.bashrc  
#spark  
export SPARK_HOME=/apps/spark  
export PATH=$SPARK_HOME/bin:$PATH  
source ~/.bashrc

下面不需要对spark进行任何配置,就可以启动spark-shell进行任务处理了。

切换目录到/apps/spark/bin目录下,启动spark shell,验证安装完的spark是否可用。

执行

spark-shell local  

可以启动本地模式。
在这里插入图片描述

5.执行测试。在Spark Shell中,使用Scala加载Spark安装目录下,文件README.md,并转变为rdd。

val rdd = sc.textFile("/apps/spark/README.md")  

对rdd进行算子操作,统计文件的行数。

rdd.count()  

可以看到输出为:
res3: Long = 95

表明安装正确。
完整效果为:

scala> val rdd = sc.textFile("/apps/spark/README.md")  
rdd: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[1] at textFile at <console>:27  
    scala> rdd.count  
    res0: Long = 95  
    scala> 

到此Spark Local模式已经安装完成!

Pyspark

PySpark 是 Spark 为 Python 开发者提供的 API ,位于 $SPARK_HOME/bin 目录,其依赖于 Py4J。

大体用下面这张图来表示PySpark的实现机制:
在这里插入图片描述
在python driver端,SparkContext利用Py4J启动一个JVM并产生一个JavaSparkContext。Py4J只使用在driver端,用于本地python与java SparkContext objects的通信。大量数据的传输使用的是另一个机制。

RDD在python下的转换会被映射成java环境下PythonRDD。在远端worker机器上,PythonRDD对象启动一些子进程并通过pipes与这些子进程通信,以此send用户代码和数据。

下面我通过PySpark对真实的数据集进行处理,并作图形来分析。首先我需要介绍下数据集以及数据处理的环境。

MovieLens数据集是由Minnesota大学的GroupLens Research Project对电影评分网站(movielens.umn.edu)收集的,数据集包含了1997年9月19日到1998年4月22日间共七个月的数据。这些数据已经被处理过了(清除了那些评分次数少于20次以及信息没有填写完整的数据)

MovieLens数据集:

MovieLens数据集,用户对自己看过的电影进行评分,分值为1~5。MovieLens包括两个不同大小的库,适用于不同规模的算法.小规模的库是943个独立用户对1682部电影作的10000次评分的数据(我是用这个小规模作数据处理和分析);通过对数据集分析,为用户预测他对其他未观看的电影的打分,将预测分值高的电影推荐给用户,认为这些电影是用户下一步感兴趣的电影。

数据集结构:

1.943个用户对1682场电影评分,评判次数为100000次,评分标准:1~5分。

2.每位用户至少评判20场电影。

3.简单地统计了用户的一些信息 (age, gender, occupation, zip)

Spark Streaming框架实现WordCount

Spark Streaming是一种构建在Spark上的实时计算框架,它扩展了Spark处理大规模流式数据的能力。

1.Spark Streaming的优势

(1)能运行在100个以上的结点上,并达到秒级延迟;

(2)使用基于内存的Spark作为执行引擎,具有高效和容错的特性;

(3)能集成Spark的批处理和交互查询;

(4)为实现复杂的算法提供了与批处理类似的简单接口。
2.基于Spark on Yarn的Spark Streaming总体架构如下图所示:
在这里插入图片描述
Spark on Yarn启动后,由Spark AppMaster把Receiver作为一个Task提交给某一个Spark Executor;Receive启动后输入数据,生成数据块,然后通知Spark AppMaster;Spark AppMaster会根据数据块生成相应的Job,并把Job的Task提交给空闲Spark Executor 执行。图中粗箭头显示被处理的数据流,输入数据流可以是磁盘、网络和HDFS等,输出可以是HDFS,数据库等。

3.Spark Streaming的基本原理

将输入数据流以时间片(秒级)为单位进行拆分,然后以类似批处理的方式处理每个时间片数据,其基本原理如下图所示。
在这里插入图片描述
首先,Spark Streaming把实时输入数据流以时间片Δt (如1秒)为单位切分成块。Spark Streaming会把每块数据作为一个RDD,并使用RDD操作处理每一小块数据。每个块都会生成一个Spark Job处理,最终结果也返回多块。

4.Spark Streaming内部实现原理

使用Spark Streaming编写的程序与编写Spark程序非常相似,在Spark程序中,主要通过操作RDD(Resilient Distributed Datasets弹性分布式数据集)提供的接口,如map、reduce、filter等,实现数据的批处理。而在Spark Streaming中,则通过操作DStream(表示数据流的RDD序列)提供的接口,这些接口和RDD提供的接口类似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值