Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark定制Partioner vs SortByKey功能_Apache Spark_Rdd_Bigdata - Fatal编程技术网

Apache spark Spark定制Partioner vs SortByKey功能

Apache spark Spark定制Partioner vs SortByKey功能,apache-spark,rdd,bigdata,Apache Spark,Rdd,Bigdata,给定一个[K,V]的数据集,并且需要基于键进行连接,哪种方法提供了确保数据局部性/加快自定义分区器/散列分区器速度的最佳方法,或者使用SortBy()方法,然后是连接方法?为什么一种方法比另一种更有效 此外,如果大多数键都是相同的键,这会影响方法选择吗 案例1 val rdd = sc.parallelize(Seq(("gh5", "id1"), ("gh4", "id1"), ("gh5", "id2"),("gh5", "id3")) val sorted = rdd.sortBy(_.

给定一个[K,V]的数据集,并且需要基于键进行连接,哪种方法提供了确保数据局部性/加快自定义分区器/散列分区器速度的最佳方法,或者使用SortBy()方法,然后是连接方法?为什么一种方法比另一种更有效

此外,如果大多数键都是相同的键,这会影响方法选择吗

案例1

val rdd = sc.parallelize(Seq(("gh5", "id1"), ("gh4", "id1"), ("gh5", "id2"),("gh5", "id3"))

val sorted = rdd.sortBy(_._1)

val joined = sorted.join(sorted)
案例2

val rdd = sc.parallelize(Seq(("gh5", "id1"), ("gh4", "id1"), ("gh5", "id2"),("gh5", "id3"), ...)

val custom_partitioned = rdd.partitionBy(100)).persist()

val joined = custom_partitioned.join(custom_partitioned)

如果只考虑代码>连接< /代码>性能,并假设两者都是代码>排序的和定制的分区 RDDS被缓存,则应该有实际的差异。两者:

rdd.sortBy(u._1)

rdd.partitionBy(somePartitione)
将产生分区的RDD,并且此分区将被后续的
cogroup
利用


如果您考虑整个过程,包括
sortBy
/
partitionBy
,那么第二个选项应该更便宜,因为它不需要初始统计和本地排序。在某些情况下,基于排序的方法可能更可取,因为您希望得到高度倾斜的密钥分布,但在基数非常低的情况下,它不会帮助您。如果你认为可能是这样的话,你可以考虑笛卡尔积,然后是过滤器,但这应该作为最后的手段。

当出现一个高度倾斜的分布时,最好的方法是确保连接上的数据局部性/性能,或者实际上是执行相同函数的一种更好的方法。(建议的操作除外)。使用同一分区器进行洗牌后,根据定义,每个操作都是本地操作。并且分区器的选择(
RangePartitioner
用于排序)取决于您的数据和实际分布。没有单一的通用解决方案。如果您知道数据是以特定方式组织的,则可以创建反映这一点的自定义分区器。