问题
-
对于给定的文件,应该使用多少个分区?
例如,假设我有一个10GB 文件,3个执行器,每个执行器有 2 个内核,3G内存。
-
我应该重新分配吗?
-
我应该使用多少个分区?
-
做出选择的更好方法是什么?
-
会默认重新分区么?
分析
-
Spark可以为一个RDD的每个分区运行一个并发任务,直到并发任务数等于集群中的内核总数(逻辑内核-thread 数量)。
例如:
rdd = sc.textFile("file.txt", 5)
-
上面这行代码将创建一个带有 5 个分区的名为 textFile 的RDD。
-
假设您有一个具有3个内核的集群,并且假设每个分区需要处理5分钟。
-
对于上述带有5个分区的RDD, 3个分区进程将并行运行,因为有3个内核,而第4, 5个分区进程将在5分钟后处理,此时3个内核中的1个是空闲的
结论
-
决定一个RDD中分区数量的最佳方法:是使分区数量等于集群中的核数量,这样所有分区都将并行处理,并且以最佳方式利用资源。
-
深入问题
-
文件有10G大小,如果分区只有5, 那么每个分区数据与默认的数据块128M区别太大了。会不会有问题呢?
分析
-
是的,每个node shuffle 时候的最大数据传输是2G(受限与内部ByteBuffer最大值)
-
所以需要从新分区
分区的基本方法
-
coalesce 方法减少数据流中分区的数量(合并的方式-这种算法在某些情况下是快速的,因为它最小化了数据移动)
-
reparation 重分区算法对数据进行完全的重新排序,并创建大小相同的数据分区。
结论
-
通常,您可以通过将集群中的cpu数量乘以2、3或4来确定分区的数量
-
但在集群中需要同时考虑一下两点以确定可用的内核- 从而确定分区数
-
资源利用率
-
HDFS I/O 性能
-