准备安排:Spark的HA
Spark会安装在hadoop02,hadoop03,hadoop04,hadoop05上面
注意需要先启动hdfs(必须),在启动yarn(非必须可以使standalone模式)
1.登陆:http://spark.apache.org/downloads.html
下载符合自己的Spark安装包
2.上传到hadoop02节点
3.解压安装包
[hadoop@hadoop02 ~]$ tar -zxvf spark-2.3.0-bin-hadoop2.7.tgz -C apps/
4.进入安装路径
[hadoop@hadoop02 apps]$ cd spark-2.3.0-bin-hadoop2.7/
5.进入conf文件夹
[hadoop@hadoop02 spark-2.3.0-bin-hadoop2.7]$ cd conf/
6.修改spark-env.sh.template为spark-env.sh
[hadoop@hadoop02 conf]$ mv spark-env.sh.template spark-env.sh
[hadoop@hadoop02 conf]$ vim spark-env.sh
在末尾追加下面的代码(注意是zookeeper的节点名字,观察者hadoop05不用写进去,需要指定java,hadoop集群,yarn集群,spark端口号(默认7077))
export JAVA_HOME=/usr/local/jdk1.8.0_73
export HADOOP_CONF_DIR=/home/hadoop/apps/hadoop-2.7.5/etc/hadoop
export YARN_CONF_DIR=/home/hadoop/apps/hadoop-2.7.5/etc/hadoop
export SPARK_MASTER_PORT=7077
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=hadoop02:2181,hadoop03:2181,hadoop04:2181 -Dspark.deploy.zookeeper.dir=/spark"
7.修改slaves.template文件,指定Worker(注意不需要指定Master,在哪里启动哪里就是Master,如需要启动Master作为HA,就在那个节点上start-master.sh)
先重命名
[hadoop@hadoop02 conf]$ mv slaves.template slaves
再修改内容如下
[hadoop@hadoop02 conf]$ vim slaves
把localhost删除并添加
hadoop02
hadoop03
hadoop04
hadoop05
8.分发
[hadoop@hadoop02 apps]$ scp -r spark-2.3.0-bin-hadoop2.7/ hadoop03:$PWD
[hadoop@hadoop02 apps]$ scp -r spark-2.3.0-bin-hadoop2.7/ hadoop04:$PWD
[hadoop@hadoop02 apps]$ scp -r spark-2.3.0-bin-hadoop2.7/ hadoop05:$PWD
9.配置环境变量(注意PATH要在最后,如果PATH在SPARK_HOME的前面会导致找不到命令)
[hadoop@hadoop02 ~]$ vim .bashrc
追加 export SPARK_HOME=/home/hadoop/apps/spark-2.3.0-bin-hadoop2.7
追加 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SPARK_HOME/bin:$SPARK_HOME/sbin
分发环境变量:
[hadoop@hadoop02 ~]$ scp -r .bashrc hadoop03:$PWD
[hadoop@hadoop02 ~]$ scp -r .bashrc hadoop04:$PWD
注意我们尽量不要分发环境变量。因为我们hadoop05安装了hive,sqoop,azkaban
刷新环境变量[hadoop@hadoop02 ~]$ source .bashrc
10.启动Spark的三种方式
说明:
启动worker:直接start-all.sh会启动hdfs和yarn的(因为在环境变量中配置了,他们写在了前面所以优先级高)。所以要在/home/hadoop/apps/spark-2.3.0-bin-hadoop2.7/sbin目录下输入 ./start-all.sh才行(输入命令的节点会是Master)。注意./不能省略。如果省略还是先找环境变量中的命令(既是启动hdfs和yarn)
启动master:start-master.sh
(1)本地运行模式 (单机)(启不启动master和worker都无所谓因为是本地的,只能在当前的节点执行):
该模式运行任务不会提交在集群中,只在本节点执行,与master无关测试效果与(2)相同
spark-shell --master local
检验执行下下面语句:
sc.textFile("hdfs://myha01/a/wordcount.txt").flatMap(_.split(",")).map((_,1)).reduceByKey(_+_).collect
(2)启动为local[*]模式(单机)(启不启动master和worker都无所谓因为是本地的,只能在当前的节点执行):
该模式运行任务不会提交在集群中,只在本节点执行,与master无关,测试效果与(1)相同
输入spark-shell进入即可
(3)启动为集群模式(spark standalone模式)(必须启动master和worker):
该模式的区别是spark自己给自己调度资源,必须指明ALIVE的master地址,地址不对就报错(不能指定standby的master),不能计算
先要启动master和worker 并找到master 哪个节点是master就指明ALIVE的master地址
[hadoop@hadoop04 ~]$ spark-shell --master spark://hadoop05:7077 (这里hadoop05是master)
hadoop04退出spark-shell --master spark://hadoop05:7077之后,再去master的节点网站去看,如下图
下图是hadoop04运行计算时候的图:
(4)启动为集群模式(spark on yarn模式)(一定别启动master和worker):
该模式是用yarn来调度资源
注意:一定别启动master,否则会卡很久,然后产生问题:hadoop04:4040无法访问,但是可以计算
报错原因:内存资源给的过小,yarn直接kill掉进程,则报rpc连接失败、ClosedChannelException等错误。
解决方法:
先停止YARN服务,然后修改yarn-site.xml,增加如下内容
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
<description>Whether virtual memory limits will be enforced for containers</description>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>4</value>
<description>Ratio between virtual memory to physical memory when setting memory limits for containers</description>
</property>
将新的yarn-site.xml文件分发到其他Hadoop节点对应的目录下,最后在重新启动YARN
spark-shell --master yarn-client
值得注意的是:hadoop04:4040进不去,自动跳转到下面的数据yarn节点的spark地址,可以看到任务进度
11.有master的情况下检查是否启动成功
http://hadoop02:8080/
jps查看是否有Master 和 Worker进程
11.结束Spark节点和进程
在任意启动Spark的Worker进程的节点上:
进入 cd /home/hadoop/apps/spark-2.3.0-bin-hadoop2.7/sbin
执行 ./stop-all.sh
自己单独启动Master的需要单独的结束
进入 cd /home/hadoop/apps/spark-2.3.0-bin-hadoop2.7/sbin
执行 ./stop-master.sh
注意:如果alive的挂了,另一台STANDBY的master切换成alive需要等待二十多秒
12.进入spark-shell及简单测试计算
在有spark的任意节点(这里我们是hadoop02,03,04,05)输入spark-shell
Spark默认是本地模式:
scala> var list =List(1,2,3,4)
list: List[Int] = List(1, 2, 3, 4)
scala> var rdd=sc.makeRDD(list)
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at makeRDD at <console>:26
scala> rdd.count()
res0: Long = 4
13.退出spark-shell
ctrl+d
14.(另一种配置方法,本文未这样做,可以不看)配置spark-defaults.conf.template(把默认的本地模式切换成集群模式)
我们现在hadoop02进行修改再分发给别的节点就行了
cd /home/hadoop/apps/spark-2.3.0-bin-hadoop2.7/conf
复制并且修改名字
[hadoop@hadoop02 conf]$ cp spark-defaults.conf.template spark-defaults.conf
进入修改 vim spark-defaults.conf
spark.master spark://hadoop02:7077,hadoop03:7077
配置上述信息后启动要在02或者03同时要在两者中单独启动standby的master进程。
分发给别的节点:
[hadoop@hadoop02 conf]$ scp -r spark-defaults.conf hadoop03:$PWD
[hadoop@hadoop02 conf]$ scp -r spark-defaults.conf hadoop04:$PWD
[hadoop@hadoop02 conf]$ scp -r spark-defaults.conf hadoop05:$PWD
注意:这个的作用目前是:
1.把默认的本地模式换成集群模式
2.不建议配置太多。如果你配置了4个节点,但是启动了2个节点作为master,会报错。但是会正常进入spark-shell
能正常进行计算(目前计算速度较慢),下图为配置了02,03,04,05后只启动02,03作为master的报错。
下图是在02输入的start-all.sh和在03输入的start-master.sh后在05进入的spark-shell后的图。
启动测试:
首先启动zookeeper
然后启动hdfs
最后启动spark集群,在sbin目录下使用./start-all.sh命令,备用节点需要手动启动,命令为start-master.sh
至此高可用集群搭建完毕。
通过测试,主备节点可以顺利切换,任务执行时,主节点挂掉,任务任然可以继续运行
15.(本文未这样配置,可以不看)相关命令
本地运行模式 (单机)(不需要启动master和worker):spark-shell --master local
上面的测试通过
spark-submit --master local[4] 代表会有4个线程(每个线程一个core)来并发执行应用程序。这种多个线程只能在一个进程下委屈求全的共享资源。
有个问题报错,不知道为什么,计算未通过
本地伪集群运行模式(单机模拟集群)(不需要启动master和worker):spark-shell --master local-cluster[2, 3, 1024]
参数:x代表要生成的executor数,y和z分别代表每个executor所拥有的core和memory数。
上面这条命令代表会使用2个executor进程,每个进程分配3个core和1G的内存,来运行应用程序。
会遇到default的配置文件master未全启动的问题,并且计算未通过
Spark standalone模式(需要启动master和worker):
Spark on yarn模式(不需要启动master和worker):spark-shell --master yarn
不清楚什么情况,未配置yarn参数
Spark集群配置HistoryServer
以standalone运行模式为例,在运行Spark Application的时候,Spark会提供一个WEBUI列出应用程序的运行时信息;但该WEBUI随着Application的完成(成功/失败)而关闭,也就是说,Spark Application运行完(成功/失败)后,将无法查看Application的历史记录;
Spark history Server就是为了应对这种情况而产生的,通过配置可以在Application执行的过程中记录下了日志事件信息,那么在Application执行结束后,WEBUI就能重新渲染生成UI界面展现出该Application在执行过程中的运行时信息;
Spark运行在yarn或者mesos之上,通过spark的history server仍然可以重构出一个已经完成的Application的运行时参数信息(假如Application运行的事件日志信息已经记录下来);
1、常规单节点配置
- 第一步: [root@hadoop02 ~]# cd /home/hadoop/apps/spark-2.3.0-bin-hadoop2.7/conf/
- cp spark-defaults.conf.template spark-defaults.conf
- 在文件里面添加如下内容:
- spark.eventLog.enabled true
- spark.eventLog.dir hdfs://hadoop02:9000/sparklog
- 第二步:
- 在spark-evn.sh 的文件里面添加如下内容:
- export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=30 -Dspark.history.fs.logDirectory=hdfs://hadoop02:9000/sparklog"
- 第三步:
- 在启动HistorServer服务之前 hdfs://hadoop02:9000/sparklog 目录要提前创建
- hadoop fs -mkdir /sparklog
- 第四步:
- start-history-server.sh
- 在对应的节点的UI :http://hadoop02:18080即可查看
2.HA高可用的配置
- 第一步: (我们在hadoop02操作)
- cp spark-defaults.conf.template spark-defaults.conf
- 在文件里面添加如下内容:
- spark.eventLog.enabled true
- spark.eventLog.dir hdfs://myha01/sparklog
- 其中myha01是dfs-site.xml和nameservice的配置名字
- 第二步-修改文件
- 在spark-evn.sh 的文件里面添加如下内容:
- export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.re
- tainedApplications=30 -Dspark.history.fs.logDirectory=hdfs://myha01/sparklog"
- 第三步-分发配置文件
- [hadoop@hadoop02 conf]$ scp -r spark-defaults.conf hadoop03:$PWD
- [hadoop@hadoop02 conf]$ scp -r spark-defaults.conf hadoop04:$PWD
- [hadoop@hadoop02 conf]$ scp -r spark-defaults.conf hadoop05:$PWD
- [hadoop@hadoop02 conf]$ scp -r spark-env.sh hadoop05:$PWD
- [hadoop@hadoop02 conf]$ scp -r spark-env.sh hadoop04:$PWD
- [hadoop@hadoop02 conf]$ scp -r spark-env.sh hadoop03:$PWD
- 第四步-创建目录
- 创建sparklog目录 hadoop fs -mkdir /sparklog
- 第五步-启动
- 在任意节点启动 start-history-server.sh(以hadoop03为例),在对应的节点的UI :http://hadoop03:18080即可查看
抄至——jenrey(原文)