广告数仓:数仓搭建

news2024/12/24 3:17:36

系列文章目录

广告数仓:采集通道创建
广告数仓:数仓搭建


文章目录

  • 系列文章目录
  • 前言
  • 一、环境搭建
    • 1.hive安装
    • 2.编写配置文件
    • 3.拷贝jar包
    • 4.初始化源数据库
    • 5.修改字符集
    • 6.更换Spark引擎
      • 1.上传并解压spark
      • 2.修改配置文件
      • 3.在hadoop上创建需要的文件夹
      • 4.上传依赖
      • 5.优化hive
      • 6.测试hive
  • 二、数仓搭建
    • 1.客户端链接
    • 2.ODS层创建
      • 广告信息表
      • 推广平台表
      • 产品表
      • 广告投放表
      • 日志服务器列表
      • 广告监测日志表
      • 数据装载
    • 3.DIM层创建
      • 广告信息维度表
      • 平台信息维度表
      • 数据装载
  • 总结


前言

我们利用Hive来进行数仓搭建。


一、环境搭建

1.hive安装

将尚硅谷提供的hive压缩包上传解压修改名称,由于我们需要更换spark引擎,所以必须适用尚硅谷提供的,因为里面将spark依赖更换重编译了。
在这里插入图片描述

2.编写配置文件

vim conf/hive-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <!--配置Hive保存元数据信息所需的 MySQL URL地址-->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://hadoop102:3306/metastore?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;allowPublicKeyRetrieval=true</value>
    </property>

    <!--配置Hive连接MySQL的驱动全类名-->
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.cj.jdbc.Driver</value>
    </property>

    <!--配置Hive连接MySQL的用户名 -->
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>

    <!--配置Hive连接MySQL的密码 -->
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>000000</value>
    </property>

    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
    </property>

    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>

    <property>
    <name>hive.server2.thrift.port</name>
    <value>10000</value>
    </property>

    <property>
        <name>hive.server2.thrift.bind.host</name>
        <value>hadoop102</value>
    </property>

    <property>
        <name>hive.metastore.event.db.notification.api.auth</name>
        <value>false</value>
    </property>
    
    <property>
        <name>hive.cli.print.header</name>
        <value>true</value>
    </property>

    <property>
        <name>hive.cli.print.current.db</name>
        <value>true</value>
    </property>
</configuration>
sudo vim /etc/profile.d/my_env.sh 
###
#HIVE_HOME
export HIVE_HOME=/opt/module/hive
export PATH=$PATH:$HIVE_HOME/bin
source /etc/profile.d/my_env.sh

3.拷贝jar包

cp /opt/software/mysql/mysql-connector-j-8.0.31.jar /opt/module/hive/lib/

4.初始化源数据库

数据库操作

mysql -uroot -p000000
create database metastore

终端操作

schematool -initSchema -dbType mysql -verbose

5.修改字符集

mysql操作

use metastore;
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table TABLE_PARAMS modify column PARAM_VALUE mediumtext character set utf8;

登录Hive测试一下,依赖于hadoop环境,记得启动hive之前先启动hadoop
在这里插入图片描述

6.更换Spark引擎

1.上传并解压spark

这个没有特殊修改所以可以直接下载
阿里源
在这里插入图片描述

2.修改配置文件

mv conf/spark-env.sh.template conf/spark-env.sh
vim conf/spark-env.sh

export HADOOP_CONF_DIR=/opt/module/hadoop/etc/hadoop/

在这里插入图片描述

sudo vim /etc/profile.d/my_env.sh
##########
# SPARK_HOME
export SPARK_HOME=/opt/module/spark
export PATH=$PATH:$SPARK_HOME/bin
vim /opt/module/hive/conf/spark-defaults.conf
#####
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
vim /opt/module/hive/conf/hive-site.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.在hadoop上创建需要的文件夹

hadoop fs -mkdir /spark-history
hadoop fs -mkdir /spark-jars

在这里插入图片描述

4.上传依赖

依赖下载阿里源
在这里插入图片描述
将这个文件夹里的jar包全部上传

hadoop fs -put ./jars/* /spark-jars

在这里插入图片描述
共有184个。

5.优化hive

这个现在用不到,但是提前做了

 mv /opt/module/hive/conf/hive-env.sh.template /opt/module/hive/conf/hive-env.sh
vim /opt/module/hive/conf/hive-env.sh

将注释去掉
在这里插入图片描述

6.测试hive

hive
create table student(id int, name string);
insert into table student values(1,'abc');

第一次运行spark引擎需要一些时间,因为他需要调依赖。
在这里插入图片描述
在插入一条数据就很快了。
在这里插入图片描述

二、数仓搭建

1.客户端链接

这里我们使用JetBrains开发的DataGrip
在这里插入图片描述
填写配置信息。然后打开hadoop和hiveservice2
在这里插入图片描述
第一次链接会下载依赖,时间会稍微长一点

在这里插入图片描述
我们创建一个数据库测试一下
在这里插入图片描述
然后把数据库操作挑到ad
在这里插入图片描述

2.ODS层创建

广告信息表

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';

推广平台表

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';

产品表

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';

广告投放表

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';

日志服务器列表

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';

广告监测日志表

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';

数据装载

 vim ~/bin/ad_hdfs_to_ods.sh 
 ######
 
 #!/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

添加权限并运行

chmod +x ~/bin/ad_hdfs_to_ods.sh
ad_hdfs_to_ods.sh all 2023-01-07

内存计算非常快
在这里插入图片描述
确定数据导入成功即可
在这里插入图片描述

3.DIM层创建

广告信息维度表

drop table if exists dim_ads_info_full;
create external table if not exists dim_ads_info_full
(
    ad_id         string comment '广告id',
    ad_name       string comment '广告名称',
    product_id    string comment '广告产品id',
    product_name  string comment '广告产品名称',
    product_price decimal(16, 2) comment '广告产品价格',
    material_id   string comment '素材id',
    material_url  string comment '物料地址',
    group_id      string comment '广告组id'
) PARTITIONED BY (`dt` STRING)
    STORED AS ORC
    LOCATION '/warehouse/ad/dim/dim_ads_info_full'
    TBLPROPERTIES ('orc.compress' = 'snappy');

平台信息维度表

drop table if exists dim_platform_info_full;
create external table if not exists dim_platform_info_full
(
    id               STRING comment '平台id',
    platform_name_en STRING comment '平台名称(英文)',
    platform_name_zh STRING comment '平台名称(中文)'
) PARTITIONED BY (`dt` STRING)
    STORED AS ORC
    LOCATION '/warehouse/ad/dim/dim_platform_info_full'
    TBLPROPERTIES ('orc.compress' = 'snappy');

数据装载

vim ~/bin/ad_ods_to_dim.sh 
###### 
#!/bin/bash

APP=ad

# 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天
if [ -n "$2" ] ;then
    do_date=$2
else 
    do_date=`date -d "-1 day" +%F`
fi

dim_platform_info_full="
insert overwrite table ${APP}.dim_platform_info_full partition (dt='$do_date')
select
    id,
    platform_name_en,
    platform_name_zh
from ${APP}.ods_platform_info_full
where dt = '$do_date';
"

dim_ads_info_full="
insert overwrite table ${APP}.dim_ads_info_full partition (dt='$do_date')
select
    ad.id,
    ad_name,
    product_id,
    name,
    price,
    material_id,
    material_url,
    group_id
from
(
    select
        id,
        ad_name,
        product_id,
        material_id,
        group_id,
        material_url
    from ${APP}.ods_ads_info_full
    where dt = '$do_date'
) ad
left join
(
    select
        id,
        name,
        price
    from ${APP}.ods_product_info_full
    where dt = '$do_date'
) pro
on ad.product_id = pro.id;
"

case $1 in
"dim_ads_info_full")
    hive -e "$dim_ads_info_full"
;;
"dim_platform_info_full")
    hive -e "$dim_platform_info_full"
;;
"all")
    hive -e "$dim_ads_info_full$dim_platform_info_full"
;;
esac

测试一下

chmod +x ~/bin/ad_ods_to_dim.sh
ad_ods_to_dim.sh all 2023-01-07

在这里插入图片描述

总结

数仓一次写不完了,剩下的下次在写

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

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

相关文章

离散数学题目收集整理练习(期末过关进度10%)

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;离散数学考前复习&#xff08;知识点题&#xff09; &#x1f353;专栏&#xff1a;概率论期末速成&#xff08;一套卷&#xff09; &#x1f433;专栏&#xff1a;数字电路考前复习 ✨博主的其他文章&#xff1a;点击…

观察者模式(二十)

相信自己&#xff0c;请一定要相信自己 上一章简单介绍了迭代器模式(十九), 如果没有看过, 请观看上一章 一. 观察者模式 引用 菜鸟教程里面 观察者模式介绍: https://www.runoob.com/design-pattern/observer-pattern.html 当对象间存在一对多关系时&#xff0c;则使用观察…

cef支持.net6.0

开发环境&#xff1a;vs2022,.net6.0 cef CefSharp.Common.NETCore 114.2.100 安装 Cefsharp简介 CEF &#xff0c;全称Chromium Embedded Framework &#xff0c;基于谷歌 Chromium项目的开源Web Browser控件&#xff0c;它的主要用途是嵌入了第三方应用以实现浏览器相关的功…

【C#】简单认识TransactionScope,以及常见的事务类型

在实际项目开发时&#xff0c;后端编码少不了事务处理。 为什么要用事务&#xff0c;其中一个最直接的原因就是保持数据完整性和一致性 目录 1、C#事务概念1.1、逻辑单元1.2、Transaction对象1.3、事务简单实例 2、事务场景描述3、事务流程图3.1、没有事务流程3.2、有事务流程 …

黑客是怎样练成的?

网学黑客技术的人越来越多了&#xff0c;不少人都不知道该怎么学&#xff0c;今天就来详细的说一说黑客是如何炼成的。 首先&#xff0c;什么是黑客&#xff1f; 黑客 &#xff1a;泛指擅长IT技术的电脑高手 黑客一词&#xff0c;源自英文Hacker&#xff0c;早期其实就是一群…

【MySQL】一文带你了解检索数据

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…

21 RBM(Restricted Boltzmann Machine)——受限玻尔兹曼机

文章目录 21 RBM(Restricted Boltzmann Machine)——受限玻尔兹曼机21.1 背景介绍22.2 RBM模型表示22.3 Inference问题22.4 Marginal问题 21 RBM(Restricted Boltzmann Machine)——受限玻尔兹曼机 21.1 背景介绍 什么是玻尔兹曼机&#xff1a; 简单来说就是具有条件的Marko…

无线蓝牙耳机排行榜,十大口碑最好蓝牙耳机

近年来&#xff0c;随着生活水平的提高&#xff0c;越来越多的人对高品质蓝牙耳机的需求日益增加。无论我们在选购什么产品&#xff0c;我们都会考虑一个价值范围&#xff0c;买蓝牙耳机也是同样&#xff0c;都会给自己一个预算&#xff0c;然后根据预算去网上搜寻这个价格范围…

【python学习】-读入xlsx文件,将datetime.time转为minute的格式,并将新数据存入csv文件

读入xlsx文件&#xff0c;将datetime.time转为minute的格式&#xff0c;并将新数据存入csv文件 任务概要思路设计代码实现导入相关库时间转换函数算法内核csv文件结果 接到一个需求&#xff0c;师兄在做稳定性测试时&#xff0c;时间显示格式为<class ‘datetime.time’>…

深入剖析 Python 函数参数传递机制及高级应用

前言 在本篇文章中&#xff0c;笔者将带你深入探讨 Python 函数传参的进阶主题。 通过阅读本篇文章&#xff0c;你可以深入了解 Python 函数传参的进阶主题&#xff0c;掌握更多高级的函数技巧&#xff0c;提升你的 Python 编程能力。 前面分享了Python 函数传参基础篇&#xf…

图像生成--对抗生成模型

生成模型概述 对抗生成模型 机器学习中的两大主要问题&#xff1a; 判别生成 判别模型的典型代表即为图像分类任务&#xff0c;即给定一个数据&#xff0c;判定他是哪一类。 判别模型学习到的是一个概率&#xff08;贝叶斯过程&#xff09; 而生成模型的区别在于&#xf…

【Elacticsearch】 原理/数据结构/面试经典问题整理

对Elacticsearch 原理/数据结构/面试经典问题整理的文章&#xff1b; 映射 | Elasticsearch: 权威指南 | Elastic Elacticsearch介绍 Elasticsearch,这里简称ES。ES是一个开源的高可用高扩展的分布式全文搜索与分析引擎&#xff0c;可以提供PB级近实时的数据存储和检索能力&am…

SpringBoot自定义starter入门

一、创建一个普通的Maven项目 pom.xml文件修改 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&quo…

你知道如何将音频转文字吗?

我跟你们说&#xff0c;我认识一名盲人音乐人&#xff0c;他很热爱音乐创作&#xff0c;但是因为听力的限制&#xff0c;无法像其他人那样从录音中获取音乐素材。然而&#xff0c;有一天他听说了一个神奇的功能——音频转文字&#xff0c;这个功能可以将音频文件转换成文字文本…

从技术谈到管理,把系统优化的技术用到企业管理

很多技术人员在职业上对自己要求高&#xff0c;工作勤奋&#xff0c;承担越来越大的责任&#xff0c;最终得到信任&#xff0c;被提拔到管理岗位。但是往往缺乏专业的管理知识&#xff0c;在工作中不能从整体范围优化工作流程&#xff0c;仍然是“个人贡献者”的工作方式&#…

低功耗晶振电路设计

晶振电路设计 晶振中负性阻抗的原理 晶振的回路主要由两部分组成&#xff0c; 一部分是激活分支&#xff0c; 用于提供能量给晶振启动直至达到稳定的相位&#xff0c;另一部分是被动分支&#xff0c; 主要由电阻&#xff0c; 两个外部负载电容以及所有的寄生电容&#xff0c;…

手写RPC总结篇

协议制定&#xff1a;client到server做交互的通信协议&#xff0c;比如request response 网络端点peer 难点1 : Jetty嵌入 ◆jetty Server ◆ServletContextHandler ◆ServletHolder jetty server 起到网络监听的作用ServletContextHandler注册到jetty server中ServletHolde…

测试开发之Python自动化 Pytest 之 fixture

Pytest 之 fixture unittest 和 nose 都支持 fixture 的,但是 fixture 在 pytest 里使用更灵活。也算是 pytest 的一个闪光点吧可以理解为一个跟 setup 和 teardown 这种前后置类似的东西。但是比它们要强大、灵活很多 fixtur 当做参数传入 # -*- coding: utf-8 -*-import p…

图像处理实战02-yolov5目标检测

yolov5 YOLOv5 是一种目标检测算法&#xff0c;它是 YOLO (You Only Look Once) 系列算法的最新版本。YOLOv5 采用了一种新的架构&#xff0c;它包括一个基于 CSPNet (Cross Stage Partial Network) 的主干网络以及一系列改进的技巧&#xff0c;如多尺度训练、数据增强、网络混…

互联网行业-镭速文件传输系统方案

互联网行业是一个快速变化和高度竞争的行业&#xff0c;这一行业需要传输大量的数据、代码和文件。在互联网企业的生产和运营过程中&#xff0c;需要传输各种敏感和大型的文件&#xff0c;例如业务报告、数据分析、软件代码等。这些文件需要在不同的部门、不同的地点之间高效地…