页面树结构

版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

本节讨论部署 Spark Streaming 应用程序的步骤。

要求

要运行一个 要运行一个 Spark Streaming 应用,你需要有以下几点。

  • 有管理器的集群 - 这是任何 这是任何 Spark 应用程序都需要的需求,详见 部署指南
  • 将应用程序打为 将应用程序打为 jar 包 - 你必须编译你的应用程序为 你必须编译你的应用程序为 jar 包。如果你用 spark-submit 启动应用程序,你不需要将  启动应用程序,你不需要将 Spark 和 Spark Streaming 打包进这个 打包进这个 jar 包。 如果你的应用程序用到了高级源(如 如果你的应用程序用到了高级源(如 kafkaflume),你需要将它们关联的外部 ),你需要将它们关联的外部 artifact 以及它们的依赖打包进需要部署的应用程序jar包中。例如,一个应用程序用到了TwitterUtils,那么就需要将 ,那么就需要将 spark-streaming-twitter_2.10 以及它的所有依赖打包到应用程序  以及它的所有依赖打包到应用程序 jar 中。
  • 为 executors 配置足够的内存-因为接收的数据必须存储在内存中,executors 必须配置足够的内存用来保存接收的数据。注意,如果你正在做 必须配置足够的内存用来保存接收的数据。注意,如果你正在做 10 分钟的窗口操作,系统的内存要至少能保存 分钟的窗口操作,系统的内存要至少能保存 10 分钟的数据。所以,应用程序的内存需求依赖于使用 它的操作。
  • 配置 配置 checkpointing - 如果  如果 stream 应用程序需要 应用程序需要 checkpointing,然后一个与 ,然后一个与 Hadoop API 兼容的容错存储目录必须配置为检查点的目录,流应用程序将 兼容的容错存储目录必须配置为检查点的目录,流应用程序将 checkpoint 信息写入该目录用于错误恢复。
  • 配置应用程序 配置应用程序 driver 的自动重启 - 为了自动从 为了自动从 driver 故障中恢复,运行流应用程序的部署设施必须能监控 故障中恢复,运行流应用程序的部署设施必须能监控 driver 进程,如果失败了能够重启它。不同的集群管理器,有不同的工具得到该功能 进程,如果失败了能够重启它。不同的集群管理器,有不同的工具得到该功能
    • SparkStandalone : 一个 一个 Spark 应用程序 应用程序 driver 可以提交到 可以提交到 Spark 独立集群运行,也就是说  独立集群运行,也就是说 driver 运行在一个 运行在一个 worker 节点上。进一步来看,独立的集群管理器能够被指示用来监控 节点上。进一步来看,独立的集群管理器能够被指示用来监控 driver,并且在 ,并且在 driver 失败(或者是由于非零的退出代码如 失败(或者是由于非零的退出代码如 exit(1)或者由于运行 或者由于运行 driver 的节点的故障)的情况下重启 的节点的故障)的情况下重启 driver
    • YARN : YARN 为自动重启应用程序提供了类似的机制。
    • Mesos : Mesos 可以用Marathon提供该功能
  • 配置 配置 write ahead logs - 在  在 Spark 1.2 中,为了获得极强的容错保证,我们引入了一个新的实验性的特性-预写日志(write ahead logs)。如果该特性开启,从 receiver 获取的所有数据会将预写日志写入配置的 获取的所有数据会将预写日志写入配置的 checkpoint 目录。 这可以防止 这可以防止 driver 故障丢失数据,从而保证零数据丢失。这个功能可以通过设置配置参数 spark.streaming.receiver.writeAheadLogs.enable 为 true 来开启。然而,这些较强的语义可能以 来开启。然而,这些较强的语义可能以 receiver 的接收吞吐量为代价。这可以通过 并行运行多个 并行运行多个 receiver 增加吞吐量来解决。另外,当预写日志开启时,Spark 中的复制数据的功能推荐不用,因为该日志已经存储在了一个副本在存储系统中。可以通过设置输入 中的复制数据的功能推荐不用,因为该日志已经存储在了一个副本在存储系统中。可以通过设置输入 DStream 的存储级别为 的存储级别为 StorageLevel.MEMORY_AND_DISK_SER 获得该功能。

 

升级应用程序代码

如果运行的 Spark Streaming应用 程序需要升级,有两种可能的方法。

  • 启动升级的应用程序,使其与未升级的应用程序并行运行。一旦新的程序(与就程序接收相同的数据)已经准备就绪,旧的应用程序就可以关闭。这种方法支持将数据发送到两个不同的目的地(新程序一个,旧程序一个)
  • 首先,平滑的关闭(StreamingContext.stop(...) 或 JavaStreamingContext.stop(...))现有的应用程序。在关闭之前,要保证已经接收的数据完全处理完。然后,就可以启动升级的应用程序,升级的应用程序会接着旧应用程序的点开始处理。这种方法仅支持具有源端缓存功能的输入源(如 flumekafka),这是因为当旧的应用程序已经关闭,升级的应用程序还没有启动的时候,数据需要被缓存。