作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在 Hive 中有 2 个表:user
和 item
我正在尝试计算每个表的 2 个特征之间的余弦相似度,以获得 2 个表之间的笛卡尔积,即交叉连接。
大约有 20000 个 users
和 5000 个 items
导致 1 亿
行计算。我在具有 12 个内核的 Hive Cluster 上使用 Scala Spark 运行计算。
代码有点像这样:
val pairs = userDf.crossJoin(itemDf).repartition(100)
val results = pairs.mapPartitions(computeScore) // computeScore is a function to compute the similarity scores I need
Spark作业总是会因为Hadoop集群上的内存问题(GC Allocation Failure)而失败。如果我将计算量减少到 1000 万左右,它肯定会工作 - 不到 15 分钟。
如何在不增加硬件规范的情况下计算整个集合?如果作业需要更长的时间运行并且不会中途失败,我会很好。
最佳答案
如果您查看 Spark 文档,您会发现 spark 使用不同的数据管理策略。这些策略由用户通过 spark 配置文件中的配置或直接在代码或脚本中启用。
“MEMORY_AND_DISK”策略对您有好处,因为如果数据 (RDD) 不适合 ram,那么剩余的分区将存储在硬盘中。但如果您必须经常访问硬盘驱动器,这种策略可能会很慢。
关于scala - 如何在 Spark 上执行大型计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54803212/
我是一名优秀的程序员,十分优秀!