Spark入门梳理1
文章目录
一、Spark设计与原理
1.1 Spark简介
Spark最初由美国加州伯克利大学(UCBerkeley)的AMP(Algorithms, Machines and People)实验室于2009年开发,是基于内存计算的大数据并行计算框架,可用于构建大型的、低延迟的数据分析应用程序。
目前以被公认为开源中大数据处理平台的领先者
1.2 Spark生态系统
上图为 BDAS架构 ,从图中可以观察到,spark关注与数据层面的处理,而数据的存储还是要借助于Hadoop分布式文件系统HDFS、Amazon S3等来实现的。所以spark很好的与hadoop系统兼容
Spark的生态系统主要包含了Spark Core、Spark SQL、Spark Streaming、MLLib和GraphX 等组件,各个组件的具体功能如下:
- Spark Core:Spark Core包含Spark的基本功能,如内存计算、任务调度、部署模式、故障恢复、存储管理等。Spark建立在统一的抽象RDD之上,使其可以以基本一致的方式应对不同的大数据处理场景;通常所说的Apache Spark,就是指Spark Core;
- Spark SQL:Spark SQL允许开发人员直接处理RDD,同时也可查询Hive、HBase等外部数据源。Spark SQL的一个重要特点是其能够统一处理关系表和RDD,使得开发人员可以轻松地使用SQL命令进行查询,并进行更复杂的数据分析;
- Spark Streaming:Spark Streaming支持高吞吐量、可容错处理的实时流数据处理,其核心思路是将流式计算分解成一系列短小的批处理作业。Spark Streaming支持多种数据输入源,如Kafka、Flume和TCP套接字等;
- MLlib(机器学习):MLlib提供了常用机器学习算法的实现,包括聚类、分类、回归、协同过滤等,降低了机器学习的门槛,开发人员只要具备一定的理论知识就能进行机器学习的工作;
- GraphX(图计算):GraphX是Spark中用于图计算的API,可认为是Pregel在Spark上的重写及优化,Graphx性能良好,拥有丰富的功能和运算符,能在海量数据上自如地运行复杂的图算法。
1.3 Spark运行架构
1.3.1 基本概念
在具体讲解Spark运行架构之前,需要先了解几个重要的概念:
- RDD:是弹性分布式数据集(Resilient Distributed Dataset)的简称,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型;
- DAG:是Directed Acyclic Graph(有向无环图)的简称,反映RDD之间的依赖关系;
- Executor:是运行在工作节点(Worker Node)上的一个进程,负责运行任务,并为应用程序存储数据;
- 应用:用户编写的Spark应用程序;
- 任务:运行在Executor上的工作单元;
- 作业:一个作业包含多个RDD及作用于相应RDD上的各种操作;
- 阶段:是作业的基本调度单位,一个作业会分为多组任务,每组任务被称为“阶段”,或者也被称为“任务集”。
1.3.2 架构设计
如下图所示,Spark运行架构包括集群资源管理器(Cluster Manager)、运行作业任务的工作节点(Worker Node)、每个应用的任务控制节点(Driver)和每个工作节点上负责具体任务的执行进程(Executor)。其中,集群资源管理器可以是Spark自带的资源管理器,也可以是YARN或Mesos等资源管理框架。
如下图所示,在Spark中,一个应用(Application)由一个任务控制节点(Driver)和若干个作业(Job)构成,一个作业由多个阶段(Stage)构成,一个阶段由多个任务(Task)组成。当执行一个应用时,任务控制节点会向集群管理器(Cluster Manager)申请资源,启动Executor,并向Executor发送应用程序代码和文件,然后在Executor上执行任务,运行结束后,执行结果会返回给任务控制节点,或者写到HDFS或者其他数据库中。
1.4 RDD的设计与运行原理
1.4.1 RDD概念
RDD(Resilient Distributed Datasets),弹性分布式数据集,是分布式内存的一个抽象概念,RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,只能通过在其他RDD执行确定的转换操作(如map、join和group by)而创建,然而这些限制使得实现容错的开销很低。
Spark的核心是建立在统一的抽象RDD之上,使得Spark的各个组件可以无缝进行集成,在同一个应用程序中完成大数据计算任务。
简述:用Python的语言来描述,我把RDD看成是一个object,我们读取文件,文件计算,结果集获取都是RDD,不同的数据结构、数据之间的关系,甚至python中字典类型的数据也就是数据库中的key-value的map数据,都可以看成是一个RDD,它的关键在于它是一个分布式对象集合
了解原理请参考 参考链接
1.5 Spark的部署模式
Spark支持的三种经典集群部署方式,即standalone、Spark on Mesos和Spark on YARN
- Spark应用程序在集群上部署运行时,可以由不同的组件为其提供资源管理调度服务(资源包括CPU、内存等)。比如,可以使用自带的独立集群管理器(standalone),或者使用YARN,也可以使用Mesos。因此,Spark包括三种不同类型的集群部署方式,包括standalone、Spark on Mesos和Spark on YARN。
1.5.1 standalone模式
与MapReduce1.0框架类似,Spark框架本身也自带了完整的资源调度管理服务,可以独立部署到一个集群中,而不需要依赖其他系统来为其提供资源管理调度服务。在架构的设计上,Spark与MapReduce1.0完全一致,都是由一个Master和若干个Slave构成,并且以槽(slot)作为资源分配单位。不同的是,Spark中的槽不再像MapReduce1.0那样分为Map 槽和Reduce槽,而是只设计了统一的一种槽提供给各种任务来使用。
1.5.2 Spark on Mesos模式
Mesos是一种资源调度管理框架,可以为运行在它上面的Spark提供服务。Spark on Mesos模式中,Spark程序所需要的各种资源,都由Mesos负责调度。由于Mesos和Spark存在一定的血缘关系,因此,Spark这个框架在进行设计开发的时候,就充分考虑到了对Mesos的充分支持,因此,相对而言,Spark运行在Mesos上,要比运行在YARN上更加灵活、自然。目前,Spark官方推荐采用这种模式,所以,许多公司在实际应用中也采用该模式。
1.5.3 Spark on YARN模式
Spark可运行于YARN之上,与Hadoop进行统一部署,即“Spark on YARN”,其架构如图9-13所示,资源管理和调度依赖YARN,分布式存储则依赖HDFS。
二、Spark的安装与使用
2.1 准备步骤
2.1.1 安装JDK
- 访问oracle官网,点击此处 挑选适合自己电脑的版本 下载JDK
Windows:
- 双击下载的exe文件进行安装,之后选择你的安装路径
- 右击我的电脑 ==> 属性 ==> 高级系统设置 ==> 高级 ==> 环境变量
- 参考
Linux(Ubuntu):
- 进入到下载完成的tar.gz文件的目录,执行 tar -zxvf jdk****.tar.gz
- 之后会在当前目录生成一个同名文件夹的JDK目录
vim ~/.bashrc
- 新增一行:
export JAVA_HOME=JDK安装路径
source ~/.bashrc
- 之后若是执行
java -version
正确显示java版本则安装成功
2.1.2 Hadoop安装
此处只对hadoop单机版进行讲解,个人学习与简单使用,单机版即可达到效果,如需分布式部署请参考 参考链接
- 和JDK一样 解压tar.gz
-
vim /etc/profile
export HADOOP_HOME=/hadoop/hadoop export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
source /etc/profile
./bin/hadoop version
- 如果没有报错则证明hadoop安装成功
2.2 Spark安装
访问官网 下载 自己对应的spark版本
由于我们已经自己安装了Hadoop,所以,在“Choose a package type”后面需要选择“Pre-build with user-provided Hadoop [can use with most Hadoop distributions]”,然后,点击“Download Spark”后面的“spark-2.1.0-bin-without-hadoop.tgz”下载即可。下载的文件,默认会被浏览器保存在“/home/hadoop/下载”目录下。需要说明的是,Pre-build with user-provided Hadoop: 属于“Hadoop free”版,这样,下载到的Spark,可应用到任意Hadoop 版本。
- 下载之后照常解压
-
sudo mv ./spark****** /spark cd /spark cp ./conf/spark-env.sh.template ./conf/spark-env.sh
- 编辑第一行并添加以下配置:
export SPARK_DIST_CLASSPATH=$(此处是你hadoop具体位置/hadoop/bin/hadoop classpath)
有了上面的配置信息以后,Spark就可以把数据存储到Hadoop分布式文件系统HDFS中,也可以从HDFS中读取数据。如果没有配置上面信息,Spark就只能读写本地数据,无法读写HDFS数据。
-
vim /etc/profile
在.bashrc文件中添加如下内容export JAVA_HOME=/usr/lib/jvm/default-java export HADOOP_HOME=/usr/local/hadoop export SPARK_HOME=/usr/local/spark export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.10.4-src.zip:$PYTHONPATH export PYSPARK_PYTHON=python3 export PATH=$HADOOP_HOME/bin:$SPARK_HOME/bin:$PATH
- 之后执行
source ~/.bashrc
使配置立即生效 -
./bin/run-example SparkPi
之后运行这条命令,如果有一堆信息输出而且没有报错,就证明安装成功了
2.3 第一个Spark应用
笔者用的是Ubuntu系统,python3.6
- 首先把pyspark的环境安装好
pip install pyspark
- 新建一个text.py文件,编辑如下:
from pyspark import SparkContext import os os.environ['JAVA_HOME'] = '/你的jdk的路径' # 上面这一行是防止jdk路径找不到的报错 sc = SparkContext( 'local', 'test') logFile = "file:///你该文件的路径/README.md" logData = sc.textFile(logFile, 2).cache() numAs = logData.filter(lambda line: 'a' in line).count() numBs = logData.filter(lambda line: 'b' in line).count() print('Lines with a: %s, Lines with b: %s' % (numAs, numBs))
- 之后 python test.py 一下 大概率能得到:
Lines with a: 62, Lines with b: 30
- 自此,你就完成了你的第一个 Spark 应用程序了。