由于项目使用的是Elasticsearch来做的数据存储,没有引用hadoop,自然也就没有使用yarn模式的spark集群部署方案。
standalone的部署方案,指的是单独的spark集群,任务的更新和资源的分配等都是spark自己去维护。
本问讲的是stanalone集群的部署方案,和代码的打包上传,运行等。
当前环境:
centos7.x(三台机器分别是114,116,117)
jdk1.8.0_181
scala-2.11.12
java选择1.8以上,scala选择与spark匹配的版本,如果使用到kafka,最好提前考虑到是否兼容。
笔者使用的是spark-2.1.2-bin-hadoop2.7,kafka用的是kafka_2.12-2.2.0
前置部署教程:
jdk安装
scala安装
kafka的搭建
实现集群的免密登录
下载
wget https://archive.apache.org/dist/spark/spark-2.1.2/spark-2.1.2-bin-hadoop2.7.tgz
把下载的安装包发送到其他的服务器上面
scp -r spark-2.1.2-bin-hadoop2.7.tgz [email protected]:/opt/
scp -r spark-2.1.2-bin-hadoop2.7.tgz [email protected]:/opt/
分别解压各个服务器上的安装包
tar -zxvf spark-2.1.2-bin-hadoop2.7.tgz
进入114,解压后的spark目录下,进入conf目录
复制spark-env.sh.template
cp spark-env.sh.template spark-env.sh
1.配置spark-env.sh(三台都配置上)
export JAVA_HOME=/usr/local/jdk1.8.0_181
export SCALA_HOME=/usr/local/scala-2.11.12
export KAFKA_HOME=/opt/kafka_2.12-2.2.0
#export HADOOP_HOME=/opt/hadoop-3.1.2
#export HADOOP_CONF_DIR=/opt/hadoop-3.1.2/etc/hadoop
#export SPARK_MASTER_IP=127.0.0.1
export SPARK_MASTER_HOST=10.25.1.114
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_CORES=1
export SPARK_WORKER_MEMORY=800m
#export SPARK_HOME=/opt/spark-2.1.2-bin-hadoop2.7
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=10.25.1.114:2181,10.25.1.116:2181,10.25.1.117:2181"
# -Dspark.deploy.zookeeper.dir=/spark"
配置说明:
$JAVA_HOME
、$SCALA_HOME
为环境变量配置。/etc/profile
里面配置export SPARK_HOME=/opt/spark-2.1.2-bin-hadoop2.7
,不然启动的时候系统会找不到目录。SPARK_MASTER_HOST
为每台机器的ipSPARK_WORKER_CORES
和SPARK_WORKER_MEMORY
SPARK_DAEMON_JAVA_OPTS
是为了配置spark的高可用的,后面还会讲到2.配置slaves(三台都配置上)
添加从节点的ip(要提前确认之间可以免密登录了,集群需要通过免密登录来共享资源的)
10.25.1.114
10.25.1.116
10.25.1.117
到此,就配置完成了,接下来就是启动就行了。
进入./sbin/
目录下,会看到各个启动脚本
[root@10 sbin]# ll
总用量 92
-rwxr-xr-x 1 elasticsearch elasticsearch 2803 10月 3 2017 slaves.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 1429 10月 3 2017 spark-config.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 5688 10月 3 2017 spark-daemon.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 1262 10月 3 2017 spark-daemons.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 1190 10月 3 2017 start-all.sh #启动当前的master和所有的slaves
-rwxr-xr-x 1 elasticsearch elasticsearch 1274 10月 3 2017 start-history-server.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 2050 10月 3 2017 start-master.sh #启动当前的master
-rwxr-xr-x 1 elasticsearch elasticsearch 1877 10月 3 2017 start-mesos-dispatcher.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 1423 10月 3 2017 start-mesos-shuffle-service.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 1279 10月 3 2017 start-shuffle-service.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 3151 10月 3 2017 start-slave.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 1527 10月 3 2017 start-slaves.sh #启动所有的slaves
-rwxr-xr-x 1 elasticsearch elasticsearch 1857 10月 3 2017 start-thriftserver.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 1478 10月 3 2017 stop-all.sh #停止当前的master和所有的slaves
-rwxr-xr-x 1 elasticsearch elasticsearch 1056 10月 3 2017 stop-history-server.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 1080 10月 3 2017 stop-master.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 1227 10月 3 2017 stop-mesos-dispatcher.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 1084 10月 3 2017 stop-mesos-shuffle-service.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 1067 10月 3 2017 stop-shuffle-service.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 1557 10月 3 2017 stop-slave.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 1064 10月 3 2017 stop-slaves.sh
-rwxr-xr-x 1 elasticsearch elasticsearch 1066 10月 3 2017 stop-thriftserver.sh
启动start-all.sh
,使用jps
会看到主节点
[root@10 opt]# jps
14801 Worker
14722 Master
23292 Jps
从节点
[root@10 sbin]# jps
24830 Jps
23727 Worker
浏览器进入主节点IP:8080,你会看到如下画面
说明已经成功启动
由于不是yarn模式部署的,主节点挂掉之后,整个集群也就挂掉了。这个时候使用spark的高可用可以有效的避免这个问题。
在spark_env.sh
里面配置export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=10.25.1.114:2181,10.25.1.116:2181,10.25.1.117:2181"
可以配置spark的高可用。
当主节点挂掉之后,zookeeper会从剩下的standby的节点选择一个成为主节点,其中的耗时大约为一分钟多。
测试
./sbin/start_all.sh
于是114的master,114,116,117的worker启动了。./sbin/start_master.sh
,于是standby的一个master就启动了。这个时候登录116:8080还可以看到,这个主节点的状态为standby(114的为alive)./sbin/start_master.sh
。测试:运行114的./sbin/stop_master.sh
脚本,这样114的master就挂掉了。等待一分钟左右,你会发现114或者是117的其中一台变成了alive状态,且下面拥有三个workers,这就是spark的高可用。
spark项目的代码打包,这里使用的idea做开发工具,用的maven-shade进行一个项目的打包。
别的打包方式,很容易造成jar包的丢失,导致spark包classNotFound的错误。
下面是pom.xml打包部分的配置
<build>
<sourceDirectory>src/main/javasourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-shade-pluginartifactId>
<version>3.2.1version>
<configuration>
<filters>
<filter>
<artifact>*:*artifact>
<excludes>
<exclude>META-INF/*.SFexclude>
<exclude>META-INF/*.DSAexclude>
<exclude>META-INF/*.RSAexclude>
excludes>
filter>
filters>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.sunline.spark.sparkdemo.project.AnalysisLogKafkaStreamingmainClass>
<mainClass>com.sunline.spark.sparkdemo.project.CalcTwoLogsKafkaStreamingmainClass>
<mainClass>com.sunline.spark.sparkdemo.project.AnalysisGatewayLogKafkaStreamingmainClass>
transformer>
transformers>
configuration>
<executions>
<execution>
<phase>packagephase>
<goals>
<goal>shadegoal>
goals>
execution>
executions>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>8source>
<target>8target>
configuration>
plugin>
plugins>
build>
对项目进行打包。
在target下面,我们发现两个jar包:original-sparkdemo-1.0.0.jar
,sparkdemo-1.0.0.jar
。这里使用sparkdemo-1.0.0.jar
,把jar包上传到集群(三台机器都要上传一份,目录一样!!!
)
进入spark目录下,提交jar包给spark
[root@10 opt] ./bin/spark-submit \
--class com.sunline.spark.sparkdemo.project.AnalysisLogKafkaStreaming \ #mainclass的名字
--master spark://10.25.0.193:7077 \ #主节点
--deploy-mode cluster \ #采用cluster模式提交
--supervise \ # 要支持自动重启
--executor-memory 1g \ #每个executor的内存,默认是1G
--total-executor-cores 1 \ #所有executor总共的核数。
/opt/spark-2.1.2-bin-hadoop2.7/sparkdemo-1.0.0.jar \ #刚刚打的jar包
10.25.1.114:9092 testAppLog1 testAppLog #代码的入参,即main方法的args[]
此时,在114:8080就能看到有任务在跑了