当前位置: 首页 > 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博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2024半年度盘点 | 全球重大勒索软件攻击事件(非常详细)零基础入门到精通,收藏这一篇就够了
  • ISP代理与双ISP代理的区别
  • 【Kubernetes】Service 概念与实战
  • React 中 useEffect 语法详解
  • 人工智能在子宫内膜癌领域的研究进展|顶刊速递·24-08-12
  • QT移除窗体的最大化和最小化按钮
  • Unity Audio
  • 实验25.创建文件
  • linux中信号的相关概念
  • 利用QT和FFmpeg实现一个简单的视频播放器
  • android视频播放,(一)MediaPlayer视频播放示例
  • 微调LLama 3.1——七月论文审稿GPT第5.5版:拿早期paper-review数据集微调LLama 3.1
  • Docker的卸载|安装|启动|停止|重启
  • vue防止鼠标左键拖动选中页面的元素
  • Elasticsearch 文档修改:全量更新与增量更新
  • [数据结构]链表的实现在PHP中
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • create-react-app做的留言板
  • IDEA常用插件整理
  • IOS评论框不贴底(ios12新bug)
  • Java反射-动态类加载和重新加载
  • mongo索引构建
  • MYSQL 的 IF 函数
  • Next.js之基础概念(二)
  • PermissionScope Swift4 兼容问题
  • Python连接Oracle
  • STAR法则
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 产品三维模型在线预览
  • 判断客户端类型,Android,iOS,PC
  • 区块链分支循环
  • 时间复杂度与空间复杂度分析
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 数组的操作
  • 微信小程序:实现悬浮返回和分享按钮
  • 用简单代码看卷积组块发展
  • 在electron中实现跨域请求,无需更改服务器端设置
  • ​比特币大跌的 2 个原因
  • #include到底该写在哪
  • ${ }的特别功能
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (不用互三)AI绘画工具应该如何选择
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (算法)求1到1亿间的质数或素数
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)关于pipe()的详细解析
  • (转载)从 Java 代码到 Java 堆