任务的提交以及Standalone集群模式的部署
spark-submit
首先需要打包代码,如果你的代码需要依赖其他的包环境则需要单独的打包这些依赖,应为cluster会将所有依赖的jar包分发到各个节点上进行使用。推荐的方法是将依赖包和程序都统一的打成一个包,这样就可以直接使用spark-submit方法来运行,具体的pom.xml配置如下:
<dependencies>
<dependency> <!-- Spark dependency -->
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>1.4.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.13</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<!-- 使用1.7 jdk进行编译 -->
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.5</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
spark && hadoop 的scope值都设置为provided,然后打包的过程是把需要依赖的第三方东西打成一个统一的jar包去运行,使用的是maven-compiler-plugin插件。
在服务器上提交的命令如下:
./bin/spark-submit \
--class <main-class>
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]
spark-submit 可以加载一个配置文件,默认是加载在conf/spark-defaults.conf
Spark Standalone Mode
除了运行在Mesos和YARN集群之外,spark也提供了简单的独立部署模式。可以通过手动的启动master和worker,也可以通过spark提供的启动脚本来启动。独立部署也可以通过运行在一个机器上,进行测试。
- 为了安装你需要放置一个编译好的spark版本到每个机器上。
- 启动集群有两种方式,一种是手动启动,另一种是通过启动脚本启动。
手动启动spark集群
启动一个独立的master可以使用如下的命令:
./sbin/start-master.sh
一旦启动可以通过访问:http://localhost:8080端口访问master,打出的spark://HOST:PORT 的URL,work节点可以使用这个链接连到master上。
可以使用如下的命令来使worker节点连接到master上:
./sbin/start-slave.sh <worker#> <master-spark-URL>
worker在加入到master后可以访问master的http://localhost:8080,可以清洗的看到被加入的worker节点的信息。
在启动master和worker的时候可以带上参数进行设置,参数的列表如下:其中比较重要的是:
- -c CORES, 这个是指定多少个cpu分配给spark使用,默认是全部cpu
- -m MEM,这个是指定多少的内存分配给spark使用,默认是全部的内存的减去1g的操作系统内存全部分配给spark使用。一般的格式是1000M or 2G
- -d DIR, 这个指定spark任务的日志输出目录。
- –properties-file FILE 指定spark指定加载的配置文件的路径默认是: conf/spark-defaults.conf
脚本方式部署
通过spark的部署脚本部署首先需要在spark的主目录下创建一个conf/slaves的文件,这个文件中每一行代表一个worker的hostname.需要注意的是,master访问worker节点是通过SSH访问的,所以需要master通过ssh无密码的登录到worker,否则需要设置一个 SPARK_SSH_FOREGROUND的环境变量,这个变量的值就是每个worker的密码
然后可以通过spark安装目录下的sbin/….sh文件进行启动, 如果要启动和停止master和slave可以使用:
- sbin/start-all.sh
- sbin/stop-all.sh
注意的是这些脚本必须是在master机器上执行
同时你可以通过配置集群的 conf/spark-env.sh文件来进一步配置集群的环境。但是这也文件需要通过拷贝conf/spark-env.sh.template文件来创建,并且需要把这个文件拷贝到所有的worker节点上。
其中: SPARK_MASTER_OPTS && SPARK_WORKER_OPTS 两个配置项比较复杂。
通过在SparkContext构造器中传入spark://IP:PORT这个来启用这个集群。同时可以在交互式的方式启动脚本中使用:./bin/spark-shell –master spark://IP:PORT 来启动集群执行。
独立部署模式的集群现在只是简单的支持FIFO调度。 为了允许多个并发用户,可以通过SparkConf设置每个应用程序需要的资源的最大数。默认情况下,它会请求使用集群的全部的核,而这只是同时运行一个应用程序才回有意义。
val conf = new SparkConf()
.setMaster(...)
.setAppName(...)
.set("spark.cores.max", "10")
val sc = new SparkContext(conf)
除了可以在程序中指定你也可以在spark-env.sh中设置默认的值,
export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=<value>"
spark的高可用设置
spark的高可用设置有两种,一种是通过Zookeeper来实现,另一种是通过本地文件系统来实现。
- 使用ZooKeeper备份master,利用zookeeper提供的领导选举和状态保存,你可以让更多的master连接到zookeepre实例。一个将会被选举为leader其他的则会保存备份他的状态。如果master死掉,zookeeper可以选举一个新的leader,整个过程需要1到2分钟的时间,但是这个过程只会对新的任务调度有影响。为了使用这种方式需要的配置项为:SPARK_DAEMON_JAVA_OPTS,这个配置项有三个配置信息:spark.deploy.recoveryMode/spark.deploy.zookeeper.url/spark.deploy.zookeeper.dir
- 使用本地文件系统来恢复该节点。为了使用这种方式需要的配置项为:SPARK_DAEMON_JAVA_OPTS,这个配置项有两个配置信息:spark.deploy.recoveryMode、spark.deploy.recoveryDirectory
网友评论