TALEND WEBINAR : March 27th, 2018 | Step-by-Step to Enterprise Data Integration

Talend 与 Spark Submit 配置:有何区别?

Talend 与 Spark Submit 配置:有何区别?

  • Petros Nomikos
    I have 3 years of experience with installation, configuration, and troubleshooting of Big Data platforms such as Cloudera, MapR, and HortonWorks. I joined Talend in 2014, and prior to Talend I held positions as manager of technical support, and project manager for data warehouse implementations. In my current role, I assist companies in understanding how to implement Talend in their Big Data Ecosystem.
  • February 21, 2018

在上一篇博客“Talend 和 Apache Spark:技术入门指南”中,我给大家介绍了 Talend Spark 作业如何与 Spark Submit 相当。在本篇博文中,我打算继续通过 Apache Spark Submit 来评估 Talend Spark 配置。首先我们先来了解一下如何将 Talend Spark 作业中 Apache Spark 配置选项卡下的选项映射到您可以传递到 Spark Submit 的参数,并讨论一下其用途。我们开始吧。

命令差异

在您的环境中运行 Apache Spark 作业(如 Hadoop 集群上默认提供的一个 Apache Spark 示例,用于验证 Spark 是否按预期正常工作)时,会使用以下命令:

export HADOOP_CONF_DIR=XXX
./bin/spark-submit  --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client  --executor-memory 5G --num-executors 10 /path/to/examples.jar 1000

以上突出显示的两个命令用于设定我们的 Spark submit 作业将从中读取集群配置文件的目录。然后,我们发布 Spark submit 命令,在 YARN 集群上以客户端模式运行 Spark,使用 10 个内存为 5G 的执行器来运行我们的 Spark 示例作业。

接下来,让我们来看一下同一 Spark 示例作业如何在 Talend 中运行。当我们在 Talend 中运行 Spark 示例作业(如上述示例)时,将在“运行”选项卡的以下选项卡中输入所有 Spark 配置信息:

Figure 1

这就引出了几个问题。我们在 Talend 中输入的信息如何映射到我们在终端上输入的用以运行 Spark 作业的内容?我们如何知道需要多少执行器和内存?如何进行故障排除?在本篇博客中,我们将一一解答所有这些问题。

继续探讨之前,我想先介绍几个在本篇博客中将会用到的一些 Spark submit 选项。根据Apache Spark 文档,您可以将以下这些常见的选项传递到 Spark submit 脚本:

--classSpark 应用程序的主要入口点。

--Master在此选项中,您可以指定您的 Spark Master 是否为独立 Spark,或者您是否准备在 YARN 上使用 Spark。

--Deploy-mode如我上一篇博客所提及,该选项有两种不同的 YARN 模式可用,并详细说明如何部署 Spark driver。

--conf在此选项中,您可以传递您希望作业使用的其他 Spark 配置,比如“spark.executor.userClassPathFirst=true”。

--Application-jar这指的是您放置 Apache Spark 即将执行的 Spark 编译代码的路径。

--Application-arguments在此选项中,您可以传递特定于您的 Spark 代码的任何参数。

接下来我们讲讲如何在 Talend Spark 作业中使用上述选项。您将会注意到,在“运行”选项卡的“Spark 配置”选项卡下,您可以设置的不同选项按逻辑归入以下类别:

  1. 集群版本
  2. 配置
  3. 身份验证
  4. 调优
  5. Spark 历史记录

集群版本

我们先从集群版本类别中 Talend 作业的第一个选项谈起,即“Spark Mode(Spark 模式)”选项。

在此选项中,您可以指定您的 Spark Master 是否为 on YARN,或者您是否准备使用独立 Spark。该选项映射到我们之前介绍的用于 Spark submit 选项的“--deploy-mode”以及“--master”选项。例如,如果您在 Talend 中选择 Spark Mode 作为“YARN 客户端”,这等同于在 Spark submit 中指定“--master yarn --deploy-mode client”。如果您在该下拉框中选择独立模式,Talend 将提示您输入您的 Spark Master URL 相关信息,与您使用 Spark-submit 时进行的操作一样。这将映射到在 spark submit 中传递以下参数,即“--master spark://127.0.0.1:7077”。

配置

Talend 的“配置”类别要求提供以下信息:

在第一组复选框中,Talend 要求输入有关资源管理器、调度器地址、作业历史记录地址和暂存目录的信息。

使用 Spark submit时,所有这些信息将通过 HADOOP_CONF_DIR 注入到我们的 Spark 作业中。我们可以在运行 Spark submit 脚本之前将其设置为环境变量,或者在 /etc/environment 或 /etc/profile 中将其设为永久环境变量。需说明一点,在通过 spark submit 运行时,所有这些环境变量也可在 spark 作业引用的环境 shell 脚本中设置。该文件的名称为 spark-env.sh,始终位于 Spark 主机的“/etc/spark/conf”目录下。以下是集群中此 config 文件的示例:

在下一复选框中,将询问您是否希望定义 Hadoop 主目录,因为有时需要从 Spark 作业定义该主目录。在 Spark submit 作业中,也需要以同一方式传递此信息,但是环境变量名称为 HADOOP_HOME。在 Talend Spark 作业中,这些复选框执行“spark-env.sh”文件针对 Spark submit 脚本完成的操作,在 Spark 作业运行时间引用这些值。

介绍完 Talend Spark 配置中的配置类别,最后一个选项用于定义 Spark driver 的主机名或 IP 地址。当运行 Spark 作业的系统使用内部 IP 和外部 IP,或者主机名解析存在可能导致 Spark Master 和 Executor 难以重新连接回 Spark Driver 的问题时,这个选项非常有用。

默认情况下,如果未指定此选项,则该选项将尝试使用本地主机名并解析其 IP 地址。正如我们在上一篇博客中所述,Talend 目前使用 YARN — 客户端模式,因此 Spark Driver 始终在启动 Spark 作业的系统上运行。若将此映射到 Spark submit 提供的选项,那就是使用“--conf”选项进行指定,然后我们将提供以下键/值对“spark.driver.host=127.0.0.1”。这便是有关映射“Spark 配置”选项卡中配置子菜单下选项的全部内容。

身份验证

在身份验证类别中,我们可以选择 Hadoop 集群使用的身份验证方法:

如果我们不勾选此类别中的任何选项,我们的作业将假定集群使用简单的身份验证,并尝试使用我们指定的用户名连接至我们的 hadoop 集群。在 spark submit 情况中,此信息将输入到我们正在提交的应用程序 spark 配置中。

现在,如果我们继续并勾选选项“使用 Kerberos 身份验证”,将提示我们添加以下信息:

前两个字段为资源管理器和作业历史记录服务使用的服务主体名称。如果未勾选使用“keytab”的选项,那么当作业运行时,将查找其所运行系统上的 Kerberos 缓存票证,并查看特定于启动作业的用户的缓存以便使用有效的 Kerberos 票证。

如果勾选“keytab”选项,则需指定要使用的 keytab 以及要发布的用户主体名称。如此一来,当作业启动时,将根据该 keytab 为作业即将使用的主体生成一个 Kerberos 票证。就 Spark submit 而言,在您的应用程序中,您可能需要传递您在使用 Kerberos 进行身份验证的代码中设置的 Spark 配置。运行 spark-submit 之前,如果未使用 keytab 的话,您可能需要运行 kinit Kerberos 命令来生成一个票证;或者,如果使用 keytab 的话,则您可以借助使用 keytab 生成票证所需的标志运行 kinit 命令,或者在您指定用于从 keytab 登录的 Spark 应用代码中运行 kinit 命令。

调优

接下来我们谈谈 Talend 中的“调优”类别,该类别中提供“设置调优属性”选项,该选项始终默认为未勾选。勾选“设置调优属性”后,将自动显示以下选项:

现在我们来看看所有这些选项如何与 Spark submit 进行对应。

第一个选项是“设置 Application Master 调优属性”。利用该选项,用户可以设置 YARN Application Master 应使用的内存容量和核心数量。

YARN Application Master 实例的用途是协商来自资源管理器的资源,然后与节点管理器进行通信,以监控资源利用情况,并执行容器。如果该选项未经设置,则将默认分配给 YARN Application Master 512m 的内存容量和 1 个核心。若将此映射到我们如何将该选项作为一个选项传递至 Spark submit ,则我们可能需要使用“--conf”选项,然后向“--conf”选项传递以下两个键/值对“spark.yarn.am.memory=512m、spark.yarn.am.cores=1”。

我们还可以进行大量的额外设置,其中包括设置执行器数量、各执行器内存容量以及各执行器核心数量,并设置可以在接下来的选项中为各执行器分配的开销内存量。

默认值为:每个执行器 1g 内存,每个执行器 1 个核心,执行器内存开销默认为所使用执行器内存的 10%(最低为 384m),而且将请求 2 个执行器。若将此映射回如何在 Spark submit 中作为一个选项传递,则我们有两种不同的执行方法。其中一个是像我们在以上 Spark submit 命令示例“--executor-memory 5G --num-executors 10”中所述进行使用,或者使用“--conf”选项进行传递,然后使用以下键/值对“spark.executor.instances=2、 spark.executor.cores=1、 spark.executor.memory=2、 spark.yarn.executor.memoryOverhead=384m”。

下面是我们看到的下一个可用选项,用于询问有关 YARN 资源分配的信息:

其中包含“自动”、“固定”和“动态”选项,但这些选项是什么意思呢?Spark 为我们提供了选择如何分配执行器的功能。

如果选择“自动”,我们会注意到设置执行器数量的选项将消失,原因如上文所述,即其将使用 YARN 分配的默认值,也就是 2 个执行器。而如果设置为“固定”,我们就可以自己设置希望作业请求的执行器数量。最后一个选项是“动态”,通过该选项我们可以利用 Spark 提供的机制,根据运行时的需要动态调整分配给 Spark 作业的执行器数量。这意味着,我们的应用程序将可以在运行之时按需请求更多的执行器,并在不用时将执行器释放回 YARN。我们将可以看到,此选项如经选择,将为我们提供以下配置:

现在我们可以选择最初从 YARN 请求多少个执行器,然后在 Spark 执行作业时根据作业的工作负载指定最小和最大执行器数量。若要在 Spark submit 中传递此动态选项,您需要使用“--conf”选项,然后使用以下键/值对 “spark.dynamicAllocation.enabled=true、 spark.shuffle.service.enabled=true”。根据 Spark 文档 (https://spark.apache.org/docs/1.6.1/job-scheduling.html#dynamic-resource-allocation target="_blank"),如要使用此功能,需要这两项属性。

接着谈一谈 Talend“Spark 配置”选项卡中的调优类别,下一个复选框是“设置 Web UI 端口”。选中该复选框后,界面中将为您提供一个用于指定端口的选项,默认值为“4040”。该选项用途是,在您的 Spark 应用程序运行时,Spark driver 启动一个相关的 Web UI 用以监控运行中的 Spark 作业并检查作业执行情况。如果未选择此选项,将继续从上述默认端口开始,并不断增加端口数量,直到找到开放端口。如果您知道端口 4040 在您从中运行 Spark 作业的系统上不可用,并且您想要指定一个要使用的端口,而不是让 Spark 应用程序尝试查找开放端口,通常会用到此选项。就在 spark submit 中设置此选项而言,您将使用“--conf”选项,然后使用以下键/值对“spark.ui.port=4041”。

下一个可用选项是“广播工厂”,我们注意到针对该选项我们有多个子选项:

那么,“广播工厂”是做什么用呢?Spark 应用程序中的广播用于跨集群中所有执行器广播变量,这是为了便于快速高效地分发变量,而不是用单个节点处理一切操作。我们可以注意到,这里有三个选项可供选择。第一个选项是“自动”,选择该选项后,将使用默认值。第二个和第三个选项允许您选择使用 Torrent 或 HTTP 作为广播工厂。在 spark submit 中,如果您不想使用默认值(通常是 Torrent),则需要使用“--conf”选项进行传递,然后使用以下键/值对“spark.broadcast.factory=org.apache.spark.broadcast.TorrentBroadcastFactory”。

调优类别中最后一个选项是自定义要使用的 Spark serializer(Spark 序列化器):

Spark 文档 (https://spark.apache.org/docs/latest/tuning.html#data-serialization) 也强调了序列化在 Spark 中的重要性,此选项用于对执行器中的数据进行序列化,以提高在分布式环境中的性能。默认情况下,如果此选项未默认选中,则 Talend 会将要使用的序列化设置为 Kryo 序列化,这是最高效的序列化。如要在 spark submit 中尝试使用同一选项,则需使用“--conf”选项并指定以下键/值对“spark.serializer=org.apache.spark.serializer.KryoSerializer”。如果在 spark submit 中未指定此选项,则将使用默认 Java Serializer,而如果使用 Spark SQL Thrift Server,则将默认使用 Kryo Serializer。

Spark 历史记录

接下来,我们介绍最后一个类别“Spark 历史记录”。启用 Spark 日志记录后,我们会看到以下选项:

启用事件日志记录之后,您将可以在 HDFS 中指定一个目录(Spark 历史记录服务器可在该目录中读取作业历史记录文件),并指定历史记录服务器的地址。在 Spark submit 中,如要启用该功能,您将需要将以下键/值对传递到“--conf”选项以便进行启用和设置,即“spark.eventLog.enabled=true,spark.eventLog.dir=hdfs://namenode_host:namenode_port/user/spark/applicationHistory,spark.yarn.historyServer.address=http://spark_history_server:history_port”。

其他配置

介绍完“Spark 配置”选项卡中的不同类别,我们会发现还剩下三个可用的选项。第一个是“Spark 暂存目录”,该选项用于指定将在系统本地磁盘上使用的暂存目录,以便在您的应用程序运行时启动 Spark 作业。如使用 Spark submit,我们将需要利用“--conf”选项,然后传递“spark.local.dir=/tmp”。如果我们什么都没指定,那么默认将使用 /tmp 目录。

下一个选项用于激活 Spark 检查点,这使得我们的 Spark 作业可以在发生故障的情况下从特定的时间点恢复。激活后,我们会发现我们可以在本地文件系统或在 HDFS 中指定一个目录,以便于随着作业的进展及时进行保存。若要在 Spark submit 启用该选项,则必须按照 Spark 文档中所述在我们的 Spark 代码中完成。示例见本页 Spark 文档 (https://spark.apache.org/docs/1.6.0/streaming-programming-guide.html#checkpointing)。

最后一个选项是“高级属性”。在该选项中,可以添加任何我们想要以键/值对在我们的应用程序中传递的 Spark 属性。这与使用 Spark submit 时的操作相同,因为在使用 Spark submit 时需要在“--conf”选项中进行传递。

注意,如果仔细查看您的 Hadoop 集群以及其中一个 Spark Gateway 节点,您会发现上述提及的许多默认选择已经在名为 spark-defaults.conf 的特定文件中指定,该文件将在您运行 Spark 时使用,位于“/etc/spark/conf”下。如果接着打开该文件,您会看到其中包含此处所述的大多数属性。尽管如此,您仍然可以依上所述将这些属性覆盖,方法是将其作为选项传递到您的 Spark submit。下面就是一个例子:

结语

借助 Talend 提供的各种不同选项,您将可以配置您的 Spark 应用程序,并轻松选择复选框和下拉选项,指定您要使用的选项以及默认值。建议您仔细查看您可以在 Talend Spark 作业中使用的所有这些不同设置,体验如何针对您的环境轻松配置和优化这些设置。

 

参考文献

https://spark.apache.org/docs/latest/submitting-applications.html

https://spark.apache.org/docs/1.6.0/streaming-programming-guide.html#checkpointing

https://spark.apache.org/docs/latest/tuning.html#data-serialization

https://spark.apache.org/docs/1.6.1/job-scheduling.html#dynamic-resource-allocation

 

Most Downloaded Resources

Browse our most popular resources - You can never just have one.

Join The Conversation

0 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *