【问题标题】:Execution of three parallel Spark Streaming jobs执行三个并行 Spark Streaming 作业
【发布时间】:2017-06-19 18:07:25
【问题描述】:

我在亚马逊的 EMR 集群上同时运行 3 个 Spark Streaming 进程。问题是这三个 Spark Streaming 作业之一基于toLocalIterator 进行处理:

dstreamdata.foreachRDD(entry => {
      entry.toLocalIterator.foreach

我注意到它卡住了(看起来它缺少资源左右),但它没有返回任何错误,只是没有对数据进行任何处理。

我对每个作业使用spark-submit 的以下参数:

spark-submit --deploy-mode cluster --executor-cores 6 --executor-memory 10g --num-executors 2 --conf spark.yarn.submit.waitAppCompletion=false --queue queue_name_of_spark_job

知道如何在不更改代码的情况下解决此问题吗?

【问题讨论】:

    标签: apache-spark spark-streaming


    【解决方案1】:

    1.1) 如果您使用 Kinesis 作为队列,请确保您的执行程序核心数量是 Kinesis 分片的两倍。这可能适用于 Kafka,我忘记了 kafka 连接器是如何工作的。这是因为连接器每个分片消耗一个核心,因此您必须确保您有可用的执行器核心来实际处理数据。

    过去,我每个 kinesis 分片使用一个执行器,每个执行器有 2 个或更多核心,在我的用例中运行良好。

    1.2) 目前,您的代码正在将所有数据作为迭代器取回给驱动程序。如果您有大量数据,您可能需要为驱动程序分配更多资源,以便它有能力处理 RDD 中的所有数据。这感觉有点不对劲:- 如果您可以将所有数据放在一个实例中,那么您真的不需要 Spark 的复杂性!

    Spark 2.0.x Configuration 为您提供可用的配置详细信息。

    我建议先查看driver.cores 和/或driver.memory。我怀疑您需要更多内核,但您需要进行试验。

    2) 感谢您不想更改代码,但是...如果可能的话,您可以使用entry.foreachPartition()

    这种方法避免了在驱动进程中处理所有数据的性能问题。它或逻辑的某些变体应该可以帮助您解决问题,具体取决于您的确切用例。

    这里是一些示例代码,其中包含更多信息的链接:

    dstream.foreachRDD { rdd =>
      // code here is executed by the driver
      rdd.foreachPartition { partitionOfRecords =>
        // code here is executed by the workers per partition
      }
    }
    

    http://spark.apache.org/docs/latest/streaming-programming-guide.html#design-patterns-for-using-foreachrdd

    【讨论】:

    • 我正在使用 Kafka,三个 Spark Streaming 作业中的每一个都从不同的 Kafka 队列中读取。这可能是一个原因吗?
    • 可以,但是不知道kafka连接器是怎么消耗资源的。但是您将需要调查日志。可能是执行者缺乏资源或驱动程序。尝试找出哪个 - 它可能是。
    猜你喜欢
    • 2016-08-31
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    相关资源
    最近更新 更多