数据源比方说是机场的航班数据,量在每天1亿。需要每天运行spark任务将航班数据转换为一定格式的结果数据(每天的结果数据有1亿,已经存在的结果数据30亿)。然后以结果数据的id做增量更新(原始结果有的话 更新,没有的话插入,将每天的1亿更新到30亿里)
这种场景用mysql 或者 oracle的话有对应的语法,比如oracle的mergeinto 一次就做完,但是mysql 和oracle 难以支撑这么大的数据量。
hbase 又不支持 merge into这种语法,需要将结果数据全量加载进来再和每天处理的数据作比对,这个过程很慢而且对内存的压力很大。
请问专家,这种场景该如何选型解决?
可以从你的底层存储方式着手,比如你的30亿数据是否可以划分成3层,内存区,热存储区,冷数据区,新的数据过来,先放内存,然后后台进程自动对内存中的数据跟热区数据进行比对是否存在,设置数据降级机制,哪些数据可能用的比较少可以先从内存中降级到热存储区
如果你想用hbase的话,建议你根据你的业务场景事先分配好region,1天的数据过来再插入之前可以用bloomfilter这个高效率的判断是否存在而不需要全部数据都加载到内存中,然后利用批量bulkload的方式,当然你要注意你的memstore设置大小,你的hstore设置大小
不管哪种数据插入方式肯定都后台去执行的插入操作。
个人想法,有错地方还请指出
在数据字段上加入哈希值 通过分组验证插入 分组策略自定义 从实际上取消数据库的读运算 减少数据库的读压力,插入也是分组的 一般在数据库上做了分区 ,有多个的缓冲池 可以大大加速插入
收起