Spark学习笔记[3]-Spark安装部署
1、下载对应版本的spark
官网我始终都下不下来,推荐一个国内的镜像: https://mirrors.tuna.tsinghua.edu.cn/apache/spark
2、概述
2-1 安装模式
虽然Spark是一个分布式计算框架,但是其不属于Hadoop Project,它有自己的资源层管理和文件系统,可以不依赖Hadoop的HDFS和Yarn,所以安装部署的时候可以只安装spark,对应的就是standalone集群, 但是一般都会使用HDFS作为数据存储层,使用Yarn进行资源管理(spark on yarn模式),这样就可以进行资源的复用,除了Yarn,还支持k8s等资源管理模块
StandAlone模式和Yarn模式资源层对应的角色如下:
StandAlone | Yarn | |
---|---|---|
主节点(管理集群计算资源) | Master | resourceManager |
工作节点(具体负责计算的节点) | Worker | nodeManager |
2-2 作业执行大致流程
从官网down了一张图:
排除资源层的角色,剩下的就是计算层角色,主要是Driver和Executor,除了这两个角色,其实还有一个角色Client,只是Client的功能比较少,下结合这个图,介绍一下作业的执行流程:
- 1)、启动client,client的主要功能就是负责启动Driver,Driver可以是一个单独的jvm进程,也可以运行在Client进程中,分别对应我们使用Spark-submit提交程序时指定的客户端模式(client)和集群模式(cluster),无论哪种模式,driver启动后,后续的工作都主要由Driver负责,两个模式的主要区别是:
- 在客户端模式,driver运行在client内部,和client率属于同一个jvm进程
- 在集群模式,Client会先向资源管理主节点申请资源,主节点根据Driver启动所需的资源情况,从所有工作节点中选取一个工作节点,并在该工作节点启动一个新的JVM进程运行Driver程序,在Yarn模式下,Driver会运行在AppMater上</font
- 2)、Driver启动成功后会向资源层申请计算资源,资源层根据申请的资源情况,挑选一批工作节点启动执行进程(Executor),等待执行计算任务,和MR不同的是,MR的map任务和reduce任务都是以进程的形式调度执行,Spark是先启动执行进程Executor,Executor内部有一个线程池,后续计算任务都由该线程池执行(由于spark是先申请资源再调度任务,所以spark在申请资源时会倾向于抢占资源,也就是尽量把集群资源抢光)
3、StandAlone模式安装(数据存储层使用HDFS,所以要先启动HDFS)
3-1 资源层角色规划
主机名称 | Master | Worker |
---|---|---|
hdp001 | * | |
hdp002 | *(HA模式需要) | * |
hdp003 | * | |
hdp004 | * |
3-2 配置文件修改
3-2-1 配置worker节点($SPARK_HONE/conf/slaves)
hdp002
hdp003
hdp004
3-2-2 配置spark的环境变量spar-env.sh
export JAVA_HOME=/opt/hadoop/jdk1.8.0_121 #远程登录主机执行需要该变量
export HADOOP_CONF_DIR=/opt/hadoop/hadoop-2.9.2/etc/hadoop #hadoop配置文件地址,根据它找到hdfs和**yarn**
export SPARK_MASTER_HOST=hdp001 #主节点,写主节点对应的主机,如果hdp002也是主,则hdp002的配置文件要写hdp002主机
export SPARK_MASTER_PORT=7077 #主节点端口
export SPARK_WORKER_CORES=2 #worker虚拟核数
export SPARK_WORKER_MEMORY=1g #woker内存
export SPARK_MASTER_WEBUI_PORT=9090 #web界面端口
3-2-3 配置spark-default.conf(HA模式等配置需要)
spark.deploy.recoveryMode ZOOKEEPER #也可以选择本地文件系统,一般都是zk
spark.deploy.zookeeper.url hdp001:2181,hdp002:2181,hdp003:2181,hdp004:2181
spark.deploy.zookeeper.dir /cmbspark #zk上的节点
3-2-4 在zk上创建一个新的目录节点(HA模式)
3-2-5 拷贝安装包和/etc/profile到其余节点
scp 源路径 hdp002:`pwd`
3-2-6 由于hdp002是备用主,需要将hdp002下的spark-env.sh的主节点主机改成hdp002
3-2-7 运行 sbin/start-all.sh启动集群
3-3 测试程序
准备一个测试文件上传到hdfs
3-3-1 使用spark-shell
命令格式:
spark-shell --master spark://hdp001:7077,hdp002:7077
进入界面后执行如下代码即可看到对应的输出:
sc.textFile("hdfs://mycluster/user/hdp01/data_in/word.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect().foreach(println)
3-3-2 使用spark-submit
spark-submit命令格式:
spark-submit \
--class <main-class> \
--master <url> \
--deploy-mode <client/cluster>
-- conf <key>=<value>
.... #other option
<application-jar>
[app-args<JVM参数或者其他>]
准备一个sh脚本运行即可,使用的代码是spark自带的例子程序:
claz=org.apache.spark.examples.SparkPi
jar=$SPARK_HOME/examples/jars/spark-examples_2.11-2.4.7.jar
$SPARK_HOME/bin/spark-submit \
--master spark://hdp001:7077,hdp002:7077 \
--class $claz\
--deploy-mode client \
$jar
100
3-4 历史记录服务
默认情况下,spark进程退出后【包括yarn】,历史执行的任务信息也会丢失,需要配置历史记录服务存储历史任务的执行情况,不管是MR还是Spark,历史记录是由计算层负责写入对应存储层存储(比如HDFS),开启日志服务流程如下:
- 1)、配置spark-default.conf
spark.eventLog.enabled true #开启日志记录
spark.eventLog.dir hdfs://mycluster/spark-logs #日志存储位置
spark.history.fs.logDirectory hdfs://mycluster/spark-logs #其他服务获取日志的路径,一般和上面一个是一样的
- 2)、手动启动 sbin下的start-history-server.sh
- 3)、访问启动historysever的主机的主机名,默认端口号是18080
4、Spark On Yarn模式
Spark On Yarn模式使用的资源层是Yarn,所以可以关闭StandAlone集群,但是需要启动Yarn集群,然后进行如下操作:
- 1)、修改spark-env.sh,保留以下两个
export JAVA_HOME=/opt/hadoop/jdk1.8.0_121 #远程登录主机执行需要该变量
export HADOOP_CONF_DIR=/opt/hadoop/hadoop-2.9.2/etc/hadoop #hadoop配置文件地址
- 2)、修改spark-default.conf,删除HA相关配置(也就是Zk相关的配置)
- 3)、修改yarn的配置文件yarn-site.xml,新增如下配置
<property><!--工作节点内存-->
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1024</value>
</property>
<property><!--工作节点虚拟核心-->
<name>yarn.nodemanager.cpu-cores</name>
<value>2</value>
</property>
<property><!--虚拟机检查-->
<name>yarn.nodemanager.vem-check-enable</name>
<value>false</value>
</property>
- 4)、上传依赖包到hdfs,以后就不需要每次从本地上传
1、在hdfs创建目录 /work/spark_lib/jars
2、上传spark安装目录的jars目录下的jar包到以上目录
3、配置spark-default.conf
spark.yarn.jars hdfs://mycluster/work/spark_lib/jars/*
- 5)、测试程序,同样使用saprk-shell,命令为:
spark-shell --master yarn --executor-memory 512M --driver-memory 512M #有内存不能配置太小,有可能起不来