【问题标题】:How Apache Spark partitions data of a big file [duplicate]Apache Spark如何对大文件的数据进行分区[重复]
【发布时间】:2019-01-04 19:27:27
【问题描述】:

假设我有一个4 nodes 集群,每个集群都有1 core。我有一个600 Petabytes 大小的大文件,我想通过Spark 处理它。文件可以存储在HDFS

我认为这样确定没有。分区数是文件大小/总数。集群中的核心数。如果确实如此,我将拥有4 partitions(600/4) 所以每个分区的大小都是125 PB

但我认为125 PB 对于分区来说太大了,所以我的想法与推断不相关是否正确。分区数。

PS:我刚开始使用Apache Spark。所以,如果这是一个幼稚的问题,请道歉。

【问题讨论】:

  • 我对您存储此文件的位置感兴趣....
  • @Arj - 在 HDFS 中,已在上面更新。它是在 HDFS 还是本地文件系统中是否重要?

标签: apache-spark hdfs data-partitioning


【解决方案1】:

当您将数据存储在 HDFS 上时,将根据您的 HDFS 配置将其分区为 64 MB 或 128 MB 块。 (让我们假设 128 MB 块。)

因此 600 PB 将产生 4687500000 个块,每个块 128 MB。 (600 PB/128 MB)

现在,当您运行 Spark 作业时,每个 executor 将读取少量数据块(块数将等于 executor 中的核心数)并并行处理它们。

基本上,每个核心将处理 1 个分区。所以你给执行器的核心越多,它可以处理的数据就越多,但同时你需要为执行器分配更多的内存来处理加载到内存中的数据的大小。

建议有中等规模的执行者。有太多的小型 executor 会导致大量的数据 shuffle。

现在进入您的场景,如果您有一个 4 节点集群,每个集群有 1 个核心。您将最多运行 3 个执行程序,因为火花驱动程序将使用 1 个内核。 因此,要处理数据,您将能够并行处理 3 个分区。 所以你的工作需要 4687500000/3 = 1562500000 次迭代来处理整个数据。

希望有帮助!

干杯!

【讨论】:

    【解决方案2】:

    回答您的问题,如果您已将文件存储在 HDFS 中,则它已经根据您的 HDFS 配置进行了分区,即如果块大小为 64MB,则您的总文件将被划分为这些块并分布在 Hadoop 集群中。 Spark 会根据你的 num.executors 配置生成任务来决定可以执行多少并行任务。期望 no_of_hdfs_blocks=no_of_total_tasks。

    接下来重要的是您如何处理此数据的逻辑,您是否正在对数据进行任何洗牌,类似于 repartition(*),它将在集群中移动数据并更改要由您的 spark 作业处理的分区号.

    HTH!

    【讨论】:

    • 我认为现在默认为 128MB
    • 很好解释,现在很清楚 Spark 如何处理 HDFS 中的大型文件存储,按块大小进行分区。我有一个疑问,如果我们存储在 S3 或网络驱动器中,而不是将大文件存储在 HDFS 中,那么在这种情况下文件将不会被分区,那么 Spark 将如何处理该文件。有人能解释一下这种情况吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2018-03-09
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多