一、系统介绍
整个用户画像(UserProfile)项目中,数据、业务及技术流程图如下所示:
其中数据源存储在业务系统数据库:MySQL 数据库中,采用SQOOP全量/增量将数据抽取到HDFS(Hive表中),通过转换为HFile文件加载到HBase表。
- 1)、编写MapReduce程序
- 2)、编写Spark程序(推荐使用Spark编程)
1)、为什么将【订单相关数据:订单数据和订单商品数据】存储到HBase表中????
- 特点:数据量比较大
- 存储HBase:存储海量数据、查询检索
2)、实际项目来说【访问行为日志】数据存储到Hive表中
- 数据仓库分层:
- ODS层、DW层和APP层
3)、特殊:模拟的所有业务数据存储在RDBMs表中,为了简化整个项目开发,重点在于标签开发,将所
- 有数据迁移到HBase表中。
二、电商数据
2.1、MySQL数据库
在数据库【 tags_dat
】中包含四张表:
1)、用户表:tbl_users
2)、订单数据表:tbl_orders
3)、订单商品表:tbl_goods
4)、行为日志表:tbl_logs
2.2、Hive 数据仓库
将MySQL数据库中表的数据导入到Hive表中,以便加载到HBase表中。
2.2.1、创建表
创建Hive中数据库Database:
CREATE DATABASE tags_dat;
根据MySQL数据库表在Hive数据仓库中构建相应的表:
2.2.1.1、用户信息表: tbl_users
sqoop create-hive-table \
--connect jdbc:mysql://chb1:3306/tags_dat \
--table tbl_users \
--username root \
--password 123456 \
--hive-table tags_dat.tbl_users \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'
2.2.1.2、订单数据表: tbl_orders
sqoop create-hive-table \
--connect jdbc:mysql://chb1:3306/tags_dat \
--table tbl_orders \
--username root \
--password 123456 \
--hive-table tags_dat.tbl_orders \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'
2.2.1.3、商品表: tbl_goods
sqoop create-hive-table \
--connect jdbc:mysql://chb1:3306/tags_dat \
--table tbl_goods \
--username root \
--password 123456 \
--hive-table tags_dat.tbl_goods \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'
2.2.1.4、行为日志表: tbl_logs
sqoop create-hive-table \
--connect jdbc:mysql://chb1:3306/tags_dat \
--table tbl_logs \
--username root \
--password 123456 \
--hive-table tags_dat.tbl_logs \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'
2.2.2、导入数据至Hive表
使用Sqoop将MySQL数据库表中的数据导入到Hive表中(本质就是存储在HDFS上),具体命令如下:
2.2.2.1、用户信息表: tbl_users
/sqoop import \
--connect jdbc:mysql://chb1: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
2.2.2.2、订单数据表: tbl_orders
2.2.2.3、商品表: tbl_goods
2.2.2.4、行为日志表: tbl_logs
2.3、数据导入(Import)到Hbase
将MySQL表中业务数据导入大数据平台中如HBase表,方案如下所示:
2.3.1、HBase 表设计
电商网站中各类数据(用户信息数据、用户访问日志数据及用户订单数据)存储到HBase表中,便于检索和分析构建电商用户画像,有如下几张表:
create 'tbl_users','detail'
create 'tbl_orders','detail'
create 'tbl_goods','detail'
create 'tbl_logs', 'detail', SPLITS => ['189394']
2.3.2、Sqoop直接导入
可以使用SQOOP将MySQL表的数据导入到HBase表中,指定 表的名称、列簇及RowKey ,范例如下所示:
sqoop import \
-D sqoop.hbase.add.row.key=true \
--connect jdbc:mysql://chb1: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
参数含义解释:
- 1、-D sqoop.hbase.add.row.key=true
- 是否将rowkey相关字段写入列族中,默认为false,默认情况下你将在列族中看不到任何rowkey中的字段。注意,该参数必须放在import之后。
- 2、–hbase-create-table 如果hbase中该表不存在则创建
- 3、–hbase-table 对应的hbase表名
- 4、–hbase-row-key hbase表中的rowkey,注意格式
- 5、–column-family hbase表的列族
知识拓展:如何使用SQOOP进行增量导入数据至HBase表,范例命令如下:
sqoop import \
-D sqoop.hbase.add.row.key=true \
--connect jdbc:mysql://chb1:3306/tags_dat \
--username root \
--password 123456 \
--table tbl_logs \
--hbase-create-table \
--hbase-table tag_logs \
--column-family detail \
--hbase-row-key id \
--num-mappers 20 \
--incremental lastmodified \
--check-column log_time \
--last-value '2019-08-13 00:00:00' \
相关增量导入参数说明:
- 1、–incremental lastmodified 增量导入支持两种模式 append 递增的列;lastmodified
时间戳。 - 2、–check-column 增量导入时参考的列
- 3、–last-value 最小值,这个例子中表示导入2019-08-13 00:00:00到今天的值
使用SQOOP导入数据到HBase表中,有一个限制:
需要指定RDBMs表中的某个字段作为HBase表的ROWKEY,如果HBase表的ROWKEY为多个字段组合,就无法指定,所以此种方式有时候不能使用。
2.3.3、importtsv
缺点
- 1)、ROWKEY不能是组合主键
- 只能是某一个字段
- 2)、当表中列很多时,书写-Dimporttsv.columns值时很麻烦,容易出错
2.3.4、HBase Bulkload(推荐)
转载:https://blog.csdn.net/wuxintdrh/article/details/116176078