大数据用户画像实战之业务数据调研及ETL

Posted 黑马程序员官方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据用户画像实战之业务数据调研及ETL相关的知识,希望对你有一定的参考价值。

整个用户画像(UserProfile)项目中,数据、业务及技术流程图如下所示:

其中数据源存储在业务系统数据库:mysql 数据库中,采用SQOOP全量/增量将数据抽取到
HDFS(Hive表中),通过转换为HFile文件加载到HBase表。
1)、编写MapReduce程序
2)、编写Spark程序(推荐使用Spark编程)

1)、为什么将【订单相关数据:订单数据和订单商品数据】存储到HBase表中????
特点:数据量比较大
存储HBase:存储海量数据、查询检索
2)、实际项目来说【访问行为日志】数据存储到Hive表中
数据仓库分层:
ODS层、DW层和APP层
3)、特殊:模拟的所有业务数据存储在RDBMs表中,为了简化整个项目开发,重点在于标签开发,将所
有数据迁移到HBase表中。

1、电商数据(数据源)

所有的业务数据,都是编写程序模拟产生的,直接保存到MySQL数据库的表中。

1.1、MySQL 数据库

在数据库【 tags_dat 】中包含四张表:

1)、用户表:tbl_users
2)、订单数据表:tbl_orders
3)、订单商品表:tbl_goods
4)、行为日志表:tbl_logs

1.2、表的结构

电商系统中四张表的结构如下,数据存储在MySQL数据库中( 为了方便模拟业务数据,存

储MySQL表 )。

1.2.1、数据库: tags_dat

数据库 tags_dat ,构建语句如下:

1.2.2、会员信息表: tbl_users

电商网站中用户基本信息表,总共38个字段,除去主键ID外共37个字段信息。

此表中目前的数据量为:950条

1.2.3、订单数据表: tbl_orders

电商网站中用户购买物品下单的订单数据,总共112个字段,记录每个订单详细信息。

1.2.4、订单商品信息表: tbl_goods

电商网站中订单商品goods基本信息表,总共97个字段,除去主键ID外96个字段。

此表中目前的数据量为:125463条

1.2.5、行为日志表:tbl_logs

电商网站中用户浏览网站访问行为日志数据(浏览数据),总共11个字段,此类数据属于最多

此表中目前的数据量为:376983条

1.3、Hive 数据仓库

将MySQL数据库中表的数据导入到Hive表中,以便加载到HBase表中。

启动HiveMetastore服务和HiveServer2服务,使用beeline命令行连接,相关命令如下:

1.3.1、创建表

创建Hive中数据库Database:

根据MySQL数据库表在Hive数据仓库中构建相应的表:

  • 用户信息表: tbl_users

  • 订单数据表: tbl_orders

  • 商品表: tbl_goods

  • 行为日志表: tbl_logs

1.3.2、导入数据至Hive表

使用Sqoop将MySQL数据库表中的数据导入到Hive表中(本质就是存储在HDFS上),具体命

令如下:

用户信息表: tbl_users

订单数据表: tbl_orders

商品表: tbl_goods

行为日志表: tbl_logs

2、数据导入(Import)

将MySQL表中业务数据导入大数据平台中如HBase表,方案如下所示:

2.1、HBase 表设计

电商网站中各类数据(用户信息数据、用户访问日志数据及用户订单数据)存储到HBase表 中,便于检索和分析构建电商用户画像,有如下几张表:

用户基本信息: tbl_users

HBase表中有1个Region:

用户订单数据: tbl_orders ,共120125条

HBase 表中有两个Region:

订单商品数据: tbl_goods

行为日志数据: tbl_logs ,共376983条数据

HBase 表中有两个Region:

2.2、Sqoop直接导入

可以使用SQOOP将MySQL表的数据导入到HBase表中,指定 表的名称、列簇及RowKey ,范例如下所示:

参数含义解释:

知识拓展:如何使用SQOOP进行增量导入数据至HBase表,范例命令如下:

2.3、HBase ImportTSV

ImportTSV功能描述:

将tsv(也可以是csv,每行数据中各个字段使用分隔符分割)格式文本数据,加载到HBase表中。
1)、采用Put方式加载导入
2)、采用BulkLoad方式批量加载导入

使用如下命令,查看HBase官方自带工具类使用说明:

执行上述命令提示如下信息:

其中 importtsv 就是将文本文件(比如CSV、TSV等格式)数据导入HBase表工具类,使用说明如下:

分别演示采用直接Put方式和HFile文件方式将数据导入HBase表,命令如下:

其一、直接导入Put方式

上述命令本质上运行一个MapReduce应用程序,将文本文件中每行数据转换封装到Put对象,然后插入到HBase表中。

其二、转换为HFile文件,再加载至表

缺点:

1)、ROWKEY不能是组合主键
只能是某一个字段
2)、当表中列很多时,书写-Dimporttsv.columns值时很麻烦,容易出错

2.4、HBase Bulkload

在大量数据需要写入HBase时,通常有 put方式和bulkLoad 两种方式。 1、put方式为单条插入,在put数据时会先将数据的更新操作信息和数据信息 写入WAL , 在写入到WAL后, 数据就会被放到MemStore中 ,当MemStore满后数据就会被 flush到磁盘 (即形成HFile文件) ,在这种写操作过程会涉及到flush、split、compaction等操作,容易造 成节点不稳定,数据导入慢,耗费资源等问题,在海量数据的导入过程极大的消耗了系统 性能,避免这些问题最好的方法就是使用BulkLoad的方式来加载数据到HBase中。

2、BulkLoader利用HBase数据按照HFile格式存储在HDFS的原理,使用MapReduce直接批量生成HFile格式文件后,RegionServers再将HFile文件移动到相应的Region目录下

1)、Extract,异构数据源数据导入到 HDFS 之上。
2)、Transform,通过用户代码,可以是 MR 或者 Spark 任务将数据转化为 HFile。
3)、Load,HFile 通过 loadIncrementalHFiles 调用将 HFile 放置到 Region 对应的
HDFS 目录上,该过程可能涉及到文件切分。
1、不会触发WAL预写日志,当表还没有数据时进行数据导入不会产生Flush和Split。
2、减少接口调用的消耗,是一种快速写入的优化方式。
Spark读写HBase之使用Spark自带的API以及使用Bulk Load将大量数据导入HBase:
https://www.jianshu.com/p/b6c5a5ba30af

Bulkload过程主要包括三部分:

1、从数据源(通常是文本文件或其他的数据库)提取数据并上传到HDFS。
抽取数据到HDFS和Hbase并没有关系,所以大家可以选用自己擅长的方式进行。
2、利用MapReduce作业处理事先准备的数据 。
这一步需要一个MapReduce作业,并且大多数情况下还需要我们自己编写Map函数,而Reduce
函数不需要我们考虑,由HBase提供。
该作业需要使用rowkey(行键)作为输出Key;KeyValue、Put或者Delete作为输出Value。
MapReduce作业需要使用HFileOutputFormat2来生成HBase数据文件。
为了有效的导入数据,需要配置HFileOutputFormat2使得每一个输出文件都在一个合适的区
域中。为了达到这个目的,MapReduce作业会使用Hadoop的TotalOrderPartitioner类根据表的
key值将输出分割开来。
HFileOutputFormat2的方法configureIncrementalLoad()会自动的完成上面的工作。
3、告诉RegionServers数据的位置并导入数据。
这一步是最简单的,通常需要使用LoadIncrementalHFiles(更为人所熟知是
completebulkload工具),将文件在HDFS上的位置传递给它,它就会利用RegionServer将数据导
入到相应的区域。

扩展资料:

HBase Bulkload 实践探讨:
https://mp.weixin.qq.com/s?
__biz=MzAxOTY5MDMxNA==&mid=2455760296&idx=1&sn=1b3a22e9408c8da56eceb1da6c82a
fd4&chksm=8c686b8dbb1fe29b93f58d68453d2912061090170d2aedf405bcc42085f613a500
a5961c705d&mpshare=1&scene=1&srcid=&sharer_sharetime=1576666741316&sharer_sh
areid=ff29a1f4969433ad06b0e97aed8610cb&key=1528f3467aaa6c49e329b76e6d972c07a
60af4486519558312dbee8ffd84970262b22b7bebb2a3f1e9973ea0be66f1da80ee5b243f87e
376e2f6716fb7b56283cd83605b3209f92b5fb1d9f8196ad5b8&ascene=1&uin=MjY2MDcwNTg
wNQ%3D%3D&devicetype=Windows+10&version=62070158&lang=zh_CN&exportkey=A2zIu%
2B6h%2BOWb63wHEGVfjNw%3D&pass_ticket=6qtjVsuzNFWXgqT9TeVtBEN4F7%2FE6CB5am02k
9rqTMvtTFDfGDildp92S%2BeO77jb

2.4.1、编写MapReduce导入

将MySQL表的数据先导入到HDFS文件中(比如TSV格式),编写MapReduce将文本文件数据

转换为HFile文件,加载到HBase表中。

第一步、Hive中创建表

第二步、导入MySQL表数据到Hive表

第三步、编写MapReduce导入数据至HBase表

其一、创建HBase 表,设置预分区

create 'tbl_logs', 'detail', SPLITS => ['49394']

其二、工具类Constants,定义常量值

其三、MapReduce程序(本地运行) 使用Java语言,编写MapReduce程序,读取Hive表中数据文件,使用

HFileOutputFormat2输出格式,保存数据至HFile文件,再加载到HBase表中。

2.4.2、编写Spark 程序导入

企业中大规模数据存储于HBase背景:

项目中有需求,要频繁地、快速地向一个表中初始化数据。因此如何加载数据,如何提高速度是需要解
决的问题。
一般来说,作为数据存储系统会分为检索和存储两部分。检索是对外暴露数据查询接口。存储一是要实
现数据按固定规则存储到存储介质中(如磁盘、内存等),另一方面还需要向外暴露批量装载的工具。
如DB2的 db2load 工具,在关闭掉日志的前提下,写入速度能有显著提高。

HBase数据库提供批量导入数据至表功能,相关知识点如下:

1、Hbase 中LoadIncrementalHFiles 支持向Hbase 写入HFile 文件
2、写入的HFile 文件要求是排序的(rowKey,列簇,列)
3、关键是绕过Hbase regionServer,直接写入Hbase文件
4、Spark RDD的repartitionAndSortWithinPartitions 方法可以高效地实现分区并排序
5、JAVA util.TreeMap 是红黑树的实现,能很好的实现排序的要求

编写应用开发流程如下:

1、对待写入的数据按Key值构造util.TreeMap 树结构。目的是按Key值构造匹配Hbase 的排序结构
2、转换成RDD,使用repartitionAndSortWithinPartitions算子 对Key值分区并排序
3、调用RDD的saveAsNewAPIHadoopFile 算子,生成HFile文件
4、调用Hbase: LoadIncrementalHFiles 将HFile文件Load 到Hbase 表中

1)、批量加载数据类:HBaseBulkLoader,代码如下:

2)、将HBase数据库中不同表的字段信息封装object对象中,代码如下:

运行此应用程序时,需传递相关参数:

Spark Bulkload常见错误解析:

3、用户画像数据

基于电商数据,构建各个用户画像信息,开发项目时,设计的数据库和表(简易版本)如下:

3.1、标签模型表

用户画像平台将标签基本信息数据存储至MySQL数据库中,其中每个标签Tag的构建对应一个模型Model,模型数据同样存储至MySQL数据库中。

数据库: profile_tags

标签表: tbl_basic_tag

模型表: tbl_model

3.2、画像标签表

用户画像平台中用户的每个标签数据存储至HBase表中,此外在Solr中建立标签索引数据, 方便依据标签进行检索查询。

构建用户表: "tbl_profile" ,存储在HBase表中

样例数据:

以上是关于大数据用户画像实战之业务数据调研及ETL的主要内容,如果未能解决你的问题,请参考以下文章

大数据实战之用户画像概念项目概述及环境搭建

用户画像大数据之用户画像的原理应用与实现

MySQL实战演练——如何才能构建逾期用户画像?数据可视化

阿里巴巴大数据之路读书笔记——用户画像的定义

阿里巴巴大数据之路读书笔记——用户画像的定义

用户画像