大数据分析的技术选型考虑
比如站点有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表,无需我们做额外的工作。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~

这是关于用户画像很实在的文章,谢谢分享。
一般的网站数据库中可能有1000万用户,但是真正活跃的用户就要少得到了,很多都是不再回来的用户。
我的想法是对1000万用户建立用户画像,没有必要,如果对7日活跃或者15日活跃用户建立相应的用户画像,用户不再那么多,用mysql不知道能否实现。每日删除旧表,重建一个新表,勉强可以维持吧
可以mysql实现,优先考虑把属性存成纵表。
如果存成纵表,以后进行数据分析,没有横表方便
Mysql5.7后支持json存储,这种方式对以后的数据分析也不方便,相对于纵表来说,是不是更好一些呢?
横表统计是方便的多, 不清楚json存储。
mysql做分析不适合做大数据分析, 可以作为一个短期方案先应付.
嗯,数据量达到几千万条后,mysql用起来有点吃力