设为首页 加入收藏

TOP

spark集群与spark HA高可用快速部署 spark研习第一季
2018-11-13 11:47:48 】 浏览:63
Tags:spark 集群 可用 快速 部署 研习 第一
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/refuil/article/details/51991536

1、spark 部署

标签: spark


0 apache spark项目架构

spark SQL  --  spark streaming --  MLlib  --  GraphX

0.1 hadoop快速搭建,主要利用hdfs存储框架

下载hadoop-2.6.0,解压,到etc/hadoop/目录下

0.2 快速配置文件

cat core-site.xml

  1. <configuration>
  2. <property>
  3. <name>fs.defaultFS</name>
  4. <value>hdfs://worker1:9000</value>
  5. </property>
  6. <property>
  7. <name>hadoop.tmp.dir</name>
  8. <value>/opt/hadoop-2.6.0/tmp</value>
  9. </property>
  10. <property>
  11. <name>hadoop.native.lib</name>
  12. <value>true</value>
  13. <description>Should native hadoop libraries, if present, be used.</description>
  14. </property>
  15. </configuration>

cat hdfs-site.xml

  1. <configuration>
  2. <property>
  3. <name>dfs.replication</name>
  4. <value>2</value>
  5. </property>
  6. <property>
  7. <name>dfs.namenode.secondary.http-address</name>
  8. <value>worker1:50090</value>
  9. <description>The secondary namenode http server address and port.</description>
  10. </property>
  11. <property>
  12. <name>dfs.namenode.name.dir</name>
  13. <value>/opt/hadoop-2.6.0/dfs/name</value>
  14. </property>
  15. <property>
  16. <name>dfs.datanode.data.dir</name>
  17. <value>/opt/hadoop-2.6.0/dfs/data</value>
  18. </property>
  19. <property>
  20. <name>dfs.namenode.checkpoint.dir</name>
  21. <value>file:///opt/hadoop-2.6.0/dfs/namesecondary</value>
  22. <description>Determines where on the local filesystem the DFSsecondary name node should store the temporary images to merge. If this is acomma-delimited list of directories then the image is replicated in all of thedirectories for redundancy.</description>
  23. </property>
  24. </configuration>

cat hadoop-env.sh

  1. export JAVA_HOME=/opt/jdk
  2. export HADOOP_HOME=/opt/hadoop-2.6.0
  3. export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_HOME/lib/native"
  4. export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"}

cat mapred-site.xml

  1. <configuration>
  2. <property>
  3. <name>mapreduce.framework.name</name>
  4. <value>yarn</value>
  5. </property>
  6. </configuration>

cat yarn-site.xml

  1. <configuration>
  2. <!-- Site specific YARN configuration properties -->
  3. <property>
  4. <name>yarn.resourcemanager.hostname</name>
  5. <value>worker1</value>
  6. </property>
  7. <property>
  8. <name>yarn.nodemanager.aux-services</name>
  9. <value>mapreduce_shuffle</value>
  10. </property>
  11. </configuration>

0.3 hadoop hdfs快速启动测试

  1. $ sbin/start-dfs.sh //开启进程
  2. jps
  3. 5212 NameNode
  4. 5493 SecondaryNameNode
  5. 5909 Jps
  6. 5336 DataNode
  7. //如果没有DataNode,查看log/下的最新启动情况
  8. 可能是因为hostname没有改为worker1引起,每次重启虚拟机会遇到这种情况。
  9. 再次sbin/start-dfs.sh 如果namenode没有起来
  10. $ bin/hdfs namenode -format //格式化
  11. 最后浏览器查看worker1:50070

1. Spark安装及配置

1.1 运行环境配置

A.下载及配置JDK,Scala,sbt,Maven  到/opt 目录下

JDK jdk-7u79-linux-x64.gz
Scalahttp://downloads.typesafe.com/scala/2.10.5/scala-2.10.5.tgz
Maven apache-maven-3.2.5-bin.tar.gz
SBT sbt-0.13.7.tgz
解压 tar zxf jdk-7u79-linux-x64.gz
tar zxf scala-2.10.5.tgz

B.配置
  1. vi ~/.bash_profile ##vi /etc/profile 以下皆替换
  2. export JAVA_HOME=/opt/jdk
  3. export PATH=$JAVA_HOME/bin:$PATH
  4. export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  5. export SCALA_HOME=/opt/scala-2.10.5
  6. export PATH=$PATH:$SCALA_HOME/bin
  7. $ source /etc/profile //source ~/.bash_profile
C.测试
  1. $ java -version
  2. java version "1.7.0_79"
  3. Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
  4. Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
  5. $ scala -version
  6. Scala code runner version 2.10.5 -- Copyright 2002-2013, LAMP/EPFL
D.Maven,sbt配置
  1. export MAVEN_HOME=/opt/apache-maven-3.2.5
  2. export SBT_HOME=/opt/sbt
  3. export PATH=$PATH:$SCALA_HOME/bin:$MAVEN_HOME/bin:$SBT_HOME/bin
  4. $source /etc/profile
  5. $ mvn --version
  6. Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-15T01:29:23+08:00)
  7. Maven home: /opt/apache-maven-3.2.5
  8. Java version: 1.7.0_79, vendor: Oracle Corporation
  9. Java home: /opt/jdk
  10. Default locale: en_US, platform encoding: UTF-8
  11. OS name: "linux", version: "2.6.32-504.el6.x86_64", arch: "amd64", family: "unix"
  12. $ sbt --version //warning '--'
  13. sbt launcher version 0.13.7

1.2 Spark配置

A.下载Hadoop,Spark

spark-1.4.0http://d3kbcqa49mib13.cloudfront.net/spark-1.4.0-bin-hadoop2.6.tgz
Hadoophttp://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz
解压

  1. $ tar zxf spark-1.4.0-bin-hadoop2.6.tgz
  2. $ tar zxf hadoop-2.6.0.tar.gz
  3. $ ll 查看
B. 配置Hadoop,Spark的安装目录
  1. vi ~/.bash_profile
  2. export JAVA_HOME=/opt/jdk
  3. export PATH=$JAVA_HOME/bin:$PATH
  4. export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  5. export SCALA_HOME=/opt/scala/scala-2.10.5
  6. export SPARK_HOME=/opt/spark-1.4.0-bin-hadoop2.6
  7. export HADOOP_HOME=/opt/hadoop-2.6.0
  8. export HADOOP_CONF_DIR=/opt/hadoop-2.6.0/etc/hadoop
  9. export MAVEN_HOME=/opt/apache-maven-3.2.5
  10. export SBT_HOME=/opt/sbt
  11. export PATH=$PATH:$SCALA_HOME/bin:$SPARK_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$MAVEN_HOME/bin:$SBT_HOME/bin
  12. source ~/.bash_profile

1.3 Spark配置文件

A.复制配置文件 
  1. # cd spark-1.4.0-bin-hadoop2.6
  2. # cd conf
  3. # cp spark-env.sh.template spark-env.sh

在spark-env.sh最后添加下面

  1. export SCALA_HOME=/opt/scala-2.10.5
  2. export SPARK_MASTER_IP=worker1 //如果是master需要改动
  3. export SPARK_WORKER_MEMORY=1G
  4. export JAVA_HOME=/opt/jdk //注意jdk的文件名变了
  5. export HADOOP_HOME=/opt/hadoop-2.6.0
  6. export HADOOP_CONF_DIR=/opt/hadoop-2.6.0/etc/hadoop

配置spark-defaults.sh, 后面添加

  1. spark.master spark://worker1:7077
  2. spark.eventLog.enabled true
  3. spark.eventLog.dir hdfs://worker1:9000/usr
  4. spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
  5. spark.yarn.historyServer.address worker1:18080
  6. spark.history.fs.logDirectory hdfs://worker1:9000/usr ##根据情况在hadoop hdfs目录下添加/usr 文件夹
B.配置slaves

在slaves最后添加下面

  1. worker1
  2. worker2
  3. worker3

cd ..

1.4. 启动master

  1. ./sbin/start-master.sh

1.5. 启动worker

  1. ./sbin/start-slaves.sh spark://worker1:7077
  2. 出错
  3. worker1: ssh: Could not resolve hostname worker1: Name or service not known
  4. #vim /etc/hosts
  5. 添加
  6. 192.168.35.131 worker1
  7. jps查看masterworker节点上验证spark集群是否正确启动:
  8. 通过浏览器查看spark集群是否启动成功:http://master:8080

1.6. 启动spark-shell

  1. ./bin/spark-shell --master spark://worker1:7077
  2. 如果是master改动worker1
  3. 浏览器登录 http://worker1:4040/

1.7 启动spark的historyserver:

  1. ./sbin/start-history-server.sh
  2. 浏览器登录worker1:18080

1.8 通过spark-shell测试SPARK集群:

a. 将spark安装包下的README.md上传到hdfs:hdfs dfs -put README.md /data/
直接在spark目录下

  1. # hdfs dfs -mkdir -p /data
  2. #hdfs dfs -put README.md /data

b. 通过hdfs的web控制台查看可见上传成功
c. 在spark-shell中对上传的文件进行操作:

  1. val file=sc.textFile("/data/README.md")

对读取的文件进行count操作:

  1. val count = file.flatMap(line => line.split(" ")).map(word => (word,1)).reduceByKey(_+_)
  2. count.collect //用collect命令提交并执行Job:

d. 从webUI可见job成功执行:http://master:4040

e. 通过jobhistoryserver可以查看程序执行的历史信息:http://master:18080
注:4040端口用来查看正在运行的程序的job信息,而18080用来查看执行完毕的程序的job信息。

1.9 通过spark-submit提交程序到spark集群测试SPARK集群:

a. 通过以下命令提交spark自带的sparkPi程序:

  1. >>exit //退出spark-shell
  2. spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 $SPARK_HOME/lib/spark-examples-1.4.0-hadoop2.6.0.jar //注意这是1.4版本的,不要直接复制,submit指定的主机名也要按实际更改

b.http://worker1:18080///浏览器查看
出现问题:
ERROR cluster.SparkDeploySchedulerBackend: Application has been killed. Reason: All masters are unresponsive! Giving up.
参考:
spark 案例集群测试整理
http://blog.csdn.net/javastart/article/details/43730085

2. Spark源代码编译

1.Maven编译

下载代码 wgethttp://d3kbcqa49mib13.cloudfront.net/spark-1.4.0.tgz

  1. $ tar zxvf spark-1.4.0.tgz
  2. $ cd spark-1.4.0
  3. $build/mvn -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0 -DskipTests clean package
  4. 更为简单的方法,shell脚本编译:
  5. $./make-distribution.sh --tgz -Phadoop-2.6 -Pyarn -DskipTests -Dhadoop.version=2.6.0 -Phive -Phivethriftserver
  6. clean package

2.SBT编译

  1. #build/sbt -Pyarn -Phadoop-2.6 assembly

3. Spark Standalone 运行

3.1 配置slaves

  1. cd ../spark-1.4.0-bin-hadoop2.6

在slaves最后添加下面

worker2
worker3

3.2 SSH免密码登录

  1. $vim /etc/hosts
  2. 添加
  3. 192.168.35.131 worker1
  4. 192.168.35.128 worker2
  5. 192.168.35.129 worker3

a:worker1上生成密钥

  1. ssh-keygen -t rsa
  2. ssh-copy-id -i ~/.ssh/id_rsa.pub root@worker1 //测试分发秘钥给本机

b:把本机的公钥追到worker2的 .ssh/authorized_keys 里

  1. ssh-copy-id -i ~/.ssh/id_rsa.pub root@worker2

c:测试

  1. ssh worker2
  2. exit 退出

3.3 启动测试

  1. ./sbin/start-all.sh

3.4. Spark tool

运行方式:

1: spark-shell
./bin/spark-shell --executor-memory 1g --driver-memory 1g --master spark://worker1:7077
2: spark-submit
./bin/spark-submit --class "SimpleApp" --master spark://worker1:7077 /opt/simple-project_2.10-1.0.jar

4. Spark Standalone HA 安装

4.1 Zookeeper分布式协调服务

默认情况下,Standalone的Spark集群是Master-Slaves架构的集群模式,由一台master来调度资源,这就和大部分的Master-Slaves结构集群一样,存在着Master单点故障的问题。如何解决这个单点故障的问题呢?Spark提供了两种方案:基于文件系统的单点恢复(Single-Node Recovery with Local File system)和基于zookeeper的Standby Masters(Standby Masters with ZooKeeper)。其中ZooKeeper是生产环境下的最佳选择。
ZooKeeper提供了一个Leader Election机制,利用这个机制你可以在集群中开启多个master并使它们都注册到ZooKeeper实例,ZooKeeper会管理使其中只有一个是Active的,其他的都是Standby的,Active状态的master可以提供服务,standby状态的则不可以。ZooKeeper保存了集群的状态信息,该信息包括所有的Worker,Driver 和Application。当Active的Master出现故障时,ZooKeeper会从其他standby的master中选举出一台,然后该新选举出来的master会恢复挂掉了的master的状态信息,之后该Master就可以正常提供调度服务。整个恢复过程只需要1到2分钟。需要注意的是,在这1到2分钟内,只会影响新程序的提交,那些在master崩溃时已经运行在集群中的程序并不会受影响。

4.2 CuratorFramework简介

CuratorFramework极大的简化了ZooKeeper的使用,它提供了high-level的API,并且基于ZooKeeper添加了很多
特性,包括
自劢连接管理:连接到ZooKeeper的Client有可能会连接中断,Curator处理了这种情况,对于Client来说自劢重连
是透明的。
简洁的API:简化了原生态的ZooKeeper的方法,事件等;提供了一个简单易用的接口。
Recipe的实现:
– Leader的选择
– 共享锁
– 缓存和监控
– 分布式的队列
– 分布式的优先队列

4.3 Zookeeper 安装

1 .下载
官网下载http://www.apache.org/dyn/closer.cgi/zookeeper/

  1. tar zxf zookeeper-3.4.6.tar.gz
  2. cd zookeeper-3.4.6
  3. 首先创建datadirdatalogdir,可以用以下命令创建: mkdir data; mkdir logs:
  4. 修改环境变量: vim ~/.bashrc:
  5. export ZOOKEEEPER_HOME=/opt/zookeeper-3.4.6
  6. export PATH=$ZOOKEEPER_HOME/bin:$PATH
  7. source ~/.bashrc

2 .配置

  1. cd conf
  2. cp zoo_sample.cfg zoo.cfg
  3. vi zoo.cfg

最后面加上

  1. dataDir=/opt/zookeeper-3.4.6/data
  2. dataLogDir=/opt/zookeeper-3.4.6/logs
  3. server.0=worker1:2888:3888
  4. server.1=worker2:2888:3888
  5. server.2=worker3:2888:3888

注:
dataDir指定的是用来存储内存里数据的快照文件的目录;(在不指定dataLogDir时,该目录也是数据库的更改事务日志的存储目录);
dataLogDir指定的是数据库的事务日志的存储目录;
server.0,server.1,server.2指定的是ZooKeeper集群的各个节点,这里的数字012对应该节点datadir下的myid文件的内容(在此强调:必须在这里指定所有ZooKeeper节点!)。
两个端口" 2888" and "3888",前者是ZooKeeper各个节点相互连接通信所用,后者是leader 选举所用。
更详细的信息请参阅:
http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html

  1. 在datadir下建立myid文件并修改内容为0:
  1. echo 0 > myid
  2. 注意:myid文件的内容对应于zoo.cfg中指定的该节点的id,即配置文件中的server.0.

4.复制到其它节点并设置serverid,使用scp命令将ZooKeeper拷贝到另外2台机器上(生产环境的最佳实践是用3台机器做HA),配置另外2台机器的环境变量并source使之生效:

  1. scp -r zookeeper-3.4.6/ root@worker2:/opt/zookeeper-3.4.6
  2. scp -r zookeeper-3.4.6/ root@worker3:/opt/zookeeper-3.4.6
  3. vim ~/.bashrc:
  4. export ZOOKEEEPER_HOME=/opt/zookeeper-3.4.6
  5. export PATH=$ZOOKEEPER_HOME/bin:$PATH
  6. source ~/.bashrc
  7. 在另外2台机器上将data 目录下的文件myid的内容分别修改为12
  8. echo "1">myid
  9. echo "2">myid

5.运行zookeeper集群:
a. 在安装了zk的各个节点上分别执行: zkServer.sh start
b. jps验证启动成功与否,若见‘QuorumPeerMain’表明进程已启动。
注意:进程启动成功不代表ZooKeeper已经可以开始提供服务。
c. zkServer.sh status验证启动成功与否,并查看哪台机器被选为leader.
在master节点上启动并验证ZooKeeper状态:

  1. /opt/zookeeper-3.4.6/bin/zkServer.sh start
  2. jps
  3. zkServer.sh status

注意: 见如下错误信息,‘Error contacting service. It is probably not running.’,但这是正常的,一旦你在另外2台节点上启动了ZooKeeper,该错误信息将不会再出现。一个简单的事实是,只有超过一半的ZooKeeper节点启动后,ZooKeeper才可以正常提供服务。
在另外2台机器上启动并验证ZooKeeper:

  1. /opt/zookeeper-3.4.6/bin/zkServer.sh start
  2. jps
  3. zkServer.sh status

再到master上验证ZooKeeper状态:
可见,现在master节点的错误信息不见了。
现在3台节点的ZooKeeper都已经启动成功,且一台(worker2)是Leader,其它都是follower.ZooKeeper已经启动成功,并正常对外提供服务!
测试:
运行 ./bin/zkCli.sh (bin/zkCli.sh -server 127.0.0.1:2181)
根目录 ls /

4.4 修改spark配置使其支持ZooKeeper下的HA:

1 .修改配置

  1. cd $SPARK_HOME/conf;
  2. vim spark-env.sh:
  3. 注释掉export SPARK_MASTER_IP=MASTER
  4. 添加export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER
  5. -Dspark.deploy.zookeeper.url=worker1:2181,worker2:2181,worker3:2181 -Dspark.deploy.zookeeper.dir=/spark"
  6. 注意:所有准备用来做master的节点都需要做这个修改。

复制到其它2个节点

  1. scp -r ./spark-env.sh root@worker2:/opt/spark-1.4.0-bin-hadoop2.6/conf
  2. scp -r ./spark-env.sh root@worker3:/opt/spark-1.4.0-bin-hadoop2.6/conf
  3. 配置:
  4. spark.deploy.recoveryMode=ZOOKEEPER
  5. spark.deploy.zookeeper.url=worker1:2181,worker2:2181, worker3:2181
  6. spark.deploy.zookeeper.dir=/spark
  7. 参数 默认值 描述
  8. spark.deploy.recoveryMode
  9. NONE
  10. 恢复模式(Master重新启劢的模式),
  11. 有三种:1.ZooKeeper, 2. FileSystem, 3
  12. NONE
  13. spark.deploy.zookeeper.url
  14. ZooKeeperServer地址
  15. spark.deploy.zookeeper.dir
  16. /spark
  17. ZooKeeper 保存集群元数据信息的文件
  18. 目录,包括WorkerDriver
  19. Application
  1. 在正式开始启动spark集群之前,我们先来看看启动spark集群的相关命令:
    a. start-all.sh其实质是先后执行了start-master.sh和start-slaves.sh:
    b. start-master.sh会首先尝试从spark_env.sh中获取spark_master_ip,获取到的话,就在该参数对应的节点上(可以是当前节点也可以不是当期节点)启动master进程;如果没有获取到的话,则会在当前节点上启动master进程:
    事实上,如果在spark-env.sh中指定了spark_master_ip,但它的值不是你当前执行start-master.sh或start-all.sh的节点的hostname的话,会报如下错误:
  1. 16/02/24 00:21:07 WARN util.Utils: Service 'sparkMaster' could not bind on port 7077. Attempting port 7078.
  2. Exception in thread "main" java.net.BindException: Cannot assign requested address: Service 'sparkMaster' failed after 16 retries!

c. start-slaves.sh会在slaves 文件中指定的每个节点上分别调用start-slave.sh来启动worker进程,并尝试注册到特定的master上。这个master通过以下方式获取:首先尝试从spark-env.sh中获取spark_master_ip,获取到的话,该参数对应的节点(可以是当前节点也可以不是当期节点)就是master节点;如果没有获取到的话,则会视当前节点为master节点。该命令不能从命令行接受参数:
d. start-slave.sh: start-slave.sh必须在命令行指定master(s). 该命令会从命令行的第一个参数中取得master节点。
事实上,该命令常用来在集群中动态添加worker节点,即:整个集群已经启动并正常提供服务,这时有新的节点可用,我们要把它动态添加到集群中,而不必关闭正在运行的集群,就可以使用该命令。
e. 不论你用哪种方式启动worker(start-slaves.sh 或start-slave.sh),当对应的Master没有启动或启动了但不是active状态的话,该worker进程仍然可以启动成功(即Jps可见该进程),但由于没能向master注册成功,它并不能提供服务,它会一直尝试向master注册!

4.5 在部署了ZooKeeper的一台host上启动spark:

通过上面的分析,我们知道当spark_env.sh中没有配置spark_master_ip时,提交命令(start-all.sh, start-master.sh或start-slaves.sh)的host会被视为master节点。在ZooKeeper下,所有的ZooKeeper节点都必须做step4中的修改,即注释掉SPARK_MASTER_IP的配置,并添加SPARK_DAEMON_JAVA_OPTS.
事实上,我们可以在任意一个已经启动了ZooKeeper且ZooKeeper正常提供服务的节点上通过命令start-all.sh来启动spark集群,不管该节点在ZooKeeper中的状态是leader还是follower. (当然你也可以只在该节点上start-master.sh,后续通过start-slaves.sh再启动workers.)
在这里我们在master节点上用start-all.sh来启动spark集群。
因为spark只是一个计算框架,在这里我们还是使用hadoop的hdfs作为文件系统,故需要首先需要确保hdfs已经启动并正常提供服务:
确保ZooKeeper已经启动并正常提供服务:
Master节点处于follower状态:
Worker1处于leader状态:
Worker2处于follower状态:
在master节点上用start-all.sh来启动spark集群:(当然你也可以在worker1或worker2上使用start-all.sh来启动整个集群,或只是start-master.sh来启动master进程):
注:若你正确地配置了某个节点使用ZooKeeper,(即配置了SPARK_DAEMON_JAVA_OPTS且注释掉了SPARK_MASTER_IP),但在没有成功启动ZooKeeper的情况下使用命令start-master.sh来启动master的话,master仍能成功启动,但会处于standby即不能提供服务:

再次强调:需要在成功地启动了ZooKeeper集群的基础上(至少在一半以上的ZooKeeper节点上成功启动了ZooKeeper进程),才能去启动spark集群!

1、jps验证哪些节点有master进程

worker1: jps
worker2: jps
worker3: jps
可见只有手动提交了start-all.sh或start-master.sh的master节点有MASTER进程,其他节点则没有。
注意:即使有了master进程,也不代表master已经启动并能提供服务,这还要看master的状态是否是ACTIVE.

2. 浏览器查看worker1:8080状态.

可见master处于ALIVE状态,在正常提供服务。
事实上,第一台手动启动了master进程的节点一定是alive状态的,不管该节点在zk上是leader还是follower!

3. 在其他ZooKeeper节点上手动启动master,并用jps查看Master进程是否启动成功:

再次强调: 这些节点的spark-env.sh中一定要正确配置为使用ZooKeeper, 即正确配置了SPARK_DAEMON_JAVA_OPTS,否则的话这些启动了的多个masters不能发觉彼此的存在,从而都将自己视为ACTIVE状态,这将置于个集群于不健康状态(因为这些masters都会独立提供资源调度服务)。这个错误如此常见,以至于在官网上也有说明:
在worker2上启动master并jps查看进程:

4. 浏览器查看worker1:8080状态.

worker2
worker3
总结:手动启动的第一个master是ACTIVE状态,后续启动的masters是STANDBY状态, 这与哪个节点是leader,哪个节点是follower没有关系。
注:这些节点有的在zk中可能是leader,但这不影响。

练习

1、spark-submit提交一个简单的程序,参考http://spark.apache.org/docs/latest/quick-start.html
提供操作步骤和运行结果的截图。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇再探spark之一(复习之前)加spar.. 下一篇【Spark篇】---SparkSQL on Hive..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目