离线数仓搭建例子(电商为例)

0 架构

1.数据来源

1.1 用户行为数据

用户在使用产品过程中,通过埋点收集与客户端产品交互过程中产生的数据,并发往日志服务器进行保存。比如页面浏览、点击、停留、评论、点赞、收藏等。用户行为数据通常存储在日志文件中。

我们的日志结构大致可分为两类,一是普通页面埋点日志,二是启动日志。

普通页面日志结构如下,每条日志包含了,当前页面的页面信息,所有事件(动作)、所有曝光信息以及错误信息。除此之外,还包含了一系列公共信息,包括设备信息,地理位置,应用信息等,即下边的common字段。

启动日志结构相对简单,主要包含公共信息,启动信息和错误信息。

1.2 业务数据

就是各行业在处理事务过程中产生的数据。比如用户在电商网站中登录、下单、支付等过程中,需要和网站后台数据库进行增删改查交互,产生的数据就是业务数据业务数据通常存储在MySQL、Oracle等数据库中。

总共47张表,选了27张业务表

2 数据采集

1 用户行为数据

jar-》log(日志服务器)-》flume-》kafka-》flume-》hdfs

2 业务数据

jar-》mysql-》sqoop-》hdfs

3.ODS

hdfs(ori)-》hdfs(ods)

1 用户行为数据

1张表,topic_log -> ods_log

a.建表

就一个字段”line“

b 分区

首日,每日都是全量

c .数据装载

2 业务数据

27张表

0 整体

​ b 同步

​ c .数据装载

1.活动信息表

​ activity_info -> ods_activity_info

​ a 建表

​ 少了个“activity_desc”,多了”dt”

​ b 同步

​ 首日,每日都是全量

​ c .数据装载

4.DIM

hdfs(ods)-》hdfs(dim)

构建6张维度表

1 商品维度表

​ a 建表

​ b 分区

​ 首日,每日都是全量

​ c 数据装载

2 优惠券维度表

3 活动维度表

4 地区维度表

​ b 分区

​ 地区维度表数据相对稳定,变化概率较低,故无需每日装载,首日全量

5 时间维度表

​ b 分区

​ 通常情况下,时间维度表的数据并不是来自于业务系统,而是手动写入,并且时间维度表数据具有可预见性,无须每日导入,一般首日可一次性导入一年的数据

​ c 数据装载

​ 1)创建临时表tmp_dim_date_info

​ 2)将数据文件上传到HFDS上临时表指定路径/warehouse/gmall/tmp/tmp_dim_date_info/

​ 3)执行以下语句将其导入时间维度表

1
insert overwrite table dim_date_info select * from tmp_dim_date_info;

6 用户维度表

​ b 分区

​ 拉链表

https://cloud.tencent.com/developer/article/1752848#

​ c 数据装载

5.DWD

hdfs(ods)-》hdfs(dwd)

1 用户行为日志

0 日志数据拆解

ods_log由两部分构成,分别为页面日志和启动日志,拆解成5张表

1 启动日志表

​ b 分区

​ 首日,每日全量

​ c 数据装载

2 页面日志表

3 动作日志表

4 曝光日志表

5 错误日志表

2 业务数据

1 评价事实表(事务型事实表)

​ b 分区

​ c 数据装载

​ 首日,动态分区;每日,静态分区

2 订单明细事实表(事务型事实表)

3 退单事实表(事务型事实表)

4 加购事实表(周期型快照事实表)

​ b 分区

​ c 数据加载

5 收藏事实表(周期型快照事实表)

6 优惠券领用事实表(累积型快照事实表)

​ b 分区

​ c 数据加载

​ (1)首日

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
insert overwrite table dwd_coupon_use partition(dt)
select
id,
coupon_id,
user_id,
order_id,
coupon_status,
get_time,
using_time,
used_time,
expire_time,
coalesce(date_format(used_time,'yyyy-MM-dd'),date_format(expire_time,'yyyy-MM-dd'),'9999-99-99')
from ods_coupon_use
where dt='2020-06-14';

​ (2)每日

7 支付事实表(累积型快照事实表)

8 退款事实表(累积型快照事实表)

9 订单事实表(累积型快照事实表)

6.DWS

hdfs(dwd)-》hdfs(dws)

0 整体

​ b 分区

​ c 数据装载

1 访客主题

2 用户主题

3 商品主题

4 优惠券主题

5 活动主题

6 地区主题

7.DWT

hdfs(dws)-》hdfs(DWT)

0 整体

c 数据装载

只保留当天和前一天的分区,过时的需要清理掉i

1 访客主题

2 用户主题

3 商品主题

4 优惠券主题

5 活动主题

6 地区主题

8.ADS

hdfs(DWT)-》hdfs(ADS)-》mysql

1 访客主题

1 访客统计

a 建表

指标 说明 对应字段
访客数 统计访问人数 uv_count
页面停留时长 统计所有页面访问记录总时长,以秒为单位 duration_sec
平均页面停留时长 统计每个会话平均停留时长,以秒为单位 avg_duration_sec
页面浏览总数 统计所有页面访问记录总数 page_count
平均页面浏览数 统计每个会话平均浏览页面数 avg_page_count
会话总数 统计会话总数 sv_count
跳出数 统计只浏览一个页面的会话个数 bounce_count
跳出率 只有一个页面的会话的比例 bounce_rate

b 分区

c 数据装载

第一步:对所有页面访问记录进行会话的划分。

第二步:统计每个会话的浏览时长和浏览页面数。

第三步:统计上述各指标。

2 路径分析

用户访问路径的可视化通常使用桑基图

2 用户主题

3 商品主题

4 订单主题

5 优惠券主题

6 活动主题

9.Azkaban全流程调度

就是将原来写的脚本文件串起来

大数据工具

1 数据库管理工具

Navicat

破解

https://cdmana.com/2022/114/202204240555321952.html

DataGrip

需要用到JDBC协议连接到Hive,故需要启动HiveServer2。

DataGrip 版是由JetBrains 公司(就是那个出品Intellij IDEA 的公司)推出的数据库管理软件。

2 数据库设计工具

EZDML

来辅助我们梳理复杂的业务表关系,效果如下

Spark on Hive & Hive on Spark

https://cloud.tencent.com/developer/article/1624245

https://blog.csdn.net/weixin_41290471/article/details/106203419

https://www.cnblogs.com/qingyunzong/p/8992664.html

https://www.cnblogs.com/liugp/p/16209394.html#1spark-on-hive

1 Hive on Spark

Hive既作为存储又负责sql的解析优化,Spark负责执行

2 Spark on Hive

Hive只作为存储角色,Spark负责sql解析优化,执行

hive on spark大体与spark on hive结构类似,只是SQL引擎不同

hive

常见问题

1.FAILED: SemanticException Failed to get a spark session: org.apache.hadoop.hive.ql.metadata.HiveException: Failed to create Spark client for Spark session

https://blog.csdn.net/qq_41504585/article/details/108064512

启动metastore

https://blog.csdn.net/u010670689/article/details/41576647

hive —service metastore 2>&1 >> /var/log.log &

启动hiveserver2

hiveserver2

连接方式

https://blog.csdn.net/qq_41851454/article/details/79833306

https://www.shuzhiduo.com/A/RnJW4Z2r5q/

1.cli

hive

2.beeline

https://www.jianshu.com/p/97bbe79d88d2

sqoop

https://www.yangshuaibin.com/detail/388673

作用

关系型数据库 <<——>> hdfs ,双向,用的mapreduce

sqoop的作用就是将关系型数据库中的某张表数据抽取到Hadoop的hdfs文件系统当中,底层运用的还是Map Reduce 。 它利用MapReduce加快数据传输速度,批处理方式进行数据传输。 也可以将HDFS上的文件数据导出到关系型数据库中的某张表。

脚本

https://blog.csdn.net/qq_44665283/article/details/120709047

各种表

1 分区表

https://www.jianshu.com/p/1cdd3e3c5b3c

https://www.jianshu.com/p/163f8375c0d6

1 mysql分区

RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。

LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。

KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

2 Hive中分区表

分两类:静态分区、动态分区;

Hive中没有复杂的分区类型(List,Range,Hash)

2 内部表&外部表

https://www.cnblogs.com/qiaoyihang/p/6225151.html

https://blog.csdn.net/qq_36743482/article/details/78393678

1 未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);

2 内部表数据由Hive自身管理,外部表数据由HDFS管理;

3 内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定(如果没有LOCATION,Hive将在HDFS上的/user/hive/warehouse文件夹下以外部表的表名创建一个文件夹,并将属于这个表的数据存放在这里);
4 删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
5 对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)

3 临时表

https://www.cnblogs.com/duanxz/p/3724120.html

4 字典表

https://www.cnblogs.com/jpfss/p/10418873.html

5 全量表,增量表、快照表、流水表

全量表:所有数据的最新状态

增量表:新增数据

快照表:

流水表: 对于表的每一个修改都会记录,可以用于反映实际记录的变更。

6 切片表

切片表:切片表根据基础表,往往只反映某一个维度的相应数据。其表结构与基础表结构相同,但数据往往只有某一维度,或者某一个事实条件的数据

7 拉链表

1 定义

2 应用场景

3 分区

4 数据加载

1)首日装载

拉链表首日装载,需要进行初始化操作,具体工作为将截止到初始化当日的全部历史用户导入一次性导入到拉链表中。目前的ods_user_info 表的第一个分区,即2020-06-14 分区中就是全部的历史用户,故将该分区数据进行一定处理后导入拉链表的9999-99-99 分区即可。

2)每日装载

flume

1.作用

日志采集

Flume是流式日志采集工具,FLume提供对数据进行简单处理并且写到各种数据接收方(可定制)的能力,Flume提供从本地文件(spooling directory source)、实时日志(taildir、exec)、REST消息、Thift、Avro、Syslog、Kafka等数据源上收集数据的能力。

2.Flume架构

https://jiandansuifeng.blog.csdn.net/article/details/118926483

https://www.jianshu.com/p/9a5c682b0551

三大核心组件:

  • Source:数据源
  • Channel:临时存储数据的管道
  • Sink: 目的地

3.拦截器(interceptor)

https://blog.51cto.com/u_15241496/2869403

拦截器是简单的插件式组件,设置在source和channel之间。source接收到的事件event,在写入channel之前,拦截器都可以进行转换或者删除这些事件。每个拦截器只处理同一个source接收到的事件。可以自定义拦截器。

1 jar包

2 将打包的jar放到XXX/flume/lib

3 配置文件

/opt/module/flume/conf

vim file-flume-kafka.conf

1
2
3
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type =
com.atguigu.flume.interceptor.ETLInterceptor$Builder

4.为什么要集成Flume和Kafka

https://blog.csdn.net/qq_37466640/article/details/103425555

5.例子

4.1 采集日志

1)Source

(1)Taildir Source相比Exec Source、Spooling Directory Source的优势

TailDir Source:断点续传、多目录。Flume1.6以前需要自己自定义Source记录每次读取文件位置,实现断点续传。不会丢数据,但是有可能会导致数据重复。

Exec Source可以实时搜集数据,但是在Flume不运行或者Shell命令出错的情况下,数据将会丢失。

Spooling Directory Source监控目录,支持断点续传。

(2)batchSize大小如何设置?

答:Event 1K左右时,500-1000合适(默认为100)

2)Channel

采用Kafka Channel,省去了Sink,提高了效率。KafkaChannel数据存储在Kafka里面,所以数据是存储在磁盘中。

注意在Flume1.7以前,Kafka Channel很少有人使用,因为发现parseAsFlumeEvent这个配置起不了作用。也就是无论parseAsFlumeEvent配置为true还是false,都会转为Flume Event。这样的话,造成的结果是,会始终都把Flume的headers中的信息混合着内容一起写入Kafka的消息中,这显然不是我所需要的,我只是需要把内容写入即可。

3)Sink

省去了Sink,提高了效率

4)Interceptor

ETLInterceptor

4.2 消费数据

1)Source

2)Channel

MemoryChannel传输数据速度更快,但因为数据保存在JVM的堆内存中,Agent进程挂掉会导致数据丢失,适用于对数据质量要求不高的需求。FileChannel传输速度相对于Memory慢,但数据安全保障高,Agent进程挂掉也可以从失败中恢复数据。

金融类公司、对钱要求非常准确的公司通常会选择FileChannel

传输的是普通日志信息(京东内部一天丢100万-200万条,这是非常正常的),通常选择MemoryChannel。

3)Sink

HDFS Sink

4)Interceptor

TimeStampInterceptor

flume时间拦截器

获取日志中的实际时间

ZooKeeper

是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

简单操作

1 查看状态

bin/zkServer.sh status

有leader follower

shell脚本编写:start,stop,status

问题

1 某个节点起不来

https://blog.csdn.net/qq_48268603/article/details/117687875

https://blog.csdn.net/u012453843/article/details/70878117

参考

https://geek-docs.com/zookeeper/zookeeper-tutorial/zookeeper-profile.html#

hadoop调优

1 集群数据均衡

1 节点间数据均衡

(1)开启数据均衡命令

start-balancer.sh -threshold 10

(2)停止数据均衡命令

stop-balancer.sh

2 磁盘间数据均衡

(1)生成均衡计划(我们只有一块磁盘,不会生成计划)

hdfs diskbalancer -plan hadoop103

(2)执行均衡计划

hdfs diskbalancer -execute hadoop103.plan.json

(3)查看当前均衡任务的执行情况

hdfs diskbalancer -query hadoop103

(4)取消均衡任务

hdfs diskbalancer -cancel hadoop103.plan.json

2 数据压缩

https://cloud.tencent.com/developer/article/1417401

1 LZO压缩

LZO压缩文件的可切片特性依赖于其索引,故我们需要手动为LZO压缩文件创建索引。若无索引,则LZO文件的切片只有一个。

1
[atguigu@hadoop102 bin]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /warehouse/gmall/ods/ods_log/dt=2020-06-14

3 Hadoop参数调优

https://developer.aliyun.com/article/566013

1)HDFS参数调优

2)YARN参数调优


:D 一言句子获取中...