Apache Spark 如何对大文件的数据进行分区

How Apache Spark partitions data of a big file

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

我觉得这样判断不行。分区数是 文件大小 / 总数。集群中的核心数量。如果确实如此,我将有 4 partitions(600/4) 因此每个分区的大小为 125 PB

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

PS: 我刚开始 Apache Spark。所以,如果这是一个天真的问题,我们深表歉意。

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

接下来重要的是您如何处理此数据的逻辑,是否对数据进行了任何改组,类似于 repartition(*),它将在集群中移动数据并更改要由您处理的分区号激发工作。

HTH!

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

所以 600 PB 将产生 4687500000 个块,每个块大小为 128 MB。 (600 petabytes/128 MB)

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

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

建议执行器大小适中。小执行器太多会导致大量数据混洗。

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

希望对您有所帮助!

干杯!