已经安装Java,并且正确设置了JAVA_HOHE环境变量的服务器,在$SPARK_HOME路径,通过如下命令即可在单机环境上本地运行交互式Spark shell。Spark shell可以理解为Spark自身提供的交互式应用程序。
./bin/spark-shell --master local[2]
--master,指定分布式集群的Master-Spark-Url。local以一个线程本地运行;local[N]以n个线程本地运行。--master选项默认是local[*]方式启动Spark。
要获得/bin/spark-shell脚本完整的选项列表,请使用--help选项运行spark-shell脚本。
Standalone集群
除了在Mesos或YARN集群管理器上运行之外,Spark还提供了一个简单的Standalone部署模式。通过手动启动一个Master服务进程和一个或多个Worker服务进程,或者使用提供的集群启动脚本,来启动一个Standalone集群。也可以在一台机器上运行Master和Worker进程进行测试。
Spark中的安全性默认为OFF。这可能意味着默认情况下很容易受到攻击。
安装Spark的Standalone集群
要安装Spark Standalone模式,只需在集群的每个节点上放置一个编译版本的Spark。
手动方式启动集群
手动启动集群,不需要配置$SPARK_HOME/conf/slaves文件,只需要在主机执行start-master.sh脚本, 在从机执行start-slave.sh脚本。
通过如下命令,启动一个standalone模式的Master服务。
./sbin/start-master.sh
启动master后,会在控制台打印一个spark://host:port的Master-Spark-Url。也可以在master的Web UI上找到这个Master-Spark-Url,master的Web UI默认路径是http://localhost:8080。
通过Master-Spark-Url将worker进程连接到Master,该Master-Spark-Url可以作为SparkContext的“master”参数传递给SparkContext,从而使Application连接到集群。
通过如下命令,启动worker,并通过以下方式将他们连接到master服务器。
./sbin/start-slave.sh <Master-Spark-Url>
启动了一个worker后,可以在master的Web UI界面看到新启动的worker节点,以及它的CPU和内存数量。
最后,可以将以下配置选项传递给master和worker:
Argument | Meaning |
-h HOST, --host HOST | Hostname to listen on |
-i HOST, --ip HOST | Hostname to listen on (deprecated, use -h or --host) |
-p PORT, --port PORT | Port for service to listen on (default: 7077 for master, random for worker) |
--webui-port PORT | Port for web UI (default: 8080 for master, 8081 for worker) |
-c CORES, --cores CORES | Total CPU cores to allow Spark applications to use on the machine (default: all available); only on worker |
-m MEM, --memory MEM | Total amount of memory to allow Spark applications to use on the machine, in a format like 1000M or 2G (default: your machine's total RAM minus 1 GB); only on worker |
-d DIR, --work-dir DIR | Directory to use for scratch space and job output logs (default: SPARK_HOME/work); only on worker |
--properties-file FILE | Path to a custom Spark properties file to load (default: conf/spark-defaults.conf) |
集群启动脚本
要用启动脚本启动一个Standalone模式的spark集群,需要在$SPARK_HOME/conf目录中创建一个名称为slaves文件,该文件必须包含要启动spark workers的所有机器的主机名,每行一个。如果$SPARK_HOME/conf/slaves文件不存在,则启动脚本默认为一台机器(localhost),这对于测试很有用。
注意,Master节点通过ssh访问每个Worker节点。默认情况下,ssh并行运行,并且需要设置集群节点间的无秘钥访问。如果没有设置集群节点间的无秘钥访问,则可以设置环境变量SPARK_SSH_FOREGROUND,并为每个worker连续提供密码。
设置好$SPARK_HOME/conf/slaves文件后,使用以下shell脚本启动或停止集群,这些脚本在$SPARK_HOME/sbin中。
脚本 | 说明 |
start-master.sh | 在执行脚本的节点上启动Master服务。 |
start-slave.sh | 在执行脚本的节点上启动Worker服务。 |
start-slaves.sh | 在conf/slaves文件中指定的每个节点上启动一个Worker服务。 |
start-all.sh | 启动一个Master服务和多个Worker服务,如上所述。 |
stop-master.sh | 停止通过sbin/start-master.sh脚本启动的Master服务。 |
stop-slaves.sh | 停止conf/slaves文件中指定的节点上的所有Worker服务。 |
stop-all.sh | 停止一个Master服务和多个Worker服务,如上所述。 |
请注意,除start-slave.sh脚本之外,其他脚本必须在要运行Master服务的节点上执行。
可以通过在conf/spark-env.sh中设置环境变量来进一步配置集群。该文件默认不存在,需要将conf/spark-env.sh.template文件重命名为conf/spark-env.sh,并将其复制到所有worker节点上,以使设置生效。以下设置可用:
环境变量 | 含义 |
SPARK_MASTER_HOST | 将Master绑定到特定的主机名或IP地址,例如公共主机名或IP地址。 |
SPARK_MASTER_PORT | Start the master on a different port (default: 7077). |
SPARK_MASTER_WEBUI_PORT | Port for the master web UI (default: 8080). |
SPARK_MASTER_OPTS | 以“-Dx=y”(默认值:无)形式,仅适用于Master的配置属性。有关可能选项的列表,请参见下面。 |
SPARK_LOCAL_DIRS | Directory to use for "scratch" space in Spark, including map output files and RDDs that get stored on disk. This should be on a fast, local disk in your system. It can also be a comma-separated list of multiple directories on different disks. |
SPARK_WORKER_CORES | Total number of cores to allow Spark applications to use on the machine (default: all available cores). |
SPARK_WORKER_MEMORY | Total amount of memory to allow Spark applications to use on the machine, e.g. 1000m, 2g (default: total memory minus 1 GB); note that each application's individual memory is configured using its spark.executor.memory property. |
SPARK_WORKER_PORT | Start the Spark worker on a specific port (default: random). |
SPARK_WORKER_WEBUI_PORT | Port for the worker web UI (default: 8081). |
SPARK_WORKER_DIR | Directory to run applications in, which will include both logs and scratch space (default: SPARK_HOME/work). |
SPARK_WORKER_OPTS | Configuration properties that apply only to the worker in the form "-Dx=y" (default: none). See below for a list of possible options. |
SPARK_DAEMON_MEMORY | Memory to allocate to the Spark master and worker daemons themselves (default: 1g). |
SPARK_DAEMON_JAVA_OPTS | JVM options for the Spark master and worker daemons themselves in the form "-Dx=y" (default: none). |
SPARK_DAEMON_CLASSPATH | Classpath for the Spark master and worker daemons themselves (default: none). |
SPARK_PUBLIC_DNS | The public DNS name of the Spark master and workers (default: none). |
将应用程序连接到群集
要在Spark集群上运行application,只需将Master服务的spark://host:port传递给SparkContext构造函数即可。
要在集群上运行交互式Spark shell,请运行以下命令:
./bin/spark-shell --master spark://IP:PORT
通过选项--total-executor-cores <numCore>来控制Spark Shell在集群上使用的核心数。
启动Spark应用程序
$SPARK_HOME/bin/spark-submit脚本提供了向集群提交已编译的Spark应用程序的最直接方法。
对于standalone模式的集群,Spark目前支持两种部署模式:
在client模式下,driver程序直接在spark-submit进程中启动,该进程充当应用程序的client;
在cluster模式下,driver程序是从集群内的一个worekr进程启动的,client在履行提交应用程序的职责而不等待应用程序完成时立即退出。
如果应用程序是通过spark-submit脚本启动的,那么应用程序的jar包将自动分发到所有Worker节点。
对于所提交的应用程序依赖的任何其他jar包,通过--jar选项指定,多个jar包使用逗号作为分隔符(例如--jars jar1,jar2)。
此外,Standalone模式下使用cluster部署模式的应用程序,退出时使用非零退出代码,支持自动重新启动应用程序。要使用这个特性,可以在启动应用程序时使用--supervise选项。
要控制应用程序的配置或执行环境,请参见Spark配置。
可以通过以下方式,终止一个反复失败的应用程序。
./bin/spark-class org.apache.spark.deploy.Client kill <master url> <driver ID>
可以在Master的Web UI界面页面(http://<master url>:8080)
找到driver ID。
资源调度
standalone集群模式目前只支持跨应用程序的简单FIFO(先进先出)调度程序。
为了允许多个并发用户,可以控制每个应用程序将使用的最大资源数。默认情况下,它将获取集群中的所有核心,这只有在一次运行一个应用程序时才有意义。可以通过在SparkConf中设置spark.cores.max来限制核心的数量。例如:
val conf = new SparkConf()
.setMaster(...)
.setAppName(...)
.set("spark.cores.max", "10")
val sc = new SparkContext(conf)
此外,可以在集群主进程上配置spark.deploy.defaultCores
参数,以更改未将spark.cores.max设置为小于无穷大的应用程序的默认值。为此,请将以下内容添加到conf/spark-env.sh:
export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=<value>"
这对于共享集群很有用,因为在共享集群中,用户可能没有单独配置最大数量的核心。
executors调度
分配给每个executor的核心数量是可配置的。当spark.executor.cores被显式设置时,如果worker有足够的内核和内存,那么可以在同一个worker上启动来自同一应用程序的多个executor。否则,每个executor默认获取worker上的所有可用核心,在这种情况下,在一个单独的计划迭代期间,每个应用程序只能在每个worker上启动一个executor。
监控和日志记录
Spark的standalone模式提供了一个基于Web的用户界面来监视集群。Master服务和每个Worker服务都有自己的Web UI,用于显示集群和作业统计信息。默认情况下,通过8080端口访问Master的Web UI。可以在配置文件中或通过命令行选项更改端口。
此外,每个job的详细日志输出也会写入每个Worker节点的work目录(默认为$SPARK_HOME/work)。在work目录中将看到每个作业有stdout和stderr两个文件,所有输出都写入其控制台。
与Hadoop一起运行
想要将Spark集群与Hadoop集群一起运行,可以在相同的节点上分别启动Hadoop服务和Spark服务。要从Spark访问Hadoop数据,只需使用hdfs://url(通常是hdfs://<namenode>:9000/path,可以在Hadoop Namenode的Web UI上找到正确的url)。
或者,可以为Spark设置一个单独的集群,并让它通过网络访问HDFS;这将比本地磁盘访问慢,但是如果仍然在相同的局域网中运行(例如,在Hadoop所在的每个机架上放置一些Spark机器),那么这可能不是问题。
为网络安全配置端口
一般来说,Spark集群及其服务并不部署在公网环境中。它们通常是私有服务,应该只能在部署Spark的组织的网络中访问。对Spark服务使用的主机和端口的访问应该仅限于需要访问服务的原始主机。
这对于使用standalone资源管理器的集群尤其重要,因为它们不支持像其他资源管理器那样的细粒度访问控制。
有关要配置的端口的完整列表,请参见安全性页面。
HA
待补充……