目录
[第7章 数据仓库环境准备](#第7章 数据仓库环境准备)
[7.1 数据仓库运行环境](#7.1 数据仓库运行环境)
[7.1.1 Hive环境搭建](#7.1.1 Hive环境搭建)
[7.1.2 Yarn环境配置](#7.1.2 Yarn环境配置)
[7.2 数据仓库开发环境](#7.2 数据仓库开发环境)
[第8章 广告数仓ODS层](#第8章 广告数仓ODS层)
[8.1 广告信息表](#8.1 广告信息表)
[8.2 推广平台表](#8.2 推广平台表)
[8.3 产品表](#8.3 产品表)
[8.4 广告投放表](#8.4 广告投放表)
[8.5 日志服务器列表](#8.5 日志服务器列表)
[8.6 广告监测日志表](#8.6 广告监测日志表)
[8.7 数据装载脚本](#8.7 数据装载脚本)
第7章 数据仓库环境准备
7.1 数据仓库运行环境
7.1.1 Hive 环境搭建
1 ) Hive 安装
2 ) Hive on Spark 配置
本项目使用Spark最为Hive的计算引擎。
( 1 )兼容性说明
注意:官网下载的Hive3.1.3和Spark3.3.0默认是不兼容的。因为Hive3.1.3支持的Spark版本是2.3.0,所以需要我们重新编译Hive3.1.3版本。
编译步骤:官网下载Hive3.1.3源码,修改pom文件中引用的Spark版本为3.3.0,如果编译通过,直接打包获取jar包。如果报错,就根据提示,修改相关方法,直到不报错,打包获取jar包。
( 2 )在 Hive 所在节点部署 spark-3.3.1-bin-hadoop3.tgz
①Spark官网下载安装包地址:
②上传并解压解压spark-3.3.1-bin-hadoop3.tgz
[atguigu@hadoop102 software]$ tar -zxvf spark-3.3.1-bin-hadoop3.tgz -C /opt/module/
[atguigu@hadoop102 software]$ mv /opt/module/ spark-3.3.1-bin-hadoop3.tgz /opt/module/spark
③修改spark-env.sh配置文件
修改文件名。
[atguigu@hadoop102 software]$ mv /opt/module/spark/conf/spark-env.sh.template /opt/module/spark/conf/spark-env.sh
编辑文件
[atguigu@hadoop102 software]$ vim /opt/module/spark/conf/spark-env.sh
增加如下内容。
export HADOOP_CONF_DIR=/opt/module/hadoop/etc/hadoop/
( 3 )配置 SPARK_HOME 环境变量
[atguigu@hadoop102 software]$ sudo vim /etc/profile.d/my_env.sh
添加如下内容。
bash
# SPARK_HOME
export SPARK_HOME=/opt/module/spark
export PATH=$PATH:$SPARK_HOME/bin
source 使其生效。
[atguigu@hadoop102 software]$ source /etc/profile.d/my_env.sh
( 4 )在 hive 中创建 spark 配置文件
[atguigu@hadoop102 software]$ vim /opt/module/hive/conf/spark-defaults.conf
添加如下内容(在执行任务时,会根据如下参数执行)。
XML
spark.master yarn
spark.eventLog.enabled true
spark.eventLog.dir hdfs://hadoop102:8020/spark-history
spark.executor.memory 1g
spark.driver.memory 1g
spark.yarn.populateHadoopClasspath true
在HDFS创建如下路径,用于存储历史日志。
[atguigu@hadoop102 software]$ hadoop fs -mkdir /spark-history
( 5 )向 HDFS 上传 Spark 纯净版 jar 包
说明1:采用Spark纯净版jar包,不包含hadoop和hive相关依赖,能避免依赖冲突。
说明2:Hive任务最终由Spark来执行,Spark任务资源分配由Yarn来调度,该任务有可能被分配到集群的任何一个节点。所以需要将Spark的依赖上传到HDFS集群路径,这样集群中任何一个节点都能获取到。
Ⅰ、在HDFS创建路径
[atguigu@hadoop102 software]$ hadoop fs -mkdir /spark-jars
Ⅱ、解压Spark纯净版
[atguigu@hadoop102 software]$ tar -zxvf spark-3.3.1-bin-without-hadoop.tgz
Ⅲ、上传纯净版jar包
[atguigu@hadoop102 spark]$ hadoop fs -put spark-3.3.1-bin-without-hadoop/jars/* /spark-jars
( 6 )修改 hive-site.xml 文件
[atguigu@hadoop102 ~]$ vim /opt/module/hive/conf/hive-site.xml
添加如下内容。
XML
<!--Spark依赖位置(注意:端口号8020必须和namenode的端口号一致)-->
<property>
<name>spark.yarn.jars</name>
<value>hdfs://hadoop102:8020/spark-jars/*</value>
</property>
<!--Hive执行引擎-->
<property>
<name>hive.execution.engine</name>
<value>spark</value>
</property>
3 ) Hive on Spark 测试
(1)启动hive客户端
[atguigu@hadoop102 hive]$ hive
(2)创建一张测试表
hive (default)> create table student(id int, name string);
(3)通过insert测试效果
hive (default)> insert into table student values(1,'abc');
若结果如下,则说明配置成功。
4 )超时问题解决
如果出现超时问题,可以在hive-site.xml文件中添加连接超时的时间参数:
XML
<property>
<name>hive.spark.client.connect.timeout</name>
<value>5000ms</value>
</property>
7.1.2 Yarn 环境配置
1 )增加 ApplicationMaster 资源比例
容量调度器对每个资源队列中同时运行的Application Master占用的资源进行了限制,该限制通过yarn.scheduler.capacity.maximum-am-resource-percent参数实现,其默认值是0.1,表示每个资源队列上Application Master最多可使用的资源为该队列总资源的10%,目的是防止大部分资源都被Application Master占用,而导致Map/Reduce Task无法执行。
生产环境该参数可使用默认值。但学习环境,集群资源总数很少,如果只分配10%的资源给Application Master,则可能出现,同一时刻只能运行一个Job的情况,因为一个Application Master使用的资源就可能已经达到10%的上限了。故此处可将该值适当调大。
(1)在hadoop102的/opt/module/hadoop/etc/hadoop/capacity-scheduler.xml 文件中修改如下参数值
[atguigu@hadoop102 hadoop]$ vim capacity-scheduler.xml
XML
<property>
<name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
<value>0.8</value>
</property
(2)分发capacity-scheduler.xml配置文件
[atguigu@hadoop102 hadoop]$ xsync capacity-scheduler.xml
(3)关闭正在运行的任务,重新启动yarn集群
[atguigu@hadoop103 hadoop]$ stop-yarn.sh
[atguigu@hadoop103 hadoop]$ start-yarn.sh
7.2 数据仓库开发环境
数仓开发工具可选用DBeaver或者DataGrip。两者都需要用到JDBC协议连接到Hive,故需要启动HiveServer2。
1 )启动 HiveServer2
[atguigu@hadoop102 hive]$ hiveserver2
2 )配置 DataGrip 连接
( 1 )创建连接
( 2 )配置连接属性
所有属性配置,和Hive的beeline客户端配置一致即可。初次使用,配置过程会提示缺少JDBC驱动,按照提示下载即可。
3 )测试使用
创建数据库ad,并观察是否创建成功。
( 1 )创建数据库
( 2 )修改数据库
第8章 广告数仓ODS层
ODS层的设计要点如下:
(1)ODS层的表结构设计依托于从业务系统同步过来的数据结构。
(2)ODS层要保存全部历史数据,故其压缩格式应选择压缩比较高的,此处选择gzip。
(3)ODS层表名的命名规范为:ods_表名_单分区增量全量标识(inc/full)。
8.1 广告信息表
建表语句
sql
drop table if exists ods_ads_info_full;
create external table if not exists ods_ads_info_full
(
id STRING comment '广告编号',
product_id STRING comment '产品id',
material_id STRING comment '素材id',
group_id STRING comment '广告组id',
ad_name STRING comment '广告名称',
material_url STRING comment '素材地址'
) PARTITIONED BY (`dt` STRING)
row format delimited fields terminated by '\t'
LOCATION '/warehouse/ad/ods/ods_ads_info_full';
8.2 推广平台表
建表语句
sql
drop table if exists ods_platform_info_full;
create external table if not exists ods_platform_info_full
(
id STRING comment '平台id',
platform_name_en STRING comment '平台名称(英文)',
platform_name_zh STRING comment '平台名称(中文)'
) PARTITIONED BY (`dt` STRING)
row format delimited fields terminated by '\t'
LOCATION '/warehouse/ad/ods/ods_platform_info_full';
8.3 产品表
建表语句
sql
drop table if exists ods_product_info_full;
create external table if not exists ods_product_info_full
(
id STRING comment '产品id',
name STRING comment '产品名称',
price decimal(16, 2) comment '产品价格'
) PARTITIONED BY (`dt` STRING)
row format delimited fields terminated by '\t'
LOCATION '/warehouse/ad/ods/ods_product_info_full';
8.4 广告投放表
建表语句
sql
drop table if exists ods_ads_platform_full;
create external table if not exists ods_ads_platform_full
(
id STRING comment '编号',
ad_id STRING comment '广告id',
platform_id STRING comment '平台id',
create_time STRING comment '创建时间',
cancel_time STRING comment '取消时间'
) PARTITIONED BY (`dt` STRING)
row format delimited fields terminated by '\t'
LOCATION '/warehouse/ad/ods/ods_ads_platform_full';
8.5 日志服务器列表
建表语句
sql
drop table if exists ods_server_host_full;
create external table if not exists ods_server_host_full
(
id STRING comment '编号',
ipv4 STRING comment 'ipv4地址'
) PARTITIONED BY (`dt` STRING)
row format delimited fields terminated by '\t'
LOCATION '/warehouse/ad/ods/ods_server_host_full';
8.6 广告监测日志表
建表语句
sql
drop table if exists ods_ad_log_inc;
create external table if not exists ods_ad_log_inc
(
time_local STRING comment '日志服务器收到的请求的时间',
request_method STRING comment 'HTTP请求方法',
request_uri STRING comment '请求路径',
status STRING comment '日志服务器相应状态',
server_addr STRING comment '日志服务器自身ip'
) PARTITIONED BY (`dt` STRING)
row format delimited fields terminated by '\u0001'
LOCATION '/warehouse/ad/ods/ods_ad_log_inc';
8.7 数据装载脚本
1 ) 在 hadoop102 的 /home/atguigu/bin 目录下创建 ad_hdfs_to_ods.sh
[atguigu@hadoop102 bin]$ vim ad_hdfs_to_ods.sh
2)编写如下内容
bash
#!/bin/bash
APP=ad
if [ -n "$2" ] ;then
do_date=$2
else
do_date=`date -d '-1 day' +%F`
fi
#声明一个Map结构,保存ods表名与origin_data路径的映射关系
declare -A tableToPath
tableToPath["ods_ads_info_full"]="/origin_data/ad/db/ads_full"
tableToPath["ods_platform_info_full"]="/origin_data/ad/db/platform_info_full"
tableToPath["ods_product_info_full"]="/origin_data/ad/db/product_full"
tableToPath["ods_ads_platform_full"]="/origin_data/ad/db/ads_platform_full"
tableToPath["ods_server_host_full"]="/origin_data/ad/db/server_host_full"
tableToPath["ods_ad_log_inc"]="/origin_data/ad/log/ad_log"
load_data(){
sql=""
for i in $*; do
#判断路径是否存在
hadoop fs -test -e ${tableToPath["$i"]}/$do_date
#路径存在方可装载数据
if [[ $? = 0 ]]; then
sql=$sql"load data inpath '${tableToPath["$i"]}/$do_date' overwrite into table ${APP}.$i partition(dt='$do_date');"
fi
done
hive -e "$sql"
}
case $1 in
"ods_ads_info_full")
load_data "ods_ads_info_full"
;;
"ods_platform_info_full")
load_data "ods_platform_info_full"
;;
"ods_product_info_full")
load_data "ods_product_info_full"
;;
"ods_ads_platform_full")
load_data "ods_ads_platform_full"
;;
"ods_server_host_full")
load_data "ods_server_host_full"
;;
"ods_ad_log_inc")
load_data "ods_ad_log_inc"
;;
"all")
load_data "ods_ads_info_full" "ods_platform_info_full" "ods_product_info_full" "ods_ads_platform_full" "ods_server_host_full" "ods_ad_log_inc"
;;
esac
3 ) 增加脚本执行权限
[atguigu@hadoop102 bin]$ chmod +x ad_hdfs_to_ods.sh
4 ) 脚本用法
[atguigu@hadoop102 bin]$ ad_hdfs_to_ods.sh all 2023-01-07
运行结果:
前面章节:
大数据项目------实战项目:广告数仓(第一部分)-CSDN博客