大数据分析的技术选型考虑

比如站点有1000万用户,用户有各类积分和行为信息,现在想做用户画像的话,基于MYSQL跑统计脚本能否玩的通呢?

一般来说,每个用户的画像简单存储为mysql的一行,有很多属性列,比如A列和B列。

我们从其他系统的mysql里挖掘出一些用户的A属性,希望写回到画像表,做法肯定是遍历挖掘结果,去画像表读出一行,如果用户画像不存在还要创建出来,之后再把A属性填上,将行写回去。

用户少还可以玩,假设有1000万,到底要跑多久才能搞得定呢?这就很难了,1000万次读,1000万次写,用一个单进程脚本读写mysql,中途异常就会中断,即便不中断又要跑多久呢?

先看问题是什么:首先挖掘出的A属性可能也是1000万行,可以直接插入到另外一张表或者sql dump到一个文件中。接下来,这些A属性要更新到对应的用户画像中,1000万用户就要读1000万次用户画像,因为你不读就不知道用户画像记录是否存在,不存在就要建立出来,这个真的无法避免。最后,需要把A属性填到对应的列中,写回这一行。

正是因为mysql是行存储的原因,所以必须通过读一次的方式确认用户记录是否存在。如果我们换成hbase这种列存储,那么直接写1000万次,将A属性作为某个列簇下的值写到hbase里即可。

我建议的做法是在hbase中保存用户画像,基本模型就是userid => {A属性,B属性,C属性}的映射,并在hive中以该hbase作为数据源建立对应hive表,便于后续基于画像数据的数据分析。(hive整合hbase参考这个

为了挖掘A,B,C属性,可以将mysql待挖掘数据同步到hdfs中并建对应的hive表,它作为挖掘属性的数据源,通过执行Hive sql,它基于mapreduce并行可靠的产出结果,快速的挖掘得到1000万用户的各类属性。

hive sql挖掘出的属性中间结果,可以直接更新到用户画像hive表(数据在hbase里)的对应userid中,存储在具体某个列下面,hive+hbase支持选择性的覆盖hbase的特定列而不影响其他列(例如:insert into hbase_table select col1,col2 from other_hive_table;),具体参考用法

对于mysql数据导入hive以及mysql数据增量导入hive的问题,可以用sqoop工具搞定。但是基于hive挖掘属性更新用户画像的行为本身是全量模型,如果我们想增量挖掘可以考虑给hive表建分区,同时在sqoop导入的时候自定义sql语句来输出用于分区的列值(比如用当前时间作为这一列),这样导入的数据会进入hive的一个新分区中,此后我们启动hive挖掘的时候可以用上次挖掘的时间作为条件,只处理分区值大于该时间的数据,不过这好像不太适合count类的增量计算,因为更新画像表的时候只能覆盖列,而不支持在列上进行加减操作,我们可以想象hive在跑hadoop时候对hbase进行increase操作,如果出现异常到底是加上了还是没加上呢?真的不太好做,所以覆盖是最可靠的。

另外,hive本身支持以hbase作为数据源建立hive表,无需我们做额外的工作。

 

发表评论

电子邮件地址不会被公开。