黑马Hive+Spark离线数仓工业项目--数仓事实层DWB层构建(3)

news2024/9/25 21:30:55

网点物料事实指标分析及实现

目标:实现DWB层网点物料事实指标表的构建

路径

  - step1:目标需求
  - step2:数据来源
  - step3:目标实现

实施

  - **目标需求**:基于物料申请单的信息统计物料申请数量、物料申请金额等指标

数据来源

目标实现

建表

抽取

    

 

在线教育项目回顾

在线教育项目需求

目标:掌握在线教育项目需求

实施

常规的需求:通过对数据进行数据分析处理,得到一些指标,来反映一些事实,支撑运营决策
行业:在线教育行业
产品:课程
需求:提高学员报名的转换率,实现可持续化的运营发展
    - 需求1:分析学员从访问到报名每个环节的留存率和流失率,发现每个环节存在的问题,解决问题,提高报名率
      - 访问分析
      - 咨询分析
      - 意向分析
      - 报名分析
      - 通过各个环节的分析,来发现每个环节流失原因,解决问题,实现提高每一步转化率
    - 需求2:持续化发展需要构建良好的产品口碑,把控学员学习质量:通过对考试、考勤、作业做管理和把控
      - 考勤分析

02:需求主题划分

目标:掌握在线教育中需求主题的划分
实施
数据仓库的数据管理划分
    - 数据仓库【DW】:存储了整个公司所有数据
      - 数据集市/主题域【DM】:按照一定的业务需求进行划分:部门、业务、需求
        - 主题:每一个主题就面向最终的一个业务分析需求
  - **在线教育中的需求主题**
    - 数据仓库:业务系统数据【客服系统、CRM系统、学员管理系统】
      - 业务数据仓库:结构化数据
    - 数据集市/主题域
      - 运营管理集市/运营域
      - 销售管理集市/销售域
      - 学员管理集市/用户域
      - 产品管理集市/产品域
      - 广告域
      - ……
    - 数据主题
      - 来源分析主题、访问分析主题、咨询分析主题
      - 销售分析主题、线索分析主题、意向分析主题、报名分析主题
      - 考勤分析主题、考试分析主题、作业分析主题
      - 产品访问主题、产品销售主题、产品付费主题
      - 表名:层 _ 【域】 _ 主题 _ 维度表
 

03:数据来源

目标:掌握在线教育平台的数据来源
实施
访问分析主题、咨询分析主题*
    - ==客服系统==:**客服系统数据库**
    - 需求:统计不同维度下的访问用户数、咨询用户数
      - 指标:UV、PV、IP、Session、跳出率、二跳率
      - 维度:时间、地区、来源渠道、搜索来源、来源页面
    - web_chat_ems
    - web_chat_text_ems
  - **线索分析主题、意向分析主题、报名分析主题**
    - ==CRM系统==:**营销系统数据库**
    - 需求:统计不同维度下意向用户个数、报名用户个数、有效线索个数
      - 维度:时间、地区、来源渠道、线上线下、新老学员、校区、学科、销售部门
    - customer_relationship:意向与报名信息表
    - customer_clue:线索信息表
    - customer:学员信息表
    - itcast_school:校区信息表
    - itcast_subject:学科信息表
    - employee:员工信息表
    - scrm_deparment:部门信息表
    - itcast_clazz:报名班级信息表
  - **考勤分析主题**
    - 数据来源:**==学员管理系统==**
    - 需求:统计不同维度下学员考勤指标:出勤人数、出勤率、迟到、请假、旷课
    - tbh_student_signin_record:学员打卡信息表
    - student_leave_apply:学员请假信息表
    - tbh_class_time_table:班级作息时间表
    - course_table_upload_detail:班级排课表
    - class_studying_student_count:班级总人数表

04:数仓设计

目标:掌握业务分析主题中每个主题数仓的实现流程

实施

访问分析主题
    - ODS:web_chat_ems、web_chat_text_ems
    - DWD:将两张表进行合并,并且实现ETL
    - DWS:基于不同维度统计所有访问数据的用户个数、会话个数、Ip个数

  咨询分析主题
    - ODS:web_chat_ems、web_chat_text_ems
    - DWD:直接复用了访问分析的DWD
    - DWS:基于不同维度统计所有咨询【msg_count > 0】数据的用户个数、会话个数、Ip个数

意向分析主题
    - ODS:customer_relationship、customer_clue
    - DIM:customer、employee、scrm_department、itcast_shcool、itcast_subject
    - DWD:对customer_relationship实现ETL
    - DWM:实现所有表的关联,将所有维度和事实字段放在一张表中
    - DWS:实现基于不同维度的聚合得到意向人数

报名分析主题
    - ODS:customer_relationship
    - DIM:customer、employee、scrm_department、itcast_clazz
    - DWD:对customer_relationship实现ETL并且过滤报名数据
    - DWM:实现四张表的关联,将所有维度和事实字段放在一张表中
    - DWS:基于小时维度对其他组合维度进行聚合得到指标
    - APP:基于小时的结果累加得到天、月、年维度下的事实的结果

考勤管理主题

    - ODS:tbh_student_signin_record、student_leave_apply
    - DIM:tbh_class_time_table、course_table_upload_detail、class_studying_student_count
    - DWD:没有
    - DWM
      - 学员出勤状态表:基于学员打卡信息表
      - 班级出勤状态表:基于学员出勤状态表
      - 班级请假信息表:基于请假信息表得到的
      - 班级旷课信息表:总人数 - 出勤人数 - 请假人数
    - DWS:基于天构建天+班级维度下的出勤指标:24个
    - APP:基于人次进行Sum累加重新计算月、年的出勤指标

05:技术架构

目标:掌握整个项目的技术架构

实施

  - 数据源:MySQL数据库
  - 数据采集:Sqoop
  - 数据存储:Hive:离线数据仓库
  - 数据处理:HiveSQL【MapReduce】 =》 以后简历中要改为SparkSQL等工具来实现
  - 数据结果:MySQL
  - 数据报表:FineBI
  - 协调服务:Zookeeper
  - 可视化交互:Hue
  - 任务流调度:Oozie
  - 集群管理监控:Cloudera Manager
  - 项目版本管理:Git 

06:项目优化

目标:掌握Hive的常见优化

实施

属性优化

    - 本地模式

      ```properties
      hive.exec.mode.local.auto=true;
      ```

    - JVM重用

      ```properties
      mapreduce.job.jvm.numtasks=10
      ```

    - 推测执行

      ```properties
      mapreduce.map.speculative=true
      mapreduce.reduce.speculative=true
      hive.mapred.reduce.tasks.speculative.execution=true
      ```

    - Fetch抓取

      ```properties
      hive.fetch.task.conversion=more
      ```

    - 并行执行

      ```properties
      hive.exec.parallel=true
      hive.exec.parallel.thread.number=16
      ```

    - 压缩

      ```properties
      hive.exec.compress.intermediate=true
      hive.exec.orc.compression.strategy=COMPRESSION
      mapreduce.map.output.compress=true
      mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.DefaultCodec
      ```

    - 矢量化查询

      ```properties
      hive.vectorized.execution.enabled = true;
      hive.vectorized.execution.reduce.enabled = true;
      ```

    - 零拷贝

      ```properties
      hive.exec.orc.zerocopy=true;
      ```

    - 关联优化

      ```properties
      hive.optimize.correlation=true;
      ```

    - CBO优化器

      ```properties
      hive.cbo.enable=true;
      hive.compute.query.using.stats=true;
      hive.stats.fetch.column.stats=true;
      hive.stats.fetch.partition.stats=true;
      ```

    - 小文件处理

      ```properties
      #设置Hive中底层MapReduce读取数据的输入类:将所有文件合并为一个大文件作为输入
      hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
      #如果hive的程序,只有maptask,将MapTask产生的所有小文件进行合并
      hive.merge.mapfiles=true;
      hive.merge.mapredfiles=true;
      hive.merge.size.per.task=256000000;
      hive.merge.smallfiles.avgsize=16000000;
      ```

    - 索引优化

      ```properties
      hive.optimize.index.filter=true
      ```

    - 谓词下推PPD

      ```properties
      hive.optimize.ppd=true;
      ```

      - Inner Join和Full outer Join,条件写在on后面,还是where后面,性能上面没有区别
      - Left outer Join时 ,右侧的表写在on后面,左侧的表写在where后面,性能上有提高
      - Right outer Join时,左侧的表写在on后面、右侧的表写在where后面,性能上有提高
      - 如果SQL语句中出现不确定结果的函数,也无法实现下推

 SQL优化

    - 核心思想:先过滤后处理

      - where和having使用
      - join中on和where使用
      - 将大表过滤成为小表再join

设计优化

    - 分区表:减少了MapReduce输入,避免不需要的过滤

    - 分桶表:减少了比较次数,实现数据分类,大数据拆分,构建Map Join

    - 文件存储:优先选用列式存储:parquet、orc

07:项目问题

目标:掌握Hive的常见优化

实施

内存问题:现象程序运行失败

    - OOM:out of memory

堆内存不足:给Task进程分配更多的内存

    - 物理内存不足

      - 允许NodeManager使用更多的内存
      - 硬件资源可以扩充:扩充物理内存
      - 调整代码:基于分区处理、避免Map Join

    - 虚拟内存不足:调整虚拟内存的比例,默认为2.1

  - **数据倾斜问题**:程序运行时间长,一直卡在99%或者100%

 

现象

      - 运行一个程序,这个程序的某一个Task一直在运行,其他的Task都运行结束了,进度卡在99%或者100%

基本原因

      - 基本原因:这个ReduceTask的负载要比其他Task的负载要高

        - ReduceTask的数据分配不均衡

根本原因:分区的规则

      - 默认分区:根据K2的Hash值取余reduce的个数

        - 优点:相同的K2会由同一个reduce处理
        - 缺点:可能导致数据倾斜

数据倾斜的场景

      - group by / count(distinct)
      - join

解决方案

      - group by / count(distinct)

        - 开启Combiner

          ```
          hive.map.aggr=true
          ```

        - 随机分区

          - 方式一:开启参数

            ```
            hive.groupby.skewindata=true
            ```

            - 开启这个参数以后,底层会自动走两个MapReduce

            - 第一个MapReduce自动实现随机分区
            - 第二个MapReduce做最终的聚合

          - 方式二:手动指定

            ```
            distribute by rand():将数据写入随机的分区中
            ```

            ```
            distribute by 1 :将数据都写入一个分区
            ```

            

    - join

      - 方案一:尽量避免走Reduce Join

        - Map Join:尽量将不需要参加Join的数据过滤,将大表转换为小表
        - 构建分桶Bucket Map Join

      - 方案二:skewjoin:避免数据倾斜的Reduce Join过程

      

 


    - 调大分区个数:重分区
    - Join时候,  可以将小的数据实现广播
    - 自定义分区规则:RDD五大特性:对于二元组类型的RDD,可以指定分区器
      - reduceByKey(partitionClass = HashPartition)

- 技术面试:理论为主

  - Hadoop:HDFS读写原理,YARN中程序运行流程、端口号、哪些进程、MapReduce运行过程

  - Hive:SQL语句,函数应用

    - 字符串函数、日期函数、判断函数、窗口函数

      

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

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

相关文章

Scriptcase配置日期字段位置日期格式的功能

Scriptcase配置日期字段位置日期格式的功能 在“翻译应用程序”工具中添加了搜索索引的快速搜索。 在项目列表屏幕上添加了垂直方向的固定条。 在登录和许可证注册屏幕上添加了显示/隐藏密码图标。 在快速编辑中添加了错误位置选项。 在Express Edit中的模式中添加了“显示字段…

电容触摸屏GT9147介绍

GT9147简介 GT9147是采用最新的电容检测技术,内置高性能微信号检测电路,可很好地解决LCD干扰和共模干扰问题。软件算法方面,专门基于单层互容的电气环境所设计,可支持5点触控。同时支持HotKnot功能 GT9147可同时识别5个触摸点位的…

宝塔面板安装使用教程

宝塔面板使用教程 宝塔面板是一款服务器管理软件,可以帮助用户建立网站,一键配置服务器环境,使得用户通过web界面就可以轻松的管理安装所用的服务器软件。 1 宝塔面板安装 1.1 宝塔面板的安装 宝塔面板官网地址:https://www.bt.…

线程相关学习记录(2)

锁分类 按照对共享资源是否上锁,可以分为: 乐观锁悲观锁 乐观锁的定义: 乐观锁是一种乐观思想,认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在提交修改的时候去判断一下&#xff0c…

【通过点按其他按钮修改按钮的位置 Objective-C语言】

一、继续我们上一个例子 1.下面我们要实现的功能,是通过点按4个方向键,修改最上面那个图片按钮的位置 2.首先,我们把4个方向按钮实现一下 我先拽1个按钮上去,注意,我们不是1上来就拽6个按钮, 而是先拽1个按钮上去 我设置这1个按钮,大家看一下,这个按钮上有文字吗,…

盒子模型中box-sizing: border-box;的作用

我们都知道 盒子模型 它都是由 外边距(margin) 边框(border) 内边距(padding) 内容(content)组成的。 如果我们按照下面的设置&#xff0c;得到的是一个300*300大小的红色正方形 .box {height: 300px;width: 300px;background-color: red; } <body><div class&q…

如何使用阻塞队列BlockingQueue

文章目录什么是阻塞队列阻塞队列的特点BlockingQueue不是新的东西学会使用队列阻塞队列四组APISynchronousQueue 同步队列什么是阻塞队列 阻塞队列本质上还是一种队列&#xff0c;遵循先进先出&#xff0c;后进后出的原则&#xff0c;在此基础上&#xff0c;如果出队时阻塞队列…

BM32 合并二叉树

题目 已知两颗二叉树&#xff0c;将它们合并成一颗二叉树。合并规则是&#xff1a;都存在的结点&#xff0c;就将结点值加起来&#xff0c;否则空的位置就由另一个树的结点来代替。例如&#xff1a; 两颗二叉树是: Tree 1 Tree 2 合并后的树为 数据范围&#xff1a;树上节点数…

全网惟一面向软件测试人员的Python基础教程-在Python中元组有点何用?

全网惟一面向软件测试人员的Python基础教程 起点&#xff1a;《python软件测试实战宝典》介绍 第一章 为什么软件测试人员要学习Python 第二章 学Python之前要搞懂的道理 第三章 你知道Python代码是怎样运行的吗&#xff1f; 第四章 Python数据类型中有那些故事呢&#xff1f;…

批量设置限购

增加批量设置限购功能 第一步&#xff1a;打开后端文件app\services\product\product\StoreProductServices.php 在2046行下方增加 case 10: foreach ($ids as $product_id) { $batchData[] [ id > $product_id, is_limit > $data[is_limit], limit_type > $data[l…

【Linux】gdb基本调试命令

目录 调试程序 gdb命令 list显示代码 break加断点 查看断点位置 删除断点 run启动程序 n单步执行 p打印变量的值 q退出调试 c继续执行 s进入函数&#xff08;n单步执行遇到函数不会进入&#xff09; finish跳出函数 调试程序 可以生成可执行程序运行有误则去调试…

基于springboot+jpa 实现多租户动态切换多数据源 - 基于dynamic-datasource实现多租户动态切换数据源

多租户动态多数据源系列 1、基于springbootjpa 实现多租户动态切换多数据源 - 数据隔离方案选择分库还是分表 2、基于springbootjpa 实现多租户动态切换多数据源 - 基于dynamic-datasource实现多租户动态切换数据源 3、基于springbootjpa 实现多租户动态切换多数据源 - 使用Fl…

java:jackson 四:Jackson Property Inclusion Annotations

java&#xff1a;jackson 四&#xff1a;Jackson Property Inclusion Annotations 1 前言 参考文档地址&#xff1a; https://www.baeldung.com/jacksonhttps://www.baeldung.com/jackson-annotationsSpringBoot自带的jackson版本如下&#xff1a; <parent><artif…

数据可视化,21-30岁消费增速最快,年轻人正在成长为白酒消费的主力

2022中国白酒消费报告 中国酿酒的发源距今已经有四千多年的历史&#xff0c;中国有很多酒”酒乡”贵州的茅台、四川泸州的国窖、四川宜宾的五粮液。人们常说“把酒言欢”&#xff0c;这不马上就要过春节了&#xff0c;过节送礼、家庭聚会都非常适合&#xff0c;小编使用在线数据…

VSCode插件大全

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、必备插件1.Chinese&#xff08;中文&#xff09;2.Settings Sync&#xff08;配置同步到云端&#xff09;二、效率插件1.HTML Snippets&#xff08;代码提示&…

观察者模式(observer pattern) / 发布-订阅模式(Publish-Subscribe)

一个遍历问题导致的低效率范例 #include <iostream> #include <thread> #include <vector> #include <list> #include <mutex> #include <chrono> #include <algorithm> #include <set> #include <queue>using namespa…

一个三臂非劣效性检验的包简介——“ThreeArmedTrials”

目录0引言1.模型分类2. R语言函数介绍2.1 函数总览2.2 GElesions函数&#xff08;数据集1&#xff09;2.3 opt_alloc_RET函数2.4 power_RET函数2.5 remission&#xff08;数据集2&#xff09;2.6 seizures函数&#xff08;数据集3&#xff09;2.7 T2lesions函数&#xff08;数据…

多线程基础部分

多线程基础部分1. 线程与进程的关系1.1 多线程启动1.2 线程标识1.2.1 Thread与Runnable1.3 线程状态2.线程池入门2.1 ThreadPoolExecutor2.2 创建线程池2.3 关闭线程池创建线程的几种方法参考1. 线程与进程的关系 1个进程包含1个或多个线程。 1.1 多线程启动 线程有两种启动…

骨传导耳机是怎么传声的、骨传导耳机的优点是什么

要说这两年最火的蓝牙耳机是哪款&#xff0c;大火的骨传导耳机绝对可以名列前茅&#xff0c;那可真是运动健身、需长时佩戴耳机党的神器&#xff01;如果你是搞运动的、健身的&#xff0c;或者是需要长时间佩戴耳机上网课的学生党&#xff0c;那一副靠谱的骨传导耳机绝对是必不…

LVGL学习笔记7 - GD32平台优化

目录 1. 颜色深度 2. 更新disp_init 3. 更新disp_flush 4. 改为IPA更新数据 5. 死机问题 学习过程中发现GD32平台的显示效果不佳&#xff0c;而且会出现死机的问题&#xff0c;需要优化一下平台代码。 1. 颜色深度 修改颜色深度为32bit。 #define LV_COLOR_DEPTH 32 2.…