大数据技术——实战项目:广告数仓(第四部分)

目录

[第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 安装

大数据技术------Hive的安装与部署-CSDN博客

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官网下载安装包地址:

Downloads | Apache 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博客

大数据项目------实战项目:广告数仓(第二部分)-CSDN博客

大数据技术------实战项目:广告数仓(第三部分)-CSDN博客

相关推荐
小刘鸭!4 小时前
Flink中并行度和slot的关系——任务和任务槽
大数据·flink
LI JS@你猜啊4 小时前
Elasticsearch 集群
大数据·服务器·elasticsearch
筒栗子4 小时前
复习打卡大数据篇——Hadoop HDFS 03
大数据·hadoop·hdfs
SelectDB7 小时前
Apache Doris 创始人:何为“现代化”的数据仓库?
大数据·数据库·云原生
SelectDB7 小时前
飞轮科技荣获中国电信星海大数据最佳合作伙伴奖!
大数据·数据库·数据分析
小刘鸭!8 小时前
Hbase的特点、特性
大数据·数据库·hbase
Elastic 中国社区官方博客8 小时前
如何通过 Kafka 将数据导入 Elasticsearch
大数据·数据库·分布式·elasticsearch·搜索引擎·kafka·全文检索
nece0018 小时前
elasticsearch 杂记
大数据·elasticsearch·搜索引擎
开心最重要(*^▽^*)8 小时前
Es搭建——单节点——Linux
大数据·elasticsearch
学计算机的睿智大学生10 小时前
Hadoop的生态系统所包含的组件
大数据·hadoop·分布式