解决:10亿条数据,分区太多,T级数据量,数据执行失败

背景:

最近想要抽出日志数据(1.3T左右,10几亿行),统计商品的pv,uv,收藏,加车,分享,销售数等等,根据这些信息加权,用于商品推荐。还需要将生成的数据,跨集群拷到另一个推荐集群
查看sparkui界面,发现数据分布在各台机器上比较均匀,但是shuffle read时间太长
在查表时,执行不出来,我推测是由于分区数太多引起,并且数据量太大。

解决:

1.将数据按天去抽取到一张中间表里

(1)可以建立一张表,不带分区,里面包含所有天的数据,然后where ds 按月 insert into 到tmp_table表中,例如 ds >= 2020-01-01 and ds <= 2020-01-31,机器跑的动的话,分12次跑完

#将一月份数据抽到中间表中
insert into table tmp_table
select
*
from
(select * from rz_table where ds >= '2020-01-01' and ds < '2020-02-01' and os in (3,4) ) p
#将二月份数据追加抽到中间表中,后面10个月以此类推,一年数据抽完后,写个每天同步当天的数据到中间表中的脚本,后面就不必如此麻烦
insert into table tmp_table
select
*
from
(select * from rz_table where ds >= '2020-02-01' and ds < '2020-03-01' and os in (3,4) ) p

(2)另种方法,建张分区表,然后动态分区,自动将数据插入到对应的天中。数据可以限制上半年动态分区插入执行一次,下半年动态分区执行一次(此方法,之前用过,目前场景下尚未证实)

2.然后主表再到中间表里面查询一年的数据

举个例子,将tmp_table数据查询出来,导入表中

#将从2019年12月20号到2020年12月20号的数据导入到APP.ITEM_table表
insert overwrite table APP.ITEM_table partition(ds='2020-12-20')
select
p.item_id
from
(select item_id
from tmp_table where ds = #2019年12月20号到2020年12月20号#
) p

3.需要写三个脚本,自动生成中间表,自动生成结果表,跨集群拷贝

前面两张表,日常开发完,搭配定时任务。
后面的跨集群拷贝脚本写完后,需要自己给脚本配置crontab,定时触发。
整个流程就可以自动化。

你可能感兴趣的:(大数据之Hive,hdfs,hadoop,hive,大数据)