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

时间:2018-07-27 16:19:12

标签: apache-spark hdfs data-partitioning

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

我认为确定否的方法。分区数为文件大小/总数。集群中的核心数量。如果确实如此,我将拥有4 partitions 600/4 ),因此每个分区的大小将为125 PB

但是我认为125 PB的大小太大,无法进行分区,因此我的思想与推论否有关是否正确。分区。

PS:我刚从Apache Spark开始。因此,如果这是一个幼稚的问题,我们深表歉意。

2 个答案:

答案 0 :(得分:3)

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

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

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

基本上,每个内核将处理1个分区。因此,您为执行者提供的内核越多,它可以处理的数据就越多,但同时您将需要为执行者分配更多的内存,以处理加载到内存中的数据量。

建议有中等规模的执行者。太多的小型执行程序将导致大量数据混乱。

现在来看您的情况,如果您有一个4节点群集,每个群集1个核心。您最多将有3个执行程序在其上运行,因为将使用1个内核作为spark驱动程序。 因此,要处理数据,您将能够并行处理3个分区。 因此您的工作需要4687500000/3 = 1562500000迭代来处理整个数据。

希望有帮助!

干杯!

答案 1 :(得分:1)

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

接下来重要的是如何处理这些数据上的逻辑,是否进行任何数据改组,这类似于repartition(*),它将在集群中移动数据并更改要由Spark作业处理的分区号

HTH!