现在来学一学spark这个内存计算引擎,主要应用于大规模数据的计算。
一、简介
和MapReduce都是计算引擎,但两者还是有很大区别的,MapReduce计算的中间数据都是存储在硬盘上的,而Spark计算的中间数据都是存储在内存里的,除非有说明说让Spark把中间数据存储到硬盘上。这样可想而知基于内存,Spark的运行效率就比MapReduce快了许多了。
下图举例:把这么一座山当成是大规模的数据,开发商要把山上的树用去做桌子就相当于做计算,于是分配工人p们去山上砍树,多个不同的工人们在砍树就相当于是在并行计算,这大概就是云计算的思想:计算向数据移动,即移动的计算而不是数据, 最终目的就是提高计算效率。
图片.png
二、Spark架构
搭建过hadoop集群架构,也就熟悉了套路,spark集群架构也是采用主从架构(master主节点和worker从节点),master节点管理着各个worker节点,从而也就掌握着整个集群的资源。
三、Spark下载安装
直接去官网http://spark.apache.org/ 下载,不过下载时注意,spark版本要对应还hadoop的版本,我的hadoop版本安装的是2.6.4所以要勾选好对应的spark包,目前我选择的是spark2.4.3搭配hadoop2.6.4。
四、Spark集群搭建
- 1、软件安装
需要用到hadoop,java,scala,spark,直接把下载好的文件从windows上传到linux服务器上,再使用tar -zxvf -C 文件名
命令解压文件,hadoop和java的安装我就不提了,自行百度。接下来是scala的安装配置,同样是下载好上传到linux服务器然后解压,之后输入命令vi /etc/profile
修改这个文件把scala的安装目录给加进去PATH属性中,:wq
命令保存退出,再输入source /etc/profile
命令使环境变量生效,最后输入命令scala -version
查看是否安装scala成功。 - 2、spark环境配置
先cd /usr/local/spark/conf
到此目录下,找到spark-env.sh.templete
文件改个名为spark-env.sh
,再加入以下代码,对应注释在里面。注意:以下路径只是我个人电脑路径,大家自行修改为各自的软件安装路径。
JAVA_HOME=/usr/java/default #java安装路径
SCALA_HOME=/usr/local/scala #scala安装路径
HADOOP_HOME=/usr/local/hadoop #hadoop安装路径
SPARK_MASTER_PORT=7077 #资源申请端口
SPARK_MASTER_WEBUI_PORT=8888 #对外访问web界面端口
SPARK_MASTER_IP=10.14.28.100 #spark集群的master节点的IP地址
SPARK_MASTER_OPTS="-Dspark.worker.timeout=100" #从节点发送心跳给主节点的超时时间,使得主节点才知道从节点的生存状态
SPARK_WORKER_MEMORY=3G #每个worker节点最大能分配给executors的内存大小
SPARK_WORKER_CORES=2 #每个worker节点所占有的CPU核数目
SPARK_WORKER_INSTANCES=1 #每台机器上开启的worker节点的数目
SPARK_LOCAL_DIRS=/var/spark #集群运行本地目录
SPARK_WORKER_DIR="/var/spark/work" #存放任务在计算中产生的中间数据
SPARK_WORKER_OPTS="-Dspark.worker.cleanup.enabled=true -Dspark.worker.cleanup.appDataTtl=259200" #开启自动清空worker工作目录区的功能,后面是数据有效期
- 3、配置
spark/conf
目录下的slaves
文件,这跟我之前搭建hadoop集群时候一样写上管理着的各个slave机器就好,然后cd /usr/local
到目录下,使用命令scp -r spark slave1:/usr/local
把spark安装拷贝到slave1机器的同个路径下,后面同理slave2、slave3机器。附:关于scp拷贝命令的解析 - 4、之后进入sbin目录下把
start-all.sh
和stop-all.sh
脚本名给修改掉,因为hadoop集群也有这2个脚本,怕执行命令时冲突了。图片.png - 5、最后使用命令
vi /etc/profile
修改PATH环境变量,把spark的bin路径和sbin路径加进去,这样就可以在所有命令下执行这个脚本命令了,注意:修改完后要source /etc/profile
下,使环境变量生效。 -
6、我把集群所有节点都启动起来了,包括之前搭建的hadoop集群的yarn和hdfs,截图如下:图片.png图片.png
五、谈谈主从架构的单点故障
- 1、
什么是单点故障?
通常分布式系统采用的是主从架构,由一个主节点管理着一堆从节点,主节点分发业务,从节点处理业务。单点故障就是当主节点挂了,整个系统就挂了,这就是由一个主节点引发的故障,称为单点故障,但如果是一个从节点挂了对集群对外提供服务是不会有影响的。 - 2、
传统方式解决单点故障
多加一个备用主节点。期间过程如下:image.png - 3、
使用zookeeper注册服务解决单点故障
分布式锁主要有zookeeper实现,主节点在使用时,备用主节点会被加锁而阻塞作为备用主节点。解决过程如下图:
何为分布式锁?
就是为了控制多个进程访问同一个资源时,这个资源能被有序访问,主要控制进程的加锁、解锁、锁超时。
分布式协调可以解决多个进程的同步控制,主要核心是实现了分布式锁,而zookeeper是一个分布式协调服务。
image.png
六、Spark部署的几种模式
- 1、local(本地模式):常用于本地开发测试,该模式不会提交任务导集群中,只在本节点执行,分为local单线程和local-cluster多线程,不需要启动Master进程和Worker进程。有
local:只启动一个executor
、local[k]:启动k个executor
、local[*]:启动跟cpu数目相同的executor
。 - 2、Standalone(集群模式):分布式部署集群,自带完整服务,资源管理和任务监控都是spark自己搞定。
- 3、spark on yarn(集群模式):分布式部署集群,但把资源和任务监控交给yarn管理,spark直连yarn,不需要额外构建spark集群,有yarn-client和yarn-cluster两种模式,主要区别在于:Driver程序的运行节点,即cluster模式的driver运行在集群子节点,有容错功能,client模式的driver运行在客户端。