加入收藏 | 设为首页 | 会员中心 | 我要投稿 阳江站长网 (https://www.0662zz.cn/)- 办公协同、云通信、区块链、物联平台、高性能计算!
当前位置: 首页 > 大数据 > 正文

折腾了一周的任务 带你解析大数据计算原理

发布时间:2021-06-05 13:17:02 所属栏目:大数据 来源:互联网
导读:一、任务背景 1.1 资源一:一个表 现在有一个表,名为Item 有item_group, item_id, feature 三个字段,分别代表物品所在的类别,物品ID,物品的特征 如下图: 折腾了一周的任务 带你了解大数据计算原理 2.2 资源二:相似度函数 还有一个函数F(feature1, feat
一、任务背景
1.1 资源一:一个表
现在有一个表,名为Item 有item_group, item_id, feature 三个字段,分别代表物品所在的类别,物品ID,物品的特征 如下图:
折腾了一周的任务 带你了解大数据计算原理
2.2 资源二:相似度函数
还有一个函数F(feature1, feature2) 输入两个物品的feature,返回这两个物品的相似度。
2.3 目标
现在需要计算的是在同一个类别下物品之间两两的相似度。
2.4 相关信息
1.item表总共300万条记录,parquet格式来存储,总大小36G2.总共有1.5万个item_group,最大的一个item_group有8000多个item3.feature是个json字符串,每个大概有8万Byte,约80K4.函数F平均一分钟处理10000条数据
大家可以帮我想想,如果你来做这个任务要怎么进行计算呢。
二、我的尝试
2.1 方案1:item和item join
上来就啥都没想,item和item用item_group join一下就能得到同一个item_group下的两两组合(这里我们成为item_pair),就可以计算相似度了。so easy。
select a.item_id  id1,     b.item_id id2,     F(a.feature, b.feature) score from item a join item b          on a.item_group = b.item_group           and a.item_id>b.item_id  
非常完美清晰,简单即有效,所有的数据基本都只用计算一次。然鹅几个小时之后:
折腾了一周的任务 带你了解大数据计算原理
org.apache.spark.shuffle.MetadataFetchFailedException:  Missing an  
output location for shuffle 0  
什么鬼读取shuffle失败,再仔细一看原来是熟悉的OOM(out of memory)。
折腾了一周的任务 带你了解大数据计算原理
ExecutorLostFailure (executor 20 exited caused by one of the running  
tasks) Reason:   Container killed by YARN for exceeding memory  
limits.    90.4 GB of 88 GB physical memory used.   Consider boosting 
  spark.yarn.executor.memoryOverhead.  
遇到这种状况加内存、加shuffle分区数(设置spark.sql.shuffle.partitions)这是常规操作
然鹅几个小时之后又挂了,还是一样的问题。难道是feature太大了?后来我把feature进行了压缩,从80k一下子压缩到了8K,结果又双叒挂了
方案1彻底卒。
2.2 方案2 先生成pair
冷静!我要冷静下来分析。既然是feature占了主要的内存,那我前期可以先不带上feature,先计算出需要计算的item_pair,第二步在计算的时候join上feature就可以了呀,我真是太聪明了。方案2:
select a.item_id  id1,    b.item_id id2,from item ajoin item b    on a.item_group = b.item_group     and a.item_id>b.item_id 
存为item_pair表然后再join feature 计算分数
select id1,  id2,  F(a.feature, b.feature) scorefrom item_pairjoin  
item a    on item_pair.id1=a.item_idjoin item b    on  
item_pair.id2=b.item_id 
结果又双叒叕过了好多个小时,item_pair表跑出来了正高兴着,结果第二部分,依旧挂掉,依旧memoryOverhead。怀疑人生了。
三、真正的认真分析
多次的失败终于使我冷静了下来,认真回忆起了spark相关的知识。下面是我认真的分析:
3.1 上文方案1的分析:
按照item_group自己和自己join的话,会如下图。下游会按照item_group聚集起来做join。

(编辑:阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读