集群上运行Spark

2017-05-05  本文已影响0人  Spike_3154

Spark集群是主从结构。节点分为驱动器(Driver) 节点以及执行器(executor) 节点。驱动器节点可以和大量的执行器节点进行通信, 它们也都作为独立的 Java 进程运行。驱动器节点和所有的执行器节点一起被称为一个 Spark 应用(application)。


驱动器节点

Spark驱动器是执行程序中的 main() 方法的进程。它执行用户编写的用来创建SparkContext、创建 RDD,以及进行 RDD 的转化操作和行动操作的代码。当启动 Spark shell 时,就启动了一个 Spark 驱动器程序(Spark shell 总是会预先加载一个叫作 sc 的 SparkContext 对象)。驱动器程序一旦终止, Spark 应用也就结束了。
主要职责

执行器节点

工作进程Spark 应用启动时, 执行器节点就被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。如果有执行器节点发生了异常或崩溃, Spark 应用也可以继续执行。
主要职责

集群管理器

Spark 依赖于集群管理器来启动执行器节点,而在某些特殊情况下,也依赖集群管理器来启动驱动器节点。集群管理器是 Spark 中的可插拔式组件。除了 Spark 自带的独立集群管理器, Spark 也可以运行在其他外部集群管理器上, 比如 YARN 。
不论你使用的是哪一种集群管理器,你都可以使用 Spark 提供的统一脚本 spark-submit 将你的应用提交到那种集群管理器上。 通过不同的配置选项, spark-submit 可以连接到相应的集群管理器上, 并控制应用所使用的资源数量。

任务的大致执行过程

  1. 用户通过 spark-submit 脚本提交应用。
  2. spark-submit 脚本启动驱动器程序,调用用户定义的 main() 方法。
  3. 驱动器程序与集群管理器通信,申请资源以启动执行器节点。
  4. 集群管理器为驱动器程序启动执行器节点。
  5. 驱动器进程执行用户应用中的操作。 根据程序中所定义的对 RDD 的转化操作和行动操
    作,驱动器节点把工作以任务的形式发送到执行器进程。
  6. 任务在执行器程序中进行计算并保存结果。
  7. 如果驱动器程序的 main() 方法退出,或者调用了 SparkContext.stop(),驱动器程序会终止执行器进程,并且通过集群管理器释放资源

spark-submit的使用
spark-submit的一些常见的标记如下:



其中的标记后可以接不同的参数,例如对于--master可以配置的参数如下表所示:


下面是一些应用部署的例子:

bin/spark-submit [options] <app jar | python file> [app options]
# 一般的执行格式如上

bin/spark-submit my_script.py
# 本地执行

bin/spark-submit --master spark://host:7077 --executor-memory 10g my_script.py
# --master 标记指定要连接的集群 URL;spark:// 表示集群使用独立模式。稍后会讨论其他的 URL 类型


$ ./bin/spark-submit \
--master spark://hostname:7077 \
--deploy-mode cluster \
--class com.databricks.examples.SparkExample \
--name "Example Program" \
--jars dep1.jar,dep2.jar,dep3.jar \
--total-executor-cores 300 \
--executor-memory 10g \
myApp.jar "options" "to your application" "go here"
# 使用独立集群模式提交Java应用

$ export HADOP_CONF_DIR=/opt/hadoop/conf
$ ./bin/spark-submit \
--master yarn \
--py-files somelib-1.2.egg,otherlib-4.4.zip,other-file.py \
--deploy-mode client \
--name "Example Program" \
 # 使用YARN客户端模式提交Python应用

打包代码以及依赖

对于python:你可以通过标准的 Python 包管理器(比如 pip 和 easy_install)直接在集群中的所有机器上安装所依赖的库, 或者把依赖手动安装到 Python 安装目录下的 sitepackages/ 目录中。 你也可以使用 spark-submit 的 --py-Files 参数提交独立的库,这样它们也会被添加到 Python 解释器的路径中。如果你没有在集群上安装包的权限,可以手动添加依赖库。
对于Java 和 Scala: spark-submit 的 --jars 标记提交独立的 JAR 包依赖。当只
有一两个库的简单依赖, 并且这些库本身不依赖于其他库时,这种方法比较合适。一
般 Java 和 Scala 的工程会依赖很多库。当你向 Spark 提交应用时,你必须把应用的整个依赖传递图中的所有依赖都传给集群。 你不仅要传递你直接依赖的库,还要传递这些库的依
赖, 等等。常规的做法是使用构建工具,生成单个大 JAR 包, 包含应用的所有的传递依赖。大多数 Java 或 Scala 的构建工具都支持生成这样的工件。例如java的maven以及scala的sbt。

独立的集群管理器

# 在主节点上:运行ssh-keygen并接受默认选项
$ ssh-keygen -t dsa
Enter file in which to save the key (/home/you/.ssh/id_dsa): [回车]
Enter passphrase (empty for no passphrase): [空]
Enter same passphrase again: [空]
# 在工作节点上:
# 把主节点的~/.ssh/id_dsa.pub文件复制到工作节点上,然后使用:
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
$ chmod 644 ~/.ssh/authorized_keys
# A Spark Worker will be started on each of the machines listed below.
192.168.142.136
192.168.142.137
spark-shell --master spark://masternode:7077
pyspark --master spark://masternode:7077
上一篇下一篇

猜你喜欢

热点阅读