huaweicloud-analytics-reference-architecture:SaaS项目数据全流程分析与可视化解决方案

本项目旨在为开发者数据分析平台搭建提供技术方案参考,通过前端埋点产生的日志行为数据以及后端产生的业务数据为基准,在hive数仓中进行离线分析,按天分区存储,将结果存储在obs中,最后通过dlv进行可视化展示。

分支3Tags0
文件最后提交记录最后更新时间
4 年前
4 年前
4 年前
4 年前
4 年前
4 年前
4 年前
4 年前
4 年前
4 年前
4 年前
4 年前
4 年前

项目介绍

本项目是是华为云开发者团队基于SaaS项目技术支持实践,通过前端埋点产生的日志行为数据以及后端产生的业务数据为基准,通过在hive数仓中进行离线分析,按天分区存储,将结果存储在obs中,最后通过dlv进行可视化展示。

数据来源

大数据解决方案有一个或者多个数据源对接,包括:

  • 关系型数据库(Relational Database Service,简称RDS)业务数据。
  • 应用程序运行过程中产生的静态数据,比如日志数据。

数据接入

日志数据数据采集。用户使用和网页,app等,在与客户端交互过程,比如浏览网页,点击,评论等,会产生一些日志数据,通过数据埋点,将数据从日志服务器采集到分布式存储系统。

  • 采用高可用的分布式海量日志采集系统Flume,提供拦截器对数据进行ETL处理,支持在日志系统中定制各类数据发送方,用于收集数据。

业务数据接入。用户登录网站进行浏览,可以通过分类查询和全文检索寻找需要的产品,这些产品数据存在业务数据库中。

  • 采用华为的数据接入服务(Data Ingestion Service,简称DIS)可让您轻松收集、处理和分发实时流数据,以便您对新信息快速做出响应。
  • 采用datax工具实现大数据存储系统和关系型数据库之间进行数据交换。datax 是一个异构数据源同步工具,采用Framework + plugin架构构建,可以在关系型数据库、文件存储系统、Hive、HBase等各种异构数据源之间进行数据同步,支持流量控制和运行信息收集,跟踪数据同步情况。

消息队列

对于采集到的日志数据我们可以同步接入到消息队列,可以起到系统之间解耦,峰值缓冲和异步通信的作用,消息队列可以有支持横向扩展,吞吐量高,延时低的特点,为后续实时流式计算提供数据来源。

  • 可以采用Kafka作为消息队列。kafka是一个高吞吐,低延时的分部式消息发布和订阅系统, Kafka是天生是分布式的,数据副本冗余、流量负载均衡、可扩展有较长时间持久化,顺序读和顺序写,通过零拷贝的技术消息直接持久化磁盘等特点。在大数据场景中广泛应用于实时数据计算和日志采集。

数据存储

批处理的数据一般存储在分布式文件存储系统中,该存储系统可以存放各种格式的文件。本文采用obs对象存储服务进行数据的存储。

  • 对象存储服务(Object Storage Service,简称OBS),是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力。数据存储和计算分离,使用时无需考虑容量限制,并且提供多种存储类型供选择,满足客户各类业务场景诉求。OBS服务实现了hadoop的HDFS协议,在大数据场景中可以替代hadoop系统中的HDFS服务,实现Spark、MapReduce、Hive、HBase等大数据生态与OBS服务的对接,为大数据计算提供“数据湖”存储。

全流程调度

本分析运营平台由多个任务组成,各个任务单元有前后依赖关系。需要一个批量工作流任务调度器,在一个工作流内以一个特定的顺序运行一组工作和流程

  • 使用任务流调度工具azkaban,每天凌晨进行跑批操作,将shell脚本,hive脚本,java程序进行全流程调度执行。Executor Server处理工作流和作业的实际执行,Web Server处理项目管理,身份验证,计划和执行触发。

BI工具可视化

大多数大数据处理的目的都是通过分析和报告,把运营数据转换成战略决策信息,对企业的发展历程和未来趋势做出定量分析和预测,最终是要给到公司管理决策层进行直观可视化展示的。

  • BI可视化可以使用到华为的数据可视化服务(Data Lake Visualization,简称DLV)是一站式数据可视化平台,适配云上云下多种数据源,提供各种可视化组件,采用拖拽式自由布局,快速定制和应用属于您自己的数据大屏。

可视化展示方案

本项目有两种可视化展示方案,方案一为通过obs对象存储系统直接对接可视化工具DLV,方案二为通过MySQL数据库对接可视化工具DLV。其中OBS系统中将查询语句以csv文件进行存储,而MySQL数据库则需要先行创建好表。

方案一

1.将文件下载到本地,以.csv文件进行保存

执行语句:

###hive -e "set hive.cli.print.header=true;select * from ods_t_order" | sed 's/[\t]/,/g' > /home/huaweicloud/tmp_t_order.csv


2.将本地.csv文件上传至obs中

执行语句:

hadoop fs -put /home/huaweicloud/tmp_t_order.csv obs://obs-east-bkt002/warehouse/hive/ads/tmp_t_order1.csv

3.在dlv数据可视化界面中实现可视化展示

方案二

将obs数据导入到MYSQL,此处以”统计近60天各租户下单省份地图“为例

1.创建HIVE表

DROP TABLE IF EXISTS ads_days_province;
CREATE EXTERNAL TABLE ads_days_province(
domain String,
province String,
amount bigint,
) COMMENT 'ads_days_province'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION 'obs://obs-east-bkt002/warehouse/hive/ads/ads_days_province/';

2.将数据填入到HIVE表

inseret overwrite table ads_days_province SELECT *from ads_days_province

3.将HIVE表obs数据导入到云数据库MYSQL中

 python /opt/module/datax/bin/datax.py  /opt/module/datax/job/ads_province.json

4.在DLV中创建连接,并进行可视化展示

sql查询指标展示

1.统计近60天各租户的营业额

ads_days_amount

hive - e "set hive.cli.print.header=true;
SELECT
domain,
sum( payment ) 
FROM
ods_t_order 
WHERE
to_date ( CURRENT_DATE )<= date_add( to_date ( created_time ), 60 ) 
GROUP BY
domain " | sed 's/[\t]/,/g' > /home/huaweicloud/ads_days_amount.csv ;
hadoop fs -put /home/huaweicloud/ads_days_amount.csv obs://obs-east-bkt002/warehouse/hive/ads/ads_days_amount.csv

​ 字段定义:

current_date 系统当前时间

created_time 订单表中订单的创建时间

domain 租户的域名

payment 每个订单的实际付款

2.统计近60天各租户下单省份地图

SELECT DISTINCT
	c.domain,
	c.province,
	count() over (
	partition BY ( c.domain, c.province )) amount 
FROM
	(
	SELECT
		b.domain,
		province,
		count() over (
		PARTITION BY ( domain, province )) rank 
	FROM
		(
		SELECT
			domain,
			substr( address, 0, 2 ) province 
		FROM
			ods_t_order 
		WHERE
			address NOT LIKE "黑龙%" 
			AND address NOT LIKE "内蒙%" 
			AND address NOT LIKE "钓鱼%" 
			AND to_date ( CURRENT_DATE )<= date_add( to_date ( created_time ), 60 ) 
		) b UNION ALL
		(
		SELECT
			b.domain,
			province,
			count() over (
			PARTITION BY ( domain, province )) rank 
		FROM
			(
			SELECT
				domain,
				substr( address, 0, 3 ) province 
			FROM
				ods_t_order 
			WHERE
				address LIKE "黑龙%" 
				AND address LIKE "内蒙%" 
				AND address LIKE "钓鱼%" 
				AND to_date ( CURRENT_DATE )<= date_add( to_date ( created_time ), 60 ) 
			) b 
		) 
	)c

字段定义:

address 订单表中各订单的下单地址

domain 各租户的域名

province 各订单下单省份

amount 各租户下的各省份订单数量

3.统计近30天各租户top5热销产品

SELECT
			* 
		FROM
			(
			SELECT
				a.domain,
				a.sku_id,
				a.amount,
				row_number() over ( PARTITION BY a.domain ORDER BY a.domain, a.amount DESC ) rank 
			FROM
				(
				SELECT DISTINCT
					domain,
					sku_id,
					count() over ( PARTITION BY domain, sku_id ) amount 
				FROM
					ods_t_order 
				WHERE
					to_date ( CURRENT_DATE )<= date_add( to_date ( created_time ), 30 ) 
				) a 
			) b 
		WHERE
			b.rank <= 5;
	

字段定义:

domain 各租户的域名

sku_id 各服务下的商品id

amount 各租户订单下的各商品销售数量

rank 对各租户下根据商品销售数量进行排序

4.统计出各租户30天内销售的sku_id 及数量

		SELECT DISTINCT
			domain,
			sku_id,
			count() over ( PARTITION BY domain, sku_id ) amount 
		FROM
			ods_t_order 
		WHERE
			to_date ( CURRENT_DATE )<= date_add( to_date ( created_time ), 30 ) 
		ORDER BY
			domain,
			amount DESC;

domain 各租户的域名

sku_id 各服务下的商品id

amount 各租户订单下的各商品销售数量

5.统计各租户近30天每日新增用户数

	SELECT DISTINCT
			a.domain,
			a.day,
			count() over (
			PARTITION BY ( a.domain, a.DAY )) num 
		FROM
			(
			SELECT
				domain,
				to_date ( created_time ) DAY 
			FROM
				ods_user 
			WHERE
				to_date ( CURRENT_DATE )<= date_add( to_date ( created_time ), 30 ) 
				AND account_type = 1 
			)a

domain 各租户的域名

created_time 各用户的创建时间

day 各用户账号的创建日期

num 各租户每天的用户创建数

6.统计各租户用户一周内所登录的时间段(一小时为一个时段)

 SELECT DISTINCT
			a.tenantDomain,
			HOUR,
			count() over (
			PARTITION BY ( a.tenantdomain, HOUR )) amount 
		FROM
			(
			SELECT
				tenantDomain,
				substr( timestr, 12, 2 ) HOUR,
				uid 
			FROM
				dwd_page_log 
			WHERE
				last_page_id = 'login' 
				AND page_id = 'home_service_list' 
				AND to_date ( CURRENT_DATE )<= date_add( to_date ( timestr ), 6 ) 
			) a
			LEFT JOIN ods_user ON a.uid = user_id 
			AND account_type = 1;

tenantDomain 各租户的域名

timestr 各用户的创建时间

hour 各用户的创建的时间段

page_id 当前浏览页面

last_page_id 上个浏览页面

account_type 各账号的种类

amount 各域名下每个小时的用户创建数

7.统计各租户近30天的用户日活量

SELECT DISTINCT
			tenantDomain,
			to_date ( timestr ) DAY,
			count() over (
			PARTITION BY ( tenantDomain, to_date(timestr) )) num 
		FROM
			dwd_page_log 
		WHERE
			last_page_id = 'login' 
			AND page_id = 'home_service-list' 
		AND to_date ( CURRENT_DATE )<= date_add( to_date ( timestr ), 30 )

tenantDomain 各租户的域名

day 各用户账号的创建日期

num 各租户下每天的用户创建数

8.统计近30天各租户的热门浏览页面top5(浏览次数最多的界面)

SELECT
			* 
		FROM
			(
			SELECT
				a.tenantDomain,
				a.page_id,
				a.amount,
				row_number() over ( PARTITION BY a.tenantDomain ORDER BY a.tenantDomain, a.amount DESC ) rank 
			FROM
				(
				SELECT DISTINCT
					tenantDomain,
					page_id,
					count() over ( PARTITION BY tenantDomain, page_id ) amount 
				FROM
					dwd_page_log 
				WHERE
					to_date ( CURRENT_DATE )<= date_add( to_date ( created_time ), 30 ) 
				) a 
			) b 
		WHERE
		b.rank <= 5;

tenantDomain 各租户的域名

page_id 当前浏览页面

amount 各租户下当前页面的浏览数

created_time 当前页面的访问时间

rank 各租户的浏览页面次数排序

项目介绍

本项目旨在为开发者数据分析平台搭建提供技术方案参考,通过前端埋点产生的日志行为数据以及后端产生的业务数据为基准,在hive数仓中进行离线分析,按天分区存储,将结果存储在obs中,最后通过dlv进行可视化展示。

定制我的领域