1、spark是什么?
Spark是基于内存计算的,分布式大数据分析引擎,用于管理文本、图表等不同性质数据集,批量和实时流运算的大数据处理的需求。
Spark对于反复用到的数据进行缓存,减少中间结果写入磁盘和不必要的sort、shuffle,并对于DAG进行了高度的优化,划分不同的stage和使用了延迟计算技术,可以将Hadoop集群中的应用在内存中的运行速度提升100倍。
2、spark的技术架构
spark是基于Hadoop分布式文件系统HDFS的计算引擎,框架核心模块为:
Spark Core:包含Spark的基本功能,包含任务调度、内存管理、错误恢复、存储系统交互等模块,以及对弹性分布式数据集RDD的API定义。
Spark SQL:是操作结构化数据的程序包,通过Spark SQL可以使用SQL或者HQL来查询多种数据源,比Hive表、Parquet以及JSON等。
Spark Streaming:是实时数据进行流式计算的组件,允许程序能够像普通RDD一样处理实时数据。
Spark MLlib:是机器学习功能的程序库,包含分类、回归、聚类、协同过滤等操作,还提供了模型评估、数据导入等额外的支持功能。
GraphX:控制图、并行图操作和计算的一组算法和工具的集合。GraphX扩展了RDD API,包含控制图、创建子图、访问路径上所有顶点的操作。
3、spark的工作机制
spark执行流程如下:
1、当有Application提交到Spark集群后,会创建一个Driver进程。Driver初始化Application运行环境,启动SparkContext ,构建出DAGScheduler和TaskScheduler;
2、SparkContext向资源管理器(Standalone,Mesos或Yarn),注册并申请Application运行的Executor资源,Executor启动StandaloneExecutorbackend,向SparkContext注册并申请Task任务;
3、Driver执行Application,读取数据源,将待处理数据生成RDD,每执行一个Action都会创建一个Job提交给DAGScheduler;
4、DAGScheduler会为每个Job划分多个Stage,每个Stage根据RDD的Partition决定Task个数,然后每个Stage创建一个TaskSet,将TaskSet提交到TaskScheduler。TaskScheduler会将每个TaskSet里的Task,提交到Executor运行;
5、Executor每接受一个Task都会用TaskRunner封装,从线程池获取一个线程来执行,最后一个Stage的ResultTask运行完后释放所有资源。
4、spark的不同部署模式
spark以分布式集群部署时,可以依赖外部资源调度框架(Mesos,yarn或EC2),也可以使用内建的资源调度。根据资源调度器的不同,主流三种部署模式为:
Standalone模式,是自带资源调度框架的集群管理模式,即独立模式。Standalone是最简单最容易部署的一种模式,无需依赖任何其他资源管理系统,其主要的节点有 Driver 节点、Master 节点和 Worker 节点。
Spark on YARN模式,是运行在Hadoop YARN框架的模式,使用YARN为上层应用提供统一的资源管理和调度,已成为大数据集群资源管理系统的标准。目前仅支持粗粒度模式,在YARN上的Container资源是不可以动态伸缩的,一旦Container启动之后,可使用的资源将不再发生变化。
Spark on Mesos模式,是运行在Apache Mesos框架的模式,作为官方推荐的模式。Apache Mesos是一个更强大的分布式资源管理框架,负责集群资源的分配,Spark运行在Mesos上会比运行在YARN上更加灵活,不仅支持粗粒度模式,还提供细粒度调度模式,实现资源使用中按需分配。
5、Standalone模式安装及使用
在3台CentOS7主机Hadoo1、Hadoop2、Hadoop2上,以Hadoop1为Master主节点,部署过程如下:
1、下载jdk和spark安装包jdk-8u211-linux-x64.tar.gz、spark-2.4.3-bin-hadoop2.7.tgz,并上传到3台centos7的/home目录。
2、在3台centos7上,分别安装配置jdk环境。
tar -zxf jdk-8u211-linux-x64.tar.gz -C /usr
mv /usr/jdk-8u211-linux-x64 /usr/jdk-8u211
编辑vim /etc/profile文件,增加环境变量配置:
export JAVA_HOME=/usr/jdk-8u211/jdk1.8.0_211
export PATH=\$PATH:\$JAVA_HOME/bin
3、在3台centos7上,分别安装配置Spark环境。
tar -xf spark-2.4.3-bin-hadoop2.7.tgz -C /usr
mv /usr/spark-2.4.3-bin-hadoop2.7 /usr/spark-2.4.3
cd /usr/spark-2.4.3
cp conf/spark-env.sh.template conf/spark-env.sh
cp conf/slaves.template conf/slaves
编辑vim /etc/profile文件,增加环境变量配置:
export SPARK_HOME=/usr/spark-2.4.3
export PATH=\$PATH:\$SPARK_HOME/bin
编辑vim conf/spark-env.sh文件,增加环境配置:
export JAVA_HOME=/usr/jdk-8u211/jdk1.8.0_211
export SPARK_MASTER_HOST=Hadoop1
编辑vim conf/slaves文件,增加节点配置:
Hadoop1
Hadoop2
Hadoop3
刷新系统文件,使配置立即生效。
source /etc/profile
4、配置 ssh 免密登录,可以在master免密启动所有worker节点。
在Hadoop1上执行:ssh-keygen -t rsa,一路按回车,直到生成下述日志:
在用户目录cd ~下,会生成.ssh子目录,执行ls ~/.ssh可看到两个文件:
id_rsa
id_rsa.pub
将id_rsa.pub复制到其它机器上,执行以下几条命令:
scp ~/.ssh/id_rsa.pub root@Hadoo2:~/.ssh/
scp ~/.ssh/id_rsa.pub root@Hadoo3:~/.ssh/
5、启动spark集群,通过web页面查看。
在Hadoop1上执行命令,启动master节点,并查看进程:
sbin/start-master.sh
jps
输入jps后,显示Master字样,就说明启动成功了。spark 默认会监听8080端口,在浏览器输入http://Hadoop1:8080,可查看集群状态。
在Hadoop1上执行命令,启动worker节点,并查看进程:
sbin/slaves.sh
jps
输入jps后,显示Worker字样,就说明启动成功了。刷新浏览器http://Hadoop1:8080界面,可以看到启动了三个Worker节点。
6、执行spark实例程序,测试spark任务。
在spark安装目录,examples/src/main子目录下,有spark自带的java、python、r、scala四种语言实例。以python计算PI程序实例,运行如下:
cd /usr/spark-2.4.3/examples/src/main/python
spark-submit --master spark://Hadoop1:7077 pi.py
执行完成后,刷新浏览器界面,在Completed Applications栏,可以看到一条计算PI的记录。