【问题标题】:do I need to use coalesce before saving my RDD data to file在将我的 RDD 数据保存到文件之前是否需要使用合并
【发布时间】:2015-10-29 21:15:55
【问题描述】:

想象一下,我有一个包含 100 条记录的 RDD,我用 10 条对其进行分区,所以每个分区现在有 10 条记录我只是将 rdd 转换为键值对 rdd 并将其保存到文件中,现在我的输出数据分为10 个分区对我来说没问题,但是在将输出数据保存到文件之前使用合并功能是最佳做法吗?例如 rdd.coalesce(1) 这只给出一个文件作为输出它不会在节点内打乱数据吗?想知道应该在哪里使用合并。

谢谢

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    如果您不需要,请避免使用coalesce。仅用于减少生成的文件数量。

    【讨论】:

    • 好的,在我的情况下,输出可以在 10 个文件中,我真的不介意,但是使用合并效果性能,因为它必须在不同节点之间打乱数据?
    • 没错,它将在单个节点上,在单个分区中执行,而不是并行执行。
    【解决方案2】:

    与任何事情一样,取决于您的用例; coalesce() 可用于增加或减少分区的数量,但需要付出一定的代价。

    如果您尝试增加分区数量(其中shuffle 参数必须设置为true),您将产生通过HashPartitioner 重新分配数据的成本。如果您尝试减少分区数量,shuffle 参数可以设置为 false,但从当前分区集中主动抓取的节点数量将是您要合并到的分区数量。例如,如果您要合并到 1 个分区,则只有 1 个节点会在从父分区中提取数据时处于活动状态(如果您要合并大量数据,这可能会很危险)。

    虽然有时您可以通过减小分区集大小(例如,在过滤器或稀疏内部连接之后)使您的作业更有效地运行,但合并可能很有用。

    【讨论】:

      【解决方案3】:

      你可以像这样简单地使用它

             rdd.coalesce(numberOfPartition) 
      

      如果您减少分区,它不会打乱数据,但如果您增加分区,它会打乱数据。它根据用例而定。但我们小心使用它,因为如果您减少的分区小于或不等于集群中的核心数,那么它就无法使用集群的全部资源。有时更少的 shuffle 数据或网络 IO,例如减少 rdd 分区但等于分区数,从而提高系统性能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-06
        • 2015-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        相关资源
        最近更新 更多