Spark:作业停留在100

时间:2018-01-18 15:35:13

标签: apache-spark bigdata

我是Spark的新手,我必须支持我们的顾问编写的应用程序。我阅读并观看了大量有关Spark的信息,但我仍然在努力解决这些小细节以正确调整工作。

情景:

  1. 包含5个清理规则的Java类,我们在4亿条记录的RDD上应用这些规则。
  2. 分区数设置为1000。
  3. 最终"行动"是在S3上写入,但在此之前我们将分区数量减少到100。
  4. Spark UI显示了进展,但不幸的是,在保存的最后阶段,任务停留在98/100
  5. 我没有使用.collect(),但我使用.map()和Spark SQL。
  6. 以下是我用来写的代码:

    rdd.coalesce(100)
       .write().mode("append")
       .partitionBy("year", "month")
       .format(SPARK_AVRO_PACKAGE)
       .save(appProps.getProperty(PAGEVIEW_CLEANSED));
    

    我不确定是否应该努力改进代码或调整spark / cluster的性能。

    UPDATE :我认为这段代码对我遇到的问题负有责任。我在SO上发现了类似的帖子(Spark not distributing load to tasks evenly),我不知道如何在我的情况下使用广播。

    Dataset<Row> duplicatePrefetchPrerenderHashDS = 
                hashedPageViewDS
                  .select(hashedPageViewDS.col(PREFETCH_PRERENDER_HASH))
                  .groupBy(hashedPageViewDS.col(PREFETCH_PRERENDER_HASH))
                  .count()
                  .withColumnRenamed("count", "cnt")
                  .where("cnt>1");
    

1 个答案:

答案 0 :(得分:0)

您可以采取多种方法:

  1. 您可以尝试分发(“年”,“月”)这将确保每个文件夹只有1个分区写入。如果数据在年份和月份之间均匀分布。

  2. 如果问题实际上在某些年份出现偏差。然后我会说使用重新分区(1000)以及使用distributeBy(“年”,“月”,“COL1”)。在上面的例子中,COL1将是一个几乎像MONY或DATE的DAY一样事件分布的列。现在,不是将200(默认随机排序值)文件写入每个分区,而是COL1将决定没有写入的文件(30是有几天)

  3. 另一件有用的事情是使用重新分区(100)而不是合并(100),因为重新分区将均匀分布数据,从而导致更多分区为输出中的每个分区提供数据。

    < / LI>