首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >作为火花配对中的关键因素--恩纳姆--引发问题

作为火花配对中的关键因素--恩纳姆--引发问题
EN

Stack Overflow用户
提问于 2017-05-02 20:56:00
回答 1查看 1.1K关注 0票数 2

当RDD的键是或包含枚举时,PairRDD上的一些操作不能正常工作。

例如,以下星图代码将花费两周的工作日时间,并按工作日计算:

代码语言:javascript
代码运行次数:0
运行
复制
import java.time.DayOfWeek
val weekdays: Seq[(DayOfWeek, Int)] = DayOfWeek.values().map(dow => (dow, 1))
val numPartitions = 2 * weekdays.size
val result = sc
  .parallelize(weekdays ++ weekdays, numPartitions)
  .reduceByKey(_ + _)
  .collect
  .toSeq
println(result)

在输出中,我希望每个工作日(例如,MONDAY)都有计数2,但是在我的集群中,我得到:

代码语言:javascript
代码运行次数:0
运行
复制
WrappedArray(
  (THURSDAY,1), (SATURDAY,1), (WEDNESDAY,2), (SATURDAY,1),
  (MONDAY,2), (TUESDAY,2), (THURSDAY,1), (FRIDAY,2), (SUNDAY,2)
)

如果您在具有单个节点(或将numPartitions设置为1)的集群上运行此操作,则结果是正确的(即所有计数为2)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-02 20:56:00

Spark PairRDD的操作(如aggregateByKey()reduceByKey()combineByKey() )使用一个可选参数来指定Spark要使用的Partitioner。如果不显式地指定分区,则使用Spark的HashPartitioner,它调用一行的键的hashCode()方法,并使用它将行分配给分区。然而,如果枚举的hashCode()在相同的Java版本上运行,则不能保证在不同JVM进程- even上的hashCode()相同。因此,Spark xyzByKey()操作不能正常工作。

在上面的示例中,输入中有两对(THURSDAY, 1),每对都在不同的执行器上处理。该示例使用具有14个(= numPartitions)分区的numPartitions。因为(THURSDAY, 1).hashCode() % 14对这两个执行器产生不同的结果,所以这两行被发送到不同的执行器以减少,从而导致不正确的结果。

Bottomline:不对哈希码在不同的JVM进程上不一致的对象使用HashPartitioner。特别是,以下对象不能保证在不同JVM进程上生成相同的哈希代码:

  • 爪哇enum
  • Scala sealed trait-based enum的:
代码语言:javascript
代码运行次数:0
运行
复制
sealed trait TraitEnum
object TEA extends TraitEnum
object TEB extends TraitEnum
  • Scala abstract class-based enum的:
代码语言:javascript
代码运行次数:0
运行
复制
sealed abstract class AbstractClassEnum
object ACA extends AbstractClassEnum
object ACB extends AbstractClassEnum
  • 包含上述类型之一的嵌套对象的任何键(并且没有自定义的hashCode()实现)。

但是,Scala case class-based enum具有一致的哈希代码,因此可以安全地使用:

代码语言:javascript
代码运行次数:0
运行
复制
sealed case class CaseClassEnum(…) # “…" must be a non-empty list of parameters
object CCA extends CaseClassEnum(…)
object CCB extends CaseClassEnum(…)

附加信息:

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43747083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档