yjyyjy

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

问题

 

  • 对于给定的文件,应该使用多少个分区?

 

  例如,假设我有一个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 性能

 

posted on 2020-05-10 17:53  闭关49天  阅读(590)  评论(0编辑  收藏  举报