当前位置: 首页 > 科技观察

用户画像系统技术架构及整体实现

时间:2023-03-22 12:50:01 科技观察

作者简介:杨思义,男,26岁,2015年6月毕业于山东大学齐鲁软件学院,工学硕士。2014年6月至今,就职于北京亚信智能数据技术有限公司BDX大数据事业部,2014年9月开始从事spark相关应用的开发工作,在此说明一下技术架构和整体实现用户画像,然后从数据整理、数据平台、面向应用三个方面讨论一个架构的实现(个人观点)。数据整理:1、数据指标的梳理来自各系统每日累计的日志记录。可以通过sqoop导入hdfs,也可以通过代码实现,比如spark的jdbc连接传统数据库进行数据缓存。另一种方式是将数据写入本地文件,然后通过sparksql的load或者hive的export导入HDFS。2.根据业务逻辑通过hive或者hiveql拼接ETL编写UDF,让用户对应不同的用户标签数据(这里的指标可以理解为给每个用户打上对应的标签),生成对应的源表数据,所以以方便后续的用户画像系统通过不同的规则生成tag-widetable。数据平台1、数据平台使用的分布式文件系统是Hadoop的HDFS,因为在Hadoop2.0之后,任何大数据应用都可以通过ResourceManager申请资源和注册服务。比如(sparksubmit,hive)等等。随着基于内存的计算框架的出现,Hadoop的MapReduce已经用不上了。当然,对于很多离线处理的业务,很多人还是倾向于使用Hadoop,但是hadoop封装的功能只有map和reduce,过于简单,不像spark这样的计算框架,封装的功能更多(参考博客火花专栏)。可以大大提高开发效率。2、计算框架采用Spark和RHadoop。Spark在这里有两个主要用途。一种是过滤数据进行数据处理和上层应用指定的规则(通过Scala编写spark代码提交到sparksubmit)。一种是SparkSQL服务于上层应用(通过启动sparkthriftserver连接前台应用)。RHadoop的应用主要在于标签数据的打分,比如利用协同过滤算法等各种推荐算法对数据进行多方面的打分。3、MongoDB内存数据的应用主要在于单个用户的实时查询。也是通过spark数据整理出来的tag-widetable的数据格式转换(json格式)导入到mongodb中。前端应用可以连接mongodb进行数据转换,从而显示单个标签。(当然也可以将数据在Redis中转换成key-value的形式,导入到Redis集群中。)4、mysql的作用是为上层应用存储标签规则,展示页面信息。后台宽数据表关联spark。连接mysql后缓存元数据,filter、select、map、reduce等元数据信息整理出来,再与Hdfs中实际存在的数据进行处理。面向应用从刚才数据平台的数据整理和计算,生成了服务于上层应用的大而宽的标签表。(对应用户的各种标签信息)。然后,前台根据业务逻辑,检查不同的标签,进行求和、剔除等操作。比如本月流量大于2亿用户(标签)+本月消费超过100元用户(标签)进行求和运算,通过前台代码拼接实现sql,挖掘客户数。这里是通过jdbc连接spark的thriftserver,通过集群计算HDFS上大表和宽表的计数。(这里需要注意的是,很多sql聚合函数和多表associationjoin等同于hadoop的mapreduce的shuffle,很容易造成内存溢出,相关参数调整可以参考本篇spark专栏的配置信息blog)这样就可以定位到对应的客户数量,从而分析客户群体和标签,匹配产品策略,实现精准营销。