Mat*_*att 1 scala distributed-computing apache-spark rdd
我试图了解Spark如何分区数据.假设我在图片中有一个像执行DAG的执行DAG(橙色框是舞台).这两个groupBy和join操作应该是非常沉重的,如果RDD的不分区.
那么使用.partitonBy(new HashPartitioner(properValue))P1,P2,P3和P4以避免随机播放是明智的吗?分区现有RDD的成本是多少?什么时候不适合分区现有的RDD?如果我没有指定分区程序,Spark是否会自动对我的数据进行分区?
谢谢
tl; dr你的问题的答案:如果可以的话,最好在一开始就进行分区; 可能少于不分区; RDD无论如何,你都是这样或那样的.是.
这是一个非常广泛的问题.它占据了我们课程的很大一部分!但是,让我们尝试尽可能多地解决分区问题,而无需编写小说.
如您所知,使用像Spark这样的工具的主要原因是因为您在一台机器上分析的数据太多而风扇听起来不像喷气引擎.数据在集群中所有计算机的所有核心之间分配,因此,根据数据,存在默认分区.请记住,数据已经静态分发(在HDFS,HBase等中),因此Spark默认根据相同的策略进行分区,以便将数据保存在已经存在的机器上 - 默认的分区数相等到群集上的核心数.您可以通过配置覆盖此默认号码spark.default.parallelism,并且您希望每台计算机的每个核心数为2-3.
但是,通常您希望属于一起的数据(例如,具有相同密钥的数据,HashPartitioner应用的位置)位于同一分区中,无论它们在何处启动,以便进行分析并最大限度地减少随后的混乱.Spark还提供了一个RangePartitioner,或者你可以很容易地自己动手.但是你认为从默认分区到自定义分区有一个前期的洗牌成本是正确的; 它几乎总是值得的.
通常明智的做法是在开始时进行分区(而不是延迟不可避免的partitionBy),然后repartition在需要时进行分类.稍后,您可以选择coalesce偶数(这会导致中间混乱)减少分区数量并可能使某些计算机和核心处于空闲状态,因为网络IO的增益(在此前期成本之后)大于CPU功率的损失.
(我能想到的唯一情况是你在一开始就不进行分区 - 因为你不能 - 当你的数据源是压缩文件时.)
另请注意,您可以使用mapPartitions和在地图转换期间保留分区mapPartitionsWithIndex.
最后,请记住,在您按比例扩展的过程中尝试分析时,可以使用以下诊断功能:
toDebugString看到RDDs 的血统getNumPartitions 令人震惊的是,得到分区的数量glom 清楚地看到您的数据是如何分区的如果您原谅无耻的插件,这些是我们在Analytics与Apache Spark中讨论的事情.我们希望尽快有一个在线版本.
| 归档时间: |
|
| 查看次数: |
1481 次 |
| 最近记录: |