假设我有一个4 nodes
集群,每个集群都有1 core
。我有一个600 Petabytes
大小的大文件,我想通过Spark
处理。文件可以存储在HDFS
中。
我认为确定否的方法。分区数为文件大小/总数。集群中的核心数量。如果确实如此,我将拥有4 partitions
( 600/4 ),因此每个分区的大小将为125 PB
。
但是我认为125 PB
的大小太大,无法进行分区,因此我的思想与推论否有关是否正确。分区。
PS:我刚从Apache Spark
开始。因此,如果这是一个幼稚的问题,我们深表歉意。
答案 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!