实战大数据项目

news2024/12/30 3:44:55

存储日志数据集(HDFS)

数据仓库构建(Hive)

数据分区表构建

数据预处理  (Spark计算引擎)-使用Zeppelin进行写SQL

订单指标分析

Sqoop数据导出到传统数据库(Mysql)

Superset数据可视化

项目架构

架构方案:

1、基于Hadoop的HDFS(数据存储)文件系统来存储数据

2、为了方便进行数据分析,将这些日志文件的数据映射为一张一张的表,所以,我们 基于Hive(数据仓库工具)来构建数据仓库,所有的数据,都会在Hive下进行管理,提高数据处理的性能。

3、基于Spark(计算引擎)来进行数据开发,所有的应用程序都将运行在Spark集群上,这样可以保证数据被高性能的处理。

4、使用Zeppelin(在Zeppelin写SQL效率高,直接在终端写效率低)来快速将数据进行SQL指令交互。

5、使用Sqoop导出分析后的数据到传统型数据库(Mysql),便于后期应用

6、使用Superset(数据可视化工具)来实现数据可视化展示

架构图

 一、数据仓库构建-数仓分层

首先将日志数据上传到HDFS保存下来,每天都可以上传,HDFS可以保存海量的数据,然后使用Hive,将HDFS中的数据文件,对应到Hive的表中。但是一般情况下日志数据是不能够直接进行分析的。所以需要我们对日志文件的原始数据进行预处理,才能进行分析。

我们会有这么几类数据考虑:

1、原始日志数据(业务系统中保存的日志文件数据)

2、预处理后的数据

3、分析结果数据

这些数据都通过Hive进行处理,因为Hive将数据映射为一张张的表,然后可以通过编写SQL来处理数据,简单、快捷、高效,为了区分以上这些数据,我们将这些数据对应的表分别保存在不同的数据库中。

为了方便组织、管理上面的三类数据,我们将数仓分为不同的层,简单来说,就是分别将三类不同的数据保存在Hive的不同数据中。

 第一层临时存储层ODS,就是存储原始日志数据

第二层数据仓库层DW,就是存储预处理后的数据,就是分析的数据

第三层应用层APP。

根据数仓架构的三层,创建三个数据库,分别用来管理每一层的表数据。

-- 创建ods库
create database if not exists ods_d;
-- 创建dw库
create database if not exists dw_d;
-- 创建app库
create database if not exists app_d;

二、数据分区表构建

1)、ods创建用户打车订单表

根据用户打车订单数据,创建按照日期分区的表:

2)、ods创建取消订单表

根据用户取消订单数据,创建按照日期分区的表

3)、ods创建订单表支付表

根据用户订单支付数据,创建按照日期分区的表

4)、ods创建用户评价表

根据用户评价数据,创建按照日期分区的表

5)、基于T+1的日期分区

大规模数据处理,必须要构建分区,每天都会进行分析,采用的是T+1模式。今天数据,第二天才能看到分析结果。

1、创建本地路径,上传日志文件
mkdir -p /export/data/test
2、通过load命令给表加载数据,并指定分区
load data local inpath '/export/data/test/order.csv' into table t_user_order partition(dt='2020-04-12');

三、数据预处理

数据预处理-用户订单处理

数据有了之后,需要对ods层中的数据进行预处理,数据预处理是数据仓库开发中的一个重要环节,主要目的是让预处理的数据更容易进行数据分析,并且能够将一些非法的数据处理掉,避免影响实际的统计结果。

预处理内容:

1、过滤掉order_time长度小于8的数据,如果小于8,表示这条数据不合法,不应该参加统计

2、将一些0,1表示的字段,处理为更容易理解的字段,例如:subscribe字段,0表示非预约,1表示预约,我们需要添加一个额外的字段,用来展示非预约和预约,这样分析的时候,便于看懂数据。

3、order_time字段为2020-4-12 1:15,为了将来更方便处理,统一使用类似2020-04-12 01:15来表示,这样所有的order_time字段长度是一样的,并且将日期获取出来。

4、为了方便将来按照年、月、日,小时统计,我们需要新增这些字段。

5、后续要分析一天内,不同时段的订单量,需要在预处理过程中将订单对应的时间段提前计算出来,例如:1:00-5:00为凌晨。

数据预处理-用户订单处理

1)、一天各个时段对应关系

2)、dw层创建宽表(宽表含义,要比ods层的表字段多)

在进行预处理之前,先把预处理之后保存数据的表创建出来。

3)、建宽表语句

create table if not exists dw_test_user_order_wide

4)、预处理SQL语句

5)、HQL编好后,方便分析,需要将预处理的数据写入到之前创建的宽表中,注意:宽表也是一个分区表,所以,写入的时候要指定对应的分区。

四、订单指标分析-总订单笔数分析

数据处理好后,进行分析

1)、编写HQL语句

-- 计算4月12日总订单笔数
select
 count(orderid) as total_cnt 
from
 dw_didi.t_user_order_wide 
where 
 dt = '2020-04-12’
 ;

订单指标分析-总订单笔数分析

2)、app层建表

数据分析后,每次都要处理大规模数据,每次处理都需要占用较长时间,所以,我们可以将计算好的数据,直接保存下来。将来,可以快速查询数据结果,所以需要在app层创建表,保存的数据为某天的总订单数,保存一下几个字段:

1、时间(哪天的订单总数)

2、订单总数

-- 创建保存日期对应订单笔数的app表
create table if not exists app_didi.t_order_total(
    date string comment '日期(年月日)',
    count integer comment '订单笔数'
)
partitioned by (month string comment '年月,yyyy-MM')
row format delimited fields terminated by ','
;

3)、加载数据到app层,

此处因为结果的数据不会很多,所以只需要基于年月来分区

insert overwrite table app_didi.t_order_total partition(month='2020-04')
select 
  '2020-04-12',count(orderid) as total_cnt
From  dw_didi.t_user_order_wide
Where   dt = '2020-04-12';

查询的结果,后面就可以做为可视化使用。

订单指标分析-预约订单/非预约订单占比分析

数据处理好后,就可以进行分析了。

1、编写HQL语句

select
    subscribe_name,
    count(*) as order_cnt
from
    dw_didi.t_user_order_wide
where
    dt = '2020-04-12'
group by
    subscribe_name
;

2、app层建表

包含几个字段:

日期、是否预约、订单数量

create table if not exists app_didi.t_order_subscribe_total(
    date string comment '日期',
    subscribe_name string comment '是否预约',
    count integer comment '订单数量'
)
partitioned by (month string comment '年月,yyyy-MM')
row format delimited fields terminated by ','
;

3、加载数据到app表

insert overwrite table app_didi.t_order_subscribe_total partition(month = '2020-04')
select
    '2020-04-12',
    subscribe_name,
    count(*) as order_cnt
from
    dw_didi.t_user_order_wide
where
    dt = '2020-04-12'
group by
    subscribe_name
;

订单指标分析-不同时段订单占比分析

1)、编写HQL语句

select
    order_time_range,
    count(*) as order_cnt
from
    dw_didi.t_user_order_wide
where
    dt = '2020-04-12'
group by
    order_time_range
;

2)、app层建表

create table if not exists app_didi.t_order_timerange_total(
    date string comment '日期',
    timerange string comment '时间段',
    count integer comment '订单数量'
)
partitioned by (month string comment '年月,yyyy-MM')
row format delimited fields terminated by ','
;

3)、加载数据到app表

insert overwrite table app_didi.t_order_timerange_total partition(month = '2020-04')
select
    '2020-04-12',
    order_time_range,
    count(*) as order_cnt
from
    dw_didi.t_user_order_wide
where
    dt = '2020-04-12'
group by
    order_time_range
;

订单指标分析-不同地域订单对比

1)、编写HQL语句

select
    province,
    count(*) as order_cnt
from
    dw_didi.t_user_order_wide
where
    dt = '2020-04-12'
group by
    province
;

2)、app层建表

create table if not exists app_didi.t_order_province_total(
    date string comment '日期',
    province string comment '省份',
    count integer comment '订单数量'
)
partitioned by (month string comment '年月,yyyy-MM')
row format delimited fields terminated by ','
;

3)、加载数据到app表

insert overwrite table app_didi.t_order_province_total partition(month = '2020-04')
select
    '2020-04-12',
    province,
    count(*) as order_cnt
from
    dw_didi.t_user_order_wide
where
    dt = '2020-04-12'
group by
    province
;

订单指标分析-不同年龄段/时段订单占比

1)、编写HQL语句

select 
 age_range, 
 order_time_range, 
 count(*) as order_cnt 
from 
  dw_didi.t_user_order_wide 
where 
  dt = '2020-04-12’ 
group by 
 age_range, 
 order_time_range 
;

2)、app层建表

create table if not exists app_didi. t_order_age_and_time_range_total ( 
date string comment '日期’, 
age_range string comment '年龄段’, 
order_time_range string comment '时段’, 
count integer comment '订单数量’ 
) 
partitioned by (month string comment '年月,yyyy-MM’) 
row format delimited fields terminated by ',' ;

3)、加载数据到app表

insert overwrite table app_didi.t_order_age_and_time_range_total partition(month = '2020-04’) 
select 
 ‘2020-04-12’,
 age_range, 
 order_time_range, 
  count(*) as order_cnt 
from 
  dw_didi.t_user_order_wide 
where 
  dt = '2020-04-12’ 
group by age_range, order_time_range ;

select * from app_didi.t_order_age_and_time_range_total

五、Sqoop数据导出

在分析完核心指标后,需要将指标数据导出到mysql数据库中,便于后续的应用,例如指标的可视化。

Apache Sqoop是在Hadoop生态体系和RDBMS体系之间传送数据的一个工具,来自于Apache

Hadoop生态系统包含:HDFS、Hive、Hbase等等

RDBMS体系包含:Mysql、Oracle、DB2等

Sqoop可以理解:“SQL到Hadoop 和Hadoop 到SQL”

 安装Sqoop 1.4.7启动

#进入Sqoop安装目录
cd /export/server/sqoop-1.4.7
#验证sqoop是否工作
bin/sqoop list-databases \
--connect jdbc:mysql://192.168.88.100:3306/ \
--username root \
--password 123456

显示Mysql中所有的数据库

information_schema
hive
mysql
performance_schema
sys

Mysql创建目标表

1)、将数据从Hadoop生态体系导出到RDBMS数据库导出前,目标表必须存在于目标数据库中,所以我们必须先在Mysql中创建对应的目标数据库app_test

 #创建目标数据库
 create database if not exists app_didi;
     
  #创建订单总笔数目标表
  create table if not exists app_didi.t_order_total(
     order_date date,
      count int
  );
 
  #创建预约订单/非预约订单统计目标表
  create table if  not exists app_didi.t_order_subscribe_total(
    order_date date ,
    subscribe_name varchar(20) ,
     count int
); 

2)、在mysql中创建数据库和目标表

 #创建不同时段订单统计目标表
create table if not exists app_didi.t_order_timerange_total(
        order_date date ,
        timerange varchar(20) ,
        count int 
    );
 
    #创建不同地域订单统计目标表
    create table if not exists app_didi.t_order_province_total(
     order_date date ,
     province varchar(20) ,
     count int 
   );
 
   #创建不同年龄段,不同时段订单目标表
   create table if not exists app_didi.t_order_age_and_time_range_total(
    order_date date ,
    age_range varchar(20) ,
    order_time_range varchar(20) ,
    count int 
 );

Sqoop数据导出

1)、将Hive中的结果表导出到mysql中

 #导出订单总笔数表数据
    bin/sqoop export \
    --connect jdbc:mysql://192.168.88.100:3306/app_didi \
    --username root \
    --password 123456 \
# 导入到这个mysql中的表
    --table t_order_total \
#  将HDFS中的表
    --export-dir /user/hive/warehouse/app_didi.db/t_order_total/month=2020-04
 
     #导出预约和非预约订单统计数据
     bin/sqoop export \
    --connect jdbc:mysql://192.168.88.100:3306/app_didi \
    --username root \
    --password 123456 \
# 导入到这个mysql中的表
    --table t_order_subscribe_total \
#  将HDFS中的表
    --export-dir /user/hive/warehouse/app_didi.db/t_order_subscribe_total/month=2020-04
 

Sqoop导出Hive结果表数据到Mysql

#导出不同时段订单统计表
 
     bin/sqoop export \
    --connect jdbc:mysql://192.168.88.100:3306/app_didi \
    --username root \
    --password 123456 \
    --table t_order_timerange_total \
    --export-dir /user/hive/warehouse/app_didi.db/t_order_timerange_total/month=2020-04
 
    
     #导出不同地域订单统计表
     
     bin/sqoop export \
    --connect jdbc:mysql://192.168.88.100:3306/app_didi \
    --username root \
    --password 123456 \
# 导入到这个mysql中的表
    --table t_order_province_total  \
#  将HDFS中的表
    --export-dir /user/hive/warehouse/app_didi.db/t_order_province_total/month=2020-04
#导出不同年龄段,不同时段订单目标表
      bin/sqoop export \
    --connect jdbc:mysql://192.168.88.100:3306/app_didi \
    --username root \
    --password 123456 \
# 导入到这个mysql中的表
    --table t_order_age_and_time_range_total  \
#  将HDFS中的表
    --export-dir /user/hive/warehouse/app_didi.db/t_order_age_and_time_range_total/month=2020-04

六、Suerpset数据可视化

1)、Superset介绍

Superset是一个开源的企业级BI,它是目前开源的数据分析和可视化工具中比较好用的,功能简单,支持多种数据源、图标类型多、易维护、易二次开发。

2)、特点

1、丰富的数据可视化集

2、易于使用的界面,用于浏览和可视化数据

3、可提供身份验证。

Superset安装和启动

启动

superset run -h 192.168.88.100 -p 8099 --with-threads --reload --debugger

Superset建立数据源

1)、介绍

在启动完Superset之后,可以连接Mysql数据库

2)、连接

mysql的url地:mysql+pymysql://root:123456@192.168.88.100/app_didi?charset=utf8

分析指标可视化-订单总笔数可视化

1)、选择表数据源

 

2)、添加表连接

3)、设置表连接相关参数

4)、设置图标参数

 分析指标可视化-DashBoard看板开发

1)、实现步骤

1、创建看板

2、设置看板名字

3、进入看板

4、编辑看板

5、选择自定义看板

6、制作看板

7、调整看板

最终效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/421728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue2_02_指令

模板语法 — Vue.js (vuejs.org) 指令 (Directives) 是带有 v- 前缀的特殊 attribute 参数 一些指令能够接收一个“参数”&#xff0c;在指令名称之后以冒号表示 <a v-bind:href"url">...</a> 动态参数 可以用方括号括起来的 JavaScript 表达式作为一…

企业消费管理迈向数字化,助力员工满意度提升,解决行政·财务·采购等部门痛点 | 爱分析调研

调研&#xff1a;李进宝 撰写&#xff1a;李进宝 某市场巡视人员&#xff1a;每次出差都要垫钱&#xff0c;每月还只能报销一次&#xff0c;这不是自费上班吗&#xff1b; 某软件研发人员&#xff1a;我们每天都要加班到很晚&#xff0c;公司提供晚餐&#xff0c;但高油高盐&…

ERP系统应用场景,API接口接入

ERP订单管理系统能为企业带来什么 1、ERP订单管理系统可以对工厂物料采购的时间进行提示&#xff0c;根据产品目前的库存情况来进行确定&#xff0c;并比较物料采购时所需要支付的费用是多少&#xff0c;什么时候采购价格相对更加便宜。 2、在产品的生产方面&#xff0c;涉及…

Linux远程连接虚拟机超时,且ip地址找不到问题解决

ip地址虚拟机自动更改&#xff1a; 原因&#xff1a;Linux没有正常关机 解决&#xff1a;从虚拟机在自己电脑上的文件地址中bin目录下&#xff0c;前面几个以.lck的文件全部删除 Linux远程连接虚拟机超时&#xff1a; 原因可能跟上面是一样的&#xff0c;IP地址自动修改之后自…

华为 ADS 2.0 发布,城区智驾之战「白热化」

作者 | 马波编辑 | 德新虽然上海车展还未正式拉开帷幕&#xff0c;但今天的华为却通过一系列新品的发布为今年的汽车盛会进行了预热。就在今天上午&#xff0c;华为车BU正式发布了一系列新品&#xff0c;同时也对部分现有产品进行了升级。其内容之多、升级的幅度之大&#xf…

Maven项目中的依赖出现版本冲突,最终发现是对Dependency Scope理解有误

再来个文章目录 文章目录背景疑问排查过程问题存在的原因总结示例依赖版本说明本文记录一下遇到maven依赖版本冲突后的排查过程说明以及问题原因说明 下面还有投票&#xff0c;帮忙投个票&#x1f44d; 背景 最近加入了 Apache Dubbo 开源社区&#xff0c;成为了一名Dubbo Con…

【K8S系列】深入解析Pod对象(一)

目录 序言 1.问题引入 1.1 问题描述 2 问题解答 2.1 pod 属性 2.1.1 NodeSelector 2.1.2 HostAliases 2.1.3 shareProcessNamespace 2.1.4 NodeName 2.1.5 其他pod属性 2.2 容器属性 2.2.1 ImagePullPolicy 2.2.2 Lifecycle 3 总结 4. 投票 序言 任何一件事情&am…

Zabbix代理服务器

Zabbix代理服务器一、部署 zabbix 代理服务器1、设置 zabbix 的下载源&#xff0c;按照 zabbix-proxy2、安装zabbix所需数据库3、添加数据库用户&#xff0c;以及 zabbix 所需的数据库信息4、导入数据库信息5、修改配置文件6、配置 agent 使用 proxy二、设置 zabbix-snmp 监控1…

dubbo2.7升级到dubbo3--dubbo2.7升级到dubbo3系列

最近在做老系统升级(springboot2dubbo2.7.1zookeepernacos-config)&#xff0c;去掉zookeeper的注册中心&#xff0c;替换成nacos2.1版本&#xff08;阿里云已经不支持1.X版本了&#xff09;-对应的需要升级springboot和dubbo3。最终升级完成了&#xff0c;其中遇到的诸多问题&…

Unity VFX -- (1)概览

视觉特效&#xff08;Visual Effects&#xff0c;VFX&#xff09;在实时3D项目中能够带来惊艳的效果&#xff0c;其范围很广&#xff0c;比如水花四溅、迷雾、火焰、爆炸效果等。 如果没有VFX&#xff0c;整个环境会让人感到非常呆板无聊。这些特效会让环境生动起来&#xff0c…

nodejs微服务:RPC与GRPC框架

RPC RPC(Remote Procedure Call Protocol)&#xff0c;是远程过程调用的缩写通俗的说就是调用远处的一个函数&#xff0c;与之相对应的是本地函数调用 本地函数调用&#xff1a;参数&#xff0c;返回值&#xff0c;代码段都在本地的一个进程空间内远程函数调用&#xff1a;远程…

【pan-sharpening 攻击:目标检测】

Adversarial pan-sharpening attacks for object detection in remote sensing &#xff08;对抗性泛锐化攻击在遥感目标检测中的应用&#xff09; 全色锐化是遥感系统中最常用的技术之一&#xff0c;其目的是将纹理丰富的PAN图像和多光谱MS图像融合&#xff0c;以获得纹理丰…

docker上面安装mysql

一、docker安装mysql 新建配置 /data/mysql3306/conf/my.cnf(新建logs,data,conf/my.cnf 后面要用) 详情&#xff1a; [mysql] #设置mysql客户端默认字符集 default-character-setUTF8MB4[mysqld] #设置3306端口 port3306#允许最大连接数 max_connections200#允许连接失败的次…

Spring事务(3)-TransactionInterceptor实际事务执行

Spring事务&#xff08;2&#xff09;-EnableTransactionManagement实现源码解析 中介绍了Spring事务开启和代理的实现&#xff0c;现在了解实际事务执行TransactionInterceptor。 TransactionInterceptor TransactionInterceptor类图 MethodInterceptor&#xff1a;AOP代理后…

vue 高德地图设置鼠标样式

高德地图JS API 2.0 设置鼠标样式在线示例 首先&#xff0c;在 index.html 中引入图标&#xff1a; <link rel"stylesheet" href"https://at.alicdn.com/t/font_873139_0v65kqy674.css" >封装工具文件 utils/map.js &#xff1a; export default …

itop-3568开发板驱动学习笔记(9)高级字符设备(三)信号驱动 IO

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录应用层信号机制应用层开启异步通知驱动层异步通知接口实验代码信号驱动 IO 不需要像 poll 一样查询设备的状态&#xff0c;一旦设备有目标事件发生&#xff0c;就会触发 SIGIO 信号&#xff0c;然后处理信号…

网卡的 Ring Buffer 详解

1. 网卡处理数据包流程 网卡处理网络数据流程图&#xff1a; 图片来自参考链接1 上图中虚线步骤的解释&#xff1a; 1 DMA 将 NIC 接收的数据包逐个写入 sk_buff &#xff0c;一个数据包可能占用多个 sk_buff , sk_buff 读写顺序遵循FIFO&#xff08;先入先出&#xff09;原…

Redis(四)事务 multi、exec

哈喽&#xff0c;大家好&#xff0c;我是有勇气的牛排&#xff08;全网同名&#xff09;&#x1f42e;&#x1f42e;&#x1f42e; 有问题的小伙伴欢迎在文末评论&#xff0c;点赞、收藏是对我最大的支持&#xff01;&#xff01;&#xff01;。 文章目录1 前言1.1 什么是Redi…

从零开始的Web渗透:信息收集步骤详解

一、域名信息收集 1.获取域名的whois信息是、 什么是Whois Whois是一种传输协议&#xff0c;用于查询域名注册所有者等信息。它可以帮助您查询域名是否已被注册&#xff0c;以及获取有关已注册域名的详细信息&#xff0c;例如域名注册商和域名所有人。 早期的Whois查询通常…

Docker 部署Jira8.1.0

Jira与Confluence一样&#xff0c;都需要用到独立的数据库&#xff0c;对于数据库的安装我们不做介绍&#xff0c;主要介绍如何用Docker部署Jira以及对Jira进行破解的操作。 1、数据库准备 关于数据库官方文档说明&#xff1a;https://confluence.atlassian.com/adminjiraserv…