任务数量不等于Spark

时间:2016-07-21 21:18:59

标签: apache-spark

我有一个Spark应用程序执行以下操作

  1. 从S3中读取文件
  2. 通过“密钥”对数据进行分组并生成每键计数
  3. 将键值对保留到DB
  4. 我已将问题建模如下

    1. 获取驱动程序中的文件列表,并使用sc.parallelize生成文件名的RDD。我试图通过numberOfPartitions来控制sc.parallelize(filenameArray, sizeOfFilenameArray) - 让我们称之为filenamesRDD
    2. 并行下载S3中每个文件的内容并映射到用户定义的对象 - 让我们将此RDD称为objectsRDD
    3. pairRDD
    4. 生成objectsRDD
    5. 使用reduceByKey获取每个密钥的计数 - 让我们将此RDD称为countsRDD目前由于某个错误,我numberOfPartitions设置为1
    6. countsRDD
    7. 使用foreachPartitioncountsRDD保留到数据库
    8. 我有两个运行应用程序的环境

      • 测试 - 1台带2个CPU的机器。 spark.default.parallelism = 4
      • 的值
      • Prod - 2台机器,每台16个CPU。 spark.default.parallelism = 32
      • 的值

      正如所料,我的工作分两个阶段执行

      • 第1阶段:filenamesRDD - > objectsRDD - > pairRDD
      • 第2阶段:pairRDD - > countsRDD - > persistToDB

      我观察到在我的Prod环境中,为阶段1和阶段2生成的numberOfTasks不等于相应RDD中的numberOfParitions。我通过打印确认了numberOfPartitions的值。这是一个例子

      numberOfFiles = 100

      测试环境

      • 阶段1

        • 期望:numberOfTasks = 100,numberOfParitions = 100 objectsRDDpairRDD
        • 观察:匹配期望
      • Stage2的

        • 期望:numberOfTasks = 1,numberOfPartitions = 1 countsRDD
        • 现实:匹配期望

      产品环境

      • 阶段1

        • 期望:numberOfTasks = 100,numberOfPartitions = 100 objectsRDDpairRDD
        • 观察:numberOfTasks = 16,numberOfPartitions = 100 objectsRDDpairRDD
      • Stage2的

        • 期望:numberOfTasks = 1,numberOfPartitions = 1 countsRDD
        • 观察:numberOfTasks = 16,numberOfPartitions = 1 countsRDD

      我已经阅读了很多材料,我在numberOfPartitions != numberOfTasks看到的实例和解释都没有。有人可以帮助弄清楚发生了什么。

1 个答案:

答案 0 :(得分:2)

两个环境可能具有不同的配置值。您可以在历史记录页面中查看配置"环境"标签。 我建议比较Test和Prod环境设置。