我有一个20 TB的文件,我想在spark中重新分区,每个分区= 128 MB。但是在计算n= 20 TB/128 MB = 156250个分区后。我认为156250对于**df.repartition(156250)来说是一个非常大的数字在这种情况下,我应该如何处理重新分区?或者我应该将块大小从128 mb增加到128 gb。**但是每个任务128 gb会使执行器崩溃。请帮我拿这个。
kkih6yb81#
分而治之,你不需要在一个地方加载所有的数据集,因为这会消耗你大量的资源,也会因为洗牌交换带来网络压力。
mwg9r5ms2#
这里提到的块大小是HDFS的一个概念,它通过将数据分割成块(默认为128 M)并在之后进行复制来存储数据,以实现容错。如果您在HDFS上存储20 TB的文件,它将自动分割成20TB/128mb=156250块进行存储。对于Spark Dataframe repartition,首先它是一个转换而不是一个操作(有关两者之间差异的更多信息:https://spark.apache.org/docs/latest/rdd-programming-guide.html#rdd-operations)。这意味着仅在 Dataframe 上调用此函数不会执行任何操作,除非 Dataframe 最终用于某个操作。此外,应当理解,repartition值允许您定义涉及 Dataframe 的操作的并行度级别&应该主要考虑这些方面,而不是每个执行器处理的数据量。目标应该是根据可用资源最大化并行度,而不是试图每个执行器处理一定量的数据。此规则的唯一例外情况是,执行程序需要将所有这些数据保存在内存中,或者需要从这些数据中收集一些与正在处理的数据大小成比例的信息。这同样适用于运行在128 GB数据上的任何执行器任务。
20TB/128mb=156250
repartition
2条答案
按热度按时间kkih6yb81#
分而治之,你不需要在一个地方加载所有的数据集,因为这会消耗你大量的资源,也会因为洗牌交换带来网络压力。
mwg9r5ms2#
这里提到的块大小是HDFS的一个概念,它通过将数据分割成块(默认为128 M)并在之后进行复制来存储数据,以实现容错。如果您在HDFS上存储20 TB的文件,它将自动分割成
20TB/128mb=156250
块进行存储。对于Spark Dataframe
repartition
,首先它是一个转换而不是一个操作(有关两者之间差异的更多信息:https://spark.apache.org/docs/latest/rdd-programming-guide.html#rdd-operations)。这意味着仅在 Dataframe 上调用此函数不会执行任何操作,除非 Dataframe 最终用于某个操作。此外,应当理解,repartition值允许您定义涉及 Dataframe 的操作的并行度级别&应该主要考虑这些方面,而不是每个执行器处理的数据量。目标应该是根据可用资源最大化并行度,而不是试图每个执行器处理一定量的数据。此规则的唯一例外情况是,执行程序需要将所有这些数据保存在内存中,或者需要从这些数据中收集一些与正在处理的数据大小成比例的信息。这同样适用于运行在128 GB数据上的任何执行器任务。