【大数据】用户画像
企业数字化运营的用户数据资产管理平台
打通多源数据
统一用户识别
项目概述
用户画像:UserProfile、UserPersonal
给每个用户打上标签,本体论。
用户基本数据和用户行为数据。
第一类:用户基本信息数据,构建标签还原画像称为User Personal;
第二类:用户业务数据,使用APP产出数据,构建标签还原画像被称为User Profile;
描述一个人:
张三、女性、28岁,高级白领、旅游达人、水瓶座
将用户数据标签化
构建用户画像基础:
数据仓库 → 构建标签 → 构建用户画像 → 营销、推荐、报表
用户画像的应用场景
电商平台用户画像系统设计与开发
项目背景
本项目基于电商平台进行设计开发,旨在通过对注册会员的偏好、行为习惯及人员属性进行深度分析,实现用户画像的还原。该画像体系服务于营销平台和个性化推荐系统,以提升营销精准度,并为每个用户提供快速、准确的商品推荐。
核心业务数据来源
-
订单数据
- 包括购买记录、交易金额、支付方式、收货地址等。
-
访问日志数据
- 用户浏览轨迹、页面停留时间、点击行为、搜索关键词等。
-
会员注册基本信息
- 年龄、性别、地区、注册时间、会员等级等静态信息。
用户画像标签存储架构
存储类型 | 用途说明 |
---|---|
HBase 表 | 存储每个用户的个体画像(细粒度标签),支持高并发读写与海量数据存储。 |
ElasticSearch / Solr 索引 | 支持多维度标签组合查询,用于快速筛选符合特定条件的用户群体,服务于运营圈人、精准营销等场景。 |
项目平台架构
第一部分:标签管理平台
一、功能模块
- 基础标签管理
- 组合标签构建
- 画像模块
- 微观画像(单个用户)
- 群体画像(用户群特征分析)
- 标签查询系统
二、基础标签分类体系
1. 按数据来源划分
分类 | 描述 |
---|---|
人员属性 | 如性别、年龄、职业、教育程度、婚姻状况等。 |
商业属性 | 如消费频次、客单价、品类偏好、品牌偏好等。 |
行为属性 | 如登录频率、页面浏览路径、加购行为、收藏行为、搜索行为等。 |
用户价值 | 基于RFM模型或其他价值评估模型划分的高/中/低价值用户。 |
2. 按实现方式划分
类型 | 描述 |
---|---|
规则匹配标签 | 基于明确业务规则生成,如“近7天有下单”、“浏览过手机类目”。 |
统计类型标签 | 通过聚合计算得出,如“月均消费金额”、“访问频次”。 |
挖掘类型标签 | 利用机器学习或数据挖掘算法生成,如“潜在流失用户”、“价格敏感型用户”。 |
3. 标签等级划分
层级 | 名称 | 示例 |
---|---|---|
一级标签 | 主分类标签 | 用户属性、行为特征、消费能力 |
二级标签 | 主分类标签 | 人口属性、浏览行为、购买行为 |
三级标签 | 主分类标签 | 性别、年龄段、设备类型 |
四级标签 | 业务标签 | “女性用户”、“25-30岁用户”、“iOS设备用户” |
五级标签 | 属性标签 | 具体值标签,如 gender=female 、age=28 |
说明:层级越高,抽象程度越高;层级越低,越具体可执行。
第二部分:标签模型应用开发
开发模式
-
一个标签对应一个模型
每个标签由独立的数据处理逻辑生成。 -
一个模型即一个 Spark 程序
使用 Apache Spark 进行大规模离线/准实时计算。
支持批处理(T+1)与流式处理(近实时更新)两种模式。
输出结果写入 HBase 和 ES/Solr。
示例:标签模型流程
[原始数据] ↓ (ETL清洗)
[Spark Job] → 计算"近30天购买频次"↓ (输出)
[HBase] → 存储用户ID + 频次值
[ES/Solr] → 构建索引,支持按“购买频次 > 5”查询人群
项目背景
概述
基于电商平台进行设计界开发,是面向注册会员的偏好、行为习惯和人员属性的画像还原。帮助提升营销平台提升营销的精准度,也方便个性化推荐系统,快速准确的为每个用户推荐相关的商品。
- 业务数据
订单数据、访问日志数据、会员注册基本信息。 - 画像标签存储
- HBase表:每个用户的个体画像
- ElasticSearch、Solr索引:方便依据不同标签条件组成查询出相应用户群体。
- 项目平台:
- 第一部分:标签管理平台
- 第一块:基础标签、组合标签、画像模块(微观画像、群体画像)、标签查询
针对基础标签:分类和等级划分
从不同角度来说,标签划分不同类别
从数据源:人员属性、商业属性、行为属性和用户价值
从实现程度:规则匹配标签、统计类型标签、挖掘类型标签
标签划分等级
主分类标签:一级、二级、三级标签
业务标签:四级标签
属性标签:五级标签
第二部分:标签模型应用开发
一个标签对应一个模型,一个模型就是一个spark程序;
第三部分:
数据化运营
为什么使用Hbase数据库?因为对于用户的标签可能会增加,使用MySQL并不能很好的管理标签。
用户基础数据存储在Hbase中
元数据管理:管理标签
针对用户画像标签系统来说,需要管理整个系统中有多少类型标签,每个标签的对应值有哪些?
存储在MySQL中
画像数据
涉及的数据有两类:
- 第一类数据:标签数据(元数据MetaData) MySQL
- 存储标签的基本信息数据,每个标签名称、标签的值、标签的级别(类型)等。
- 第二类数据:用户画像标签
- 存储HBase表中,tbl_prifile
ROW_KEY:userId
列簇 ColumnFamily:- 用户标签列簇:user
- 商品标签列簇:item
- 列值:每个标签
tagName -> tagValue
- 在HBase Shell命令行中创建用户标签表
create 'tbl_profile', 'user', 'item'
- 存储ElasticSearch索引:tags_index
- 替换CDH 产品的 solr
- 存储HBase表中,tbl_prifile
架构
tag-web模块:标签管理平台
tag-model模块:给所有用户打上某个标签的值
tag-web模块依赖tag-model模块,tag-web平台执行tag-model模块中的一些应用,所以model模块先编译安装。
- 安装install
- 查看安装后的模块
[INFO] Installing D:\project\profile-tags\tags-model\target\tags-model_2.11-1.0.0.jar to D:\BigdataUser\m2-3.3.9\repository\cn\itcast\tags\tags-model_2.11\1.0.0\tags-model_2.11-1.0.0.jar
[INFO] Installing D:\project\profile-tags\tags-model\pom.xml to D:\BigdataUser\m2-3.3.9\repository\cn\itcast\tags\tags-model_2.11\1.0.0\tags-model_2.11-1.0.0.pom
不需要再配置Tomcat,直接使用SpringBoot。
画像技术架构图
- 数据源层
- MySQL数据库表、日志文件
- 数据存储层
- 采集工具:sqoop、flume、Cannal
- 数据分析层
- 主要使用SparkSQL、SparkMlib构建用户标签
- 标签数据存储:HBase、Solr/Elastcisearch
- 标签元数据
- 主要管理整个用户画像平台中哪些标签,标签的基本信息
- 存储在MySQL表中
- 每个标签开发完成后,每隔一段时间运行应用程序,给用户打上标签值
- 使用Oozie中Coordinator调度器。
技术架构图
功能架构图
用户画像:将用户数据进行标签化,给用户打标签。
HBase通过协处理器可以监控表中是否有数据变化。
用户画像标签开发中,按照标签开发难易程度划分:
- 规则匹配类型标签,可以理解为 if_else
- 统计类型标签,使用聚合函数统计
- 挖掘类型标签,设计机器学习算法
标签系统概述
基础标签
标签分类
在用户画像项目中,将标签按照级别进行划分,总共氛围5个级别标签。
- 1,2,3 主分类标签
- 4级 业务标签 性别标签
- 5级 属性标签 男女属性
为什么主分类是三级?是根据具体的电商场景为例。
以淘宝为例来说,淘宝网的子行业
天猫超市、苏宁易购等等
然后是用户。
一个标签(四级标签、业务标签)对应一个模型,每个模型对应一个spark应用。
1、标签表:tbl_basic_tag
2、模型表:tbl_model
标签规则:
当对所有用户计算该标签值时使用数据源信息。
用户基本信息表数据所在的数据源,以及对应的字段。
例如:从HBase表加载数据:
需要 ZooKeeper的地址信息:zkHosts、zkPort、zkNodePath、表的名称(table)、列簇(famliy)、字段(columns);
程序入口:对应的Spark应用运行主类
算法名称:挖掘类型、统计类型
算法引擎:jar包
模型参数:spark运行的资源参数
标签体系:
基础标签、组合标签
画像体系:
微观画像、标签查询
微观画像:从HBase表查询 tpl_profile 画像标签表,直接依据UserID查询即可。
标签查询:从搜索引擎Solr/ElasticSearch中进行查询。
大数据环境
企业的实际项目中:
大数据管理Web界面,方便安装部署和监控大数据框架组件:
CLouderManager:CM
Ambari:开源 /etc/
大数据平台基础环境
项目启动
ZooKeeper启动
cd /export/servers/zookeeper
./bin/zkServer.sh start
Hadoop启动
#启动Hadoop 的 namenode
hadoop-daemon.sh start namenode
#启动Hadoop的datanode
hadoop-daemon.sh start datanode
historyserver启动
mr-jobhistory-daemon.sh start historyserver/export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0/sbin/start-history-server.sh
yarn
yarn-daemon.sh start resourcemanageryarn-daemon.sh start nodemanager
[root@bigdata-cdh01 scripts]# cd ~
[root@bigdata-cdh01 ~]# clear
[root@bigdata-cdh01 ~]# ll
total 12
-rwxr–r-- 1 root root 2468 Nov 20 2019 env-bd.sh
-rw-r–r-- 1 root root 5710 Oct 8 21:57 zookeeper.out
env-bd.sh
hue启动
HUE_HOME=/export/servers/hue
HUE_LOG=${HUE_HOME}/hue-${DATE_STR}.log
/usr/bin/nohup ${HUE_HOME}/build/env/bin/supervisor > ${HUE_LOG} 2>&1 &
运行命令
#!/bin/bash# 设置 Spark 家目录
SPARK_HOME="/export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0"# 提交 Spark 应用到 YARN 集群(集群模式)
${SPARK_HOME}/bin/spark-submit \--master yarn \--deploy-mode cluster \--class org.apache.spark.examples.SparkPi \--driver-memory 512m \--driver-cores 1 \--executor-memory 512m \--executor-cores 1 \--num-executors 2 \--queue default \hdfs://bigdata-cdh01.itcast.cn:8020/spark/spark-examples_2.11-2.2.0.jar \10
业务数据调研以及ETL
业务数据:原始存储在MySQL中
业务数据:大数据存储在HBase中
那么如何将原始存储的数据导入到HBase中?
将MySQL表数据导入到HDFS/Hive中,将数据存储为HFile文件,直接加载至HBase表(MR,Spark)。
将MySQL表数据同步都爱HBase表,方案如下:
- Sqoop导入,增量或者全量
- MySQL 到 HBase
- Sqoop导入HDFS
- MySQL 到 HDFS
- HDFS到HBase中
1.使用MapReduce程序
2.使用Spark程序
3.ImportTsv工具类,底层也是MapReduce程序
启动HBase数据库
切换到
cd /export/scripts/
然后运行脚本:
启动 HiveMetastore 服务和 HiveServer2 服务
sh metastore-start.shsh hiverserver2-start.sh
使用 beeline 命令行连接
/export/servers/hive/bin/beeline!connect jdbc:hive2://bigdata-cdh01.itcast.cn:10000
#查看是否有10000端口的监听
netstat -anp | grep :10000
#输入用户名及密码
Enter username for jdbc:hive2://bigdata-cdh01.itcast.cn:10000: root
Enter password for jdbc:hive2://bigdata-cdh01.itcast.cn:10000: ****
创建表
创建数据库
CREATE DATABASE tags_dat;
USE tags_dat;
使用 Sqoop 创建 Hive 表
用户信息表:tbl_users
/export/servers/sqoop/bin/sqoop create-hive-table \
--connect jdbc:mysql://bigdata-cdh01.itcast.cn:3306/tags_dat \
--table tbl_users \
--username root \
--password 123456 \
--hive-table tags_dat.tbl_users \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'
订单数据表:tbl_orders
/export/servers/sqoop/bin/sqoop create-hive-table \
--connect jdbc:mysql://bigdata-cdh01.itcast.cn:3306/tags_dat \
--table tbl_orders \
--username root \
--password 123456 \
--hive-table tags_dat.tbl_orders \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'
商品表:tbl_goods
/export/servers/sqoop/bin/sqoop create-hive-table \
--connect jdbc:mysql://bigdata-cdh01.itcast.cn:3306/tags_dat \
--table tbl_goods \
--username root \
--password 123456 \
--hive-table tags_dat.tbl_goods \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'
行为日志表:tbl_logs
/export/servers/sqoop/bin/sqoop create-hive-table \
--connect jdbc:mysql://bigdata-cdh01.itcast.cn:3306/tags_dat \
--table tbl_logs \
--username root \
--password 123456 \
--hive-table tags_dat.tbl_logs \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'
导入数据到Hive表中
通过Sqoop工具导入到Hive表中;
用户信息表:tbl_users
/export/servers/sqoop/bin/sqoop import \
--connect jdbc:mysql://bigdata-cdh01.itcast.cn:3306/tags_dat \
--username root \
--password 123456 \
--table tbl_users \
--direct \
--hive-overwrite \
--delete-target-dir \
--fields-terminated-by '\t' \
--lines-terminated-by '\n' \
--hive-table tags_dat.tbl_users \
--hive-import \
--num-mappers 1
订单数据表:tbl_orders
/export/servers/sqoop/bin/sqoop import \
--connect jdbc:mysql://bigdata-cdh01.itcast.cn:3306/tags_dat \
--username root \
--password 123456 \
--table tbl_orders \
--direct \
--hive-overwrite \
--delete-target-dir \
--fields-terminated-by '\t' \
--lines-terminated-by '\n' \
--hive-table tags_dat.tbl_orders \
--hive-import \
--num-mappers 10
商品表:tbl_goods
/export/servers/sqoop/bin/sqoop import \
--connect jdbc:mysql://bigdata-cdh01.itcast.cn:3306/tags_dat \
--username root \
--password 123456 \
--table tbl_goods \
--direct \
--hive-overwrite \
--delete-target-dir \
--fields-terminated-by '\t' \
--lines-terminated-by '\n' \
--hive-table tags_dat.tbl_goods \
--hive-import \
--num-mappers 5
行为日志表:tbl_logs
/export/servers/sqoop/bin/sqoop import \
--connect jdbc:mysql://bigdata-cdh01.itcast.cn:3306/tags_dat \
--username root \
--password 123456 \
--table tbl_logs \
--direct \
--hive-overwrite \
--delete-target-dir \
--fields-terminated-by '\t' \
--lines-terminated-by '\n' \
--hive-table tags_dat.tbl_logs \
--hive-import \
--num-mappers 1
数据迁移ETL
如何将业务数据从MySQL迁移(ETL)到HBase表中,不同方案。
涉及到编写程序:MR程序、Spark程序
数据导入
- Sqoop导入
- 直接将MySQL数据库表的数据同步导入至HBase表,底层运行MapReduce程序。
- MapReduce导入
- Spark RDD导入
- 编写程序,读取HDFS上文件数据,导入到HBase表中,需要将MySQL表的数据导入到HDFS、Hive中。
- 针对MapReduce导入,直接使HBase提供工具类ImportTsv,自己编写MapReduce导入。
启动HBase
hbase-daemon.sh start master
hbase-daemon.sh start regionserver
HBase创建表
#进入HBase中
hbase shell
#列出所有的表
list
#创建四张表 tbl_logs tbl_orders tbl_users tbl_goods
create 'tbl_users', 'detail'
create 'tbl_orders', 'detail'
create 'tbl_goods', 'detail'
create 'tbl_logs', 'detail', SPLITS => ['189394']
数据迁移 - Sqoop导入
可以使用 Sqoop 将 MySQL 表的数据导入到 HBase 表中,需指定表的名称、列簇及 RowKey。示例如下:
/export/servers/sqoop/bin/sqoop import \
-D sqoop.hbase.add.row.key=true \
--connect jdbc:mysql://bigdata-cdh01.itcast.cn:3306/tags_dat \
--username root \
--password 123456 \
--table tbl_users \
--hbase-create-table \
--hbase-table tbl_users \
--column-family detail \
--hbase-row-key id \
--num-mappers 2
使用 Sqoop 从MySQL导入到HBase,有一个限制:组合字段主键。
需要指定 RDBMs 表中的某个字段作为HBase表的RowKey,如果HBase表的RowKey为多个字段组合,就无法指定,那么这种方式就无法使用。
数据迁移 - HBase ImportTSV工具导入
ImportTSV 是 HBase 提供的一个工具,用于将 TSV(Tab-Separated Values)格式的文本数据导入到 HBase 表中。TSV 文件也可以是 CSV 格式,每行数据中各个字段使用分隔符分隔。
支持两种导入方式:
- 使用
Put
方式逐条加载导入。 - 使用
BulkLoad
方式进行批量加载导入。
查看 HBase 官方自带工具的使用说明,执行以下命令:
HADOOP_HOME=/export/servers/hadoop
HBASE_HOME=/export/servers/hbase
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`:${HBASE_HOME}/conf ${HADOOP_HOME}/bin/yarn jar ${HBASE_HOME}/lib/hbase-server-1.2.0-cdh5.14.0.jar
importtsv
Usage: importtsv -Dimporttsv.columns=a,b,c <tablename> <inputdir>
标签模型调度
每个标签对应一个模型,每个模型就是一个Spark应用程序,使用Oozie调度。
- 方式1:编写配置文件,使用命令行运行Oozie Job;
- 方式2:Oozie继承Hue,编写Oozie Job并调度执行;
- 方式3:Oozie Java Client API创建Oozie Job并执行;
标签存储与计算和用户画像开发时模块
- 理解标签数据存储与计算
- 开发整个用户画像时,模块组合及准备环境
- 工具类模块
- Web平台模块
- 标签模型开发模块