当前位置: 首页 > news >正文

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

目录

第7章 数据仓库环境准备

7.1 数据仓库运行环境

7.1.1 Hive环境搭建

7.1.2 Yarn环境配置

7.2 数据仓库开发环境

第8章 广告数仓ODS层

8.1 广告信息表

8.2 推广平台表

8.3 产品表

8.4 广告投放表

8.5 日志服务器列表

8.6 广告监测日志表

8.7 数据装载脚本


第7章 数据仓库环境准备

7.1 数据仓库运行环境

7.1.1 Hive环境搭建

1Hive安装

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

2Hive 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

添加如下内容。

# 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

添加如下内容(在执行任务时,会根据如下参数执行)。

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

添加如下内容。

<!--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>

3Hive 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文件中添加连接超时的时间参数:

<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

<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 广告信息表

建表语句

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 推广平台表

建表语句

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 产品表

建表语句

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 广告投放表

建表语句

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 日志服务器列表

建表语句

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 广告监测日志表

建表语句

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 数据装载脚本

1hadoop102/home/atguigu/bin目录下创建ad_hdfs_to_ods.sh

[atguigu@hadoop102 bin]$ vim ad_hdfs_to_ods.sh

2)编写如下内容

#!/bin/bashAPP=adif [ -n "$2" ] ;thendo_date=$2
elsedo_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 ]]; thensql=$sql"load data inpath '${tableToPath["$i"]}/$do_date' overwrite into table ${APP}.$i partition(dt='$do_date');"fidonehive -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博客

相关文章:

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

目录 第7章 数据仓库环境准备 7.1 数据仓库运行环境 7.1.1 Hive环境搭建 7.1.2 Yarn环境配置 7.2 数据仓库开发环境 第8章 广告数仓ODS层 8.1 广告信息表 8.2 推广平台表 8.3 产品表 8.4 广告投放表 8.5 日志服务器列表 8.6 广告监测日志表 8.7 数据装载脚本 第7章…...

cmake+ninja交叉编译android下的静态库

文章目录 cmakeninja案例背景重新安装ninja编译通过 参考 想整理一个库的cmake工程&#xff0c;他用 cmakeninja 简单了解了一下&#xff0c;是可以不依赖Android studio编译的cmake的&#xff0c;搜到了一个cmakeninja&#xff0c;参考[1] 案例 参考[1]中的代码 背景 cm…...

Vue项目-Table添加Form表单校验

一、HTML <template><div class"taskInfo"><el-form:model"generateParams":rules"formRules"ref"formRef"class"taskInfoForm"label-width"100px"><ul class"taskInfoSearch"&g…...

【iOS】—— 事件传递链和响应者链总结

事件传递链和响应者链总结 1. 事件传递链&#xff1a;事件传递链&#xff1a;传递流程&#xff1a;总结第一响应者&#xff1a; 2. 响应者链响应者链传递流程总结响应者链流程 总结&#xff1a; 之前也学习过这个内容这次在复习的时候&#xff0c;就想着写一下总结&#xff1a;…...

【多线程】初识进程和线程

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;多线程 / javaEE初阶 前言 在我们之前编写的所有代码&#xff0c;都只能用上一个核心。众所周知&#xff0c;现在大多数CPU都有多个核心&#xff0c;但此时&#xff0c;无论如法优化程序&#xff0c…...

1DCNN-2DResNet并行故障诊断模型

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 Python轴承故障诊断入门教学-CSDN博客 Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型-CSDN博客 Python轴承故障诊断 (14)高创新故障识别模型-CSDN…...

Java设计模式(原型模式)

定义 使用原型实例指定待创建对象的类型&#xff0c;并且通过复制这个原型来创建新的对象。 角色 Prototype&#xff08;抽象原型角色&#xff09; ConcretePrototype&#xff08;具体原型角色&#xff09; Client&#xff08;客户端角色 优点 简化对象的创建过程&#xff0c…...

C/C++ 知识点:typedef 关键字

文章目录 一、typedef 关键字1、 基本用法2、常见用法2.1、为基本数据类型定义别名2.2、为结构体或联合体定义别名2.3、为指针类型定义别名2.4、为复杂模板类型定义别名 3、注意事项4、总结 前言&#xff1a; 在C&#xff08;以及C语言&#xff09;中&#xff0c;typedef 关键字…...

【Linux学习】进程间通信之 匿名管道 与 基于管道的进程池

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f351;进程间通信&#x1f42c;进程间通信目的 &#x1f4da;管道 &#x1f4d5;管道的原理&#x1f427;用fork来共享管道原…...

小团队如何选需求管理软件?8款顶级推荐

本文将分享8款适合小团队的需求管理软件&#xff1a;PingCode、Worktile、Tapd、Teambition、禅道、Asana、Jama Connect、Aha!。 在小团队中管理需求时&#xff0c;寻找合适的软件工具常常让人头疼&#xff0c;不同的需求管理软件提供各种功能&#xff0c;但哪些功能真正适合…...

docker操作入门

1.创建镜像&#xff0c;使用当前文件 docker build -t experience . 2.运行容器 docker run -d -p 8501:8501 --name my-running-app my-python-api docker run -p 8508:8508 experience docker run -p 8508:8508 -p 8509:8509 experience 3.查看容器状态 docker ps docker p…...

简单的射箭小游戏网页源码

简单的射箭小游戏网页源码,对准靶心开启你的射击之旅吧 微信扫码免费获取源码...

Python | Leetcode Python题解之第331题验证二叉树的前序序列化

题目&#xff1a; 题解&#xff1a; class Solution:def isValidSerialization(self, preorder: str) -> bool:pre 1for i in preorder.split(,):if i.isdigit():if pre 0:return Falsepre 1else:if pre 0:return Falsepre - 1return pre 0...

0x3 “护网行动”守之道

一、护网防守目标系统 二、护网防守之利器 通过安全流程控制、安全技术保障、安全工具支撑、安全能力提升四个层次全面构成安全防御体系。 安全技术名称解释 IPS&#xff08;入侵防御系统&#xff09;WAF&#xff08;Web应用防火墙&#xff09;IDS&#xff08;入侵检测系统&a…...

白骑士的Matlab教学高级篇 3.1 高级编程技术

系列目录 上一篇&#xff1a;白骑士的Matlab教学进阶篇 2.5 Simulink 高级编程技术在MATLAB中扮演着至关重要的角色&#xff0c;帮助用户更高效地编写复杂程序、提高代码的可维护性和可读性。本节将介绍面向对象编程、函数句柄与回调函数、错误处理与调试的相关内容。 面向对…...

haproxy简介与用法

一、负载均衡 1.1、概念&#xff1a; 负载均衡SLB&#xff08;Server Load Balancer&#xff09;是一种对流量进行按需分发的服务&#xff0c;通过将流量分发到不同的后端服务来扩展应用系统的服务吞吐能力&#xff0c;并且可以消除系统中的单点故障&#xff0c;提升应用系统…...

Geoscene Pro的三维

一、场景设置 1.3D视图分为全局场景和局部场景。在Geoscene Pro中&#xff0c;两个场景可以自由切换。 &#xff08;1&#xff09;全局场景有固定的坐标系GCS&#xff08;WGS84、CGCS2000&#xff09;&#xff0c;并在全球比例尺下展示&#xff08;全球范围&#xff09;。可以…...

论文阅读 - Scaling Up k-Clique Densest Subgraph Detection | SIGMOD 2023

1. 论文背景 密集子图发现&#xff08;Densest Subgraph Discovery&#xff09;是图挖掘领域的一个基础研究方向&#xff0c;并且近年来在多个应用领域得到了广泛研究。特别是在生物学、金融学和社交网络分析等领域&#xff0c;密集子图的发现对理解复杂网络结构和行为具有重要…...

前端框架(三件套)

学习网站 HTML 系列教程&#xff08;有广告&#xff09; HTML&#xff08;超文本标记语言&#xff09; | MDN (mozilla.org)&#xff08;英文不太友好&#xff09; 1.HTML5 & CSS3 1.1HTML5表格 <!DOCTYPE html> <html lang"en"> <head>…...

MemoryCache 缓存 实用

MemoryCache 缓存 实用,相关逻辑代码里已详细注释&#xff0c; 在Java中创建一个单例模式&#xff08;Singleton Pattern&#xff09;的MyMemoryCache类&#xff0c;可以采用多种方法&#xff0c;其中最常见的是使用“饿汉式”和“懒汉式”&#xff08;线程安全和非线程安全&am…...

BetterJoy完整配置指南:5分钟让Switch手柄在PC上完美运行

BetterJoy完整配置指南&#xff1a;5分钟让Switch手柄在PC上完美运行 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode.c…...

孤舟笔记 互联网常用框架篇三 Dubbo是如何动态感知服务下线的?注册中心和服务端双保险

文章目录先说结论机制一&#xff1a;注册中心通知机制二&#xff1a;心跳检测机制三&#xff1a;连接事件感知机制四&#xff1a;定时拉取四种机制的协作回答技巧与点评加分回答面试官点评个人网站微服务环境下&#xff0c;服务实例随时可能上下线——重启、扩容、宕机……调用…...

随机森林算法在儿童出行方式预测中的实战应用与优化

1. 项目概述&#xff1a;用随机森林预测孩子怎么上学做城市交通规划或者做家长接送方案的时候&#xff0c;你肯定想过一个问题&#xff1a;孩子们到底是怎么上学的&#xff1f;是走路、骑车、坐公交还是家长开车送&#xff1f;这个问题看似简单&#xff0c;背后却牵扯到城市规划…...

3大实战秘籍:揭秘raylib如何让游戏开发像搭积木一样简单

3大实战秘籍&#xff1a;揭秘raylib如何让游戏开发像搭积木一样简单 【免费下载链接】raylib A simple and easy-to-use library to enjoy videogames programming 项目地址: https://gitcode.com/GitHub_Trending/ra/raylib 你是否曾经被复杂的游戏引擎配置搞得焦头烂额…...

双稳健机器学习:用正交性与交叉拟合解决因果推断中的ML偏差

1. 项目概述&#xff1a;当机器学习遇见因果推断的“干扰”难题在实证研究的日常工作中&#xff0c;我们常常面临一个核心矛盾&#xff1a;我们真正关心的&#xff0c;往往只是一个或几个关键参数——比如一项政策对就业率的平均影响&#xff08;平均处理效应&#xff0c;ATE&a…...

告别硬编码!在UE5.1里用蓝图动态配置MySQL连接参数(控件蓝图实战)

动态配置MySQL连接&#xff1a;UE5.1控件蓝图的工程化实践在游戏开发中&#xff0c;数据库连接往往是项目架构中不可或缺的一环。传统硬编码方式虽然简单直接&#xff0c;却带来了维护困难、安全性差、灵活性低等一系列问题。本文将深入探讨如何在UE5.1中构建一个完全动态化的M…...

接口测试用例设计:超详细防御体系与分层校验实践

1. 为什么“超详细”三个字在接口测试用例里不是修饰词&#xff0c;而是生死线我带过三支不同行业的测试团队——金融支付、SaaS中台、IoT设备管理平台。每次新人入职第一周&#xff0c;我都会收走他们写的前5条接口测试用例&#xff0c;逐行标红批注。不是因为格式不对&#x…...

如何通过Joy-Con Toolkit实现专业级Switch手柄控制与硬件逆向工程

如何通过Joy-Con Toolkit实现专业级Switch手柄控制与硬件逆向工程 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit 在游戏开发、硬件调试和嵌入式系统研究中&#xff0c;与游戏手柄等专业输入设备进行深度交互一直…...

【C++】零基础入门 · 第 4 节:循环结构(while、for、do-while)

上一节我们学习了条件判断&#xff0c;这一节来学习循环结构。循环让程序能够重复执行某段代码&#xff0c;直到满足特定条件为止。C 提供了三种循环语句&#xff1a;while、for 和 do-while。 1. while 循环&#xff1a;先判断后执行 while 循环在每次执行前先检查条件&#x…...

如何快速无损转换B站m4s视频:完整工具使用指南

如何快速无损转换B站m4s视频&#xff1a;完整工具使用指南 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾为B站缓存视频无法在其他设备…...