大数据第二阶段测试(二)

1.接到需求之后的开发流程是什么?

参考答案一
接到需求后的开发流程一般包括需求分析、设计、编码、测试和部署等步骤。首先,对需求进行全面的分析,明确需求的背景、目标和功能。然后,根据需求进行系统设计,包括数据库设计、架构设计和接口设计等。接下来,根据设计进行编码,编写高质量的代码。完成编码后,进行测试,包括单元测试、集成测试和系统测试等。最后,根据测试结果进行修复和优化,并进行部署上线。
参考答案二
- 需求讨论:与产品、业务 Confirm 需求,确定项目范围、功能点、关键指标等
- 技术方案设计:根据需求确定 overall architecture,设计采集、建模、计算流程
- 开发实现:按设计方案进行 Flume 采集管道、Hive 建模、Spark 计算流程的开发
- 测试验证:进行本地环境验证,以样本数据验证 ETL 流程正确性
- 上线部署:将开发环境下的任务生产环境部署上线,进行全量数据验证
- 交付文档:编写技术设计文档、数据字典、操作维护文档等交付给业务方
参考答案三

2.拦截器的编写思路是什么?

参考答案一
拦截器的编写思路一般是通过实现特定的接口或继承特定的类来实现。拦截器可以拦截请求和响应,对其进行处理或修改。编写拦截器时,首先需要确定拦截的目标,比如拦截请求还是响应,或者拦截特定的URL路径。然后,根据目标确定拦截器的触发时机,比如在请求之前、之后或异常时触发。最后,根据需求编写拦截器的具体逻辑,可以对请求参数进行校验、权限验证、日志记录等操作。
参考答案二
- 继承抽象拦截器类,实现初始化、关闭方法
- 实现 interpolate 方法,在这里实现对事件体的处理逻辑
- 在 Flume 配置文件中配置拦截器,指定类型及参数
- 测试验证拦截器逻辑与预期是否一致
参考答案三
- 拦截器需要实现org.apache.flume.interceptor.Interceptor接口。
- 重写方法
- 将自定义的拦截器打jar包放入flume的lib文件
- 修改配置文件,添加拦截器
拦截器可以修改或删除事件基于开发者在选择器中选择的任何条件。
拦截器采用了责任链模式,多个拦截器可以按指定顺序拦截
一个拦截器返回的事件列表被传递给链中的下一个拦截器
如果一个拦截器需要删除事件,它只需要在返回的事件集中不包含要删除的事件即可

3.从0到1怎么搭建数仓?

参考答案一
搭建数仓的基本步骤包括需求分析、数据抽取、数据清洗、数据转换、数据加载和数据展示等。首先,进行需求分析,明确数仓的目标和功能。然后,根据需求设计数据抽取策略,从各个数据源中抽取数据。接下来,进行数据清洗,对抽取的数据进行去重、过滤、格式化等处理。然后,进行数据转换,将清洗后的数据进行加工、计算和整合,生成目标数据。最后,将转换后的数据加载到数仓中,并通过数据展示工具进行数据可视化和报表展示。
参考答案二
- 选定数仓技术方案:确定使用Hive+Spark等技术方案
- 定义数据集市层模型:确定数仓的逻辑模型,维度表、事实表结构
- 搭建数据采集:使用Flume等采集数据到HDFS
- 搭建Hive框架:创建事实、维度表结构
- 编写ETL程序:利用Spark、Shell等加载、转换数据到Hive表
- 开发分析模型:使用Spark SQL、Presto等进行分析、建模
- 前端报表连接:使用Superset等可视化工具连接数仓
参考答案三
可以分为6个步骤:业务探查、技术选型、规范制定、主题域划分、数仓分层、模型建设

  • 业务探查
    梳理公司业务系统,业务关心的指标,开发过的需求。
  • 技术选型
    根据已有的数据,选择技术平台,及开发语言
  • 规范制定
    分层设计规范、表命名规范、字段命名规范、层次调度规范、脚本开发规范
  • 主题域划分
    可以按照业务系统、或者部门划分。如果按照业务系统划分,两个业务系统的数据一样、可以合并为一个主题。上次您跟我交流时的业务跨主题域的问题,如果主题划分好了,是不会存在这种情况的,如果跨主体域了,就划分在某一个主题域就行。
  • 数仓分层
    包括dwd,dim,dws的模型建设
  • 模型建设

4.采集方案如何设计,并阐述其原因?

参考答案一
采集方案的设计需要考虑数据源的类型、数据量、数据质量和实时性等因素。首先,确定要采集的数据源,可以是数据库、日志文件、API接口等。然后,根据数据源的特点和需求确定采集方式,比如定时采集、实时采集或增量采集。接下来,设计数据采集的流程和逻辑,包括数据抽取、数据清洗、数据转换和数据加载等步骤。最后,根据采集方案的设计进行开发和测试,并根据实际情况进行调整和优化。
参考答案二
- 数据源:确定需要采集的日志或数据库源
- 数据格式:源数据的存储格式如Json、Csv等
- 采集周期:需要全量还是增量,采集频率
- 数据过滤:根据业务需求进行过滤
- 幂等性:避免重复采集数据
- 容错性:采集过程中出现问题的恢复机制
参考答案三
技术选择:Flume,Kafka,sqoop,Logstash,DataX

5.阐述在离线行为数据采集过程中碰到零点漂移问题,怎么发现怎么解决的?

参考答案一
在离线行为数据采集过程中,零点漂移问题指的是数据采集的起始时间点或间隔时间发生了变化,导致数据的时间窗口不准确。为了发现零点漂移问题,可以通过监控数据的采集时间和数据的时间戳进行对比。如果发现采集时间和时间戳的差异较大,可能存在零点漂移问题。解决零点漂移问题可以通过定期校准采集时间或使用更准确的时间源进行数据采集。
参考答案二
- 发现问题:统计采集数据的时间范围,例如出现1-3点的数据丢失
- 解决方法:
1)回填数据:重新采集丢失的时间范围数据
2)时间校正:使用时间戳插件修改时间
3)调整业务逻辑:比如注册时间取登录时间的第一天
参考答案三

第一天晚上11:59:59产生的数据可能会在第二天的0点左右收到,如果不处理就会当成第二天产生的数据,影响准确性,所以需要处理

如果日志数据用到flume;一般在flume中的source下又加了一个拦截器进行处理,统一只使用日志数据的产生时间作为时间戳。

6.详细描述对于Json数据的入仓方案有哪些,怎么落地?

参考答案一
对于Json数据的入仓方案可以有多种选择,比如使用ETL工具、编写自定义的脚本或使用数据集成平台等。其中,ETL工具可以提供图形化的界面,方便配置和管理数据的抽取、清洗和加载等步骤。自定义脚本可以根据需求编写特定的数据处理逻辑,实现数据的解析、转换和加载。数据集成平台可以提供统一的接口和标准化的数据处理流程,简化数据入仓的开发和管理。
参考答案二
- 直接Load: 使用JsonSerDe解析Json,加载到Hive表
- 预处理:使用Spark解析Json,处理为表格式后加载到Hive
- 使用Hive JSON函数:使用get_json_object等函数解析
参考答案三

  • spark程序通过json工具解析并通过sparkSQL写入目标表
  • HvieSQL提供GetJsonObject()方法
  • JsonSerDe

7.谈谈你对ETL方案的理解,落地方案有哪些?

参考答案一
ETL方案是指将数据从源系统抽取、清洗和转换后加载到目标系统的一种数据集成方案。落地方案可以有多种选择,比如使用ETL工具、编写自定义的脚本或使用数据管道等。ETL工具可以提供图形化的界面,方便配置和管理数据的抽取、清洗和加载等步骤。自定义脚本可以根据需求编写特定的数据处理逻辑,实现数据的解析、转换和加载。数据管道可以提供可扩展和可靠的数据传输和处理能力,支持多种数据源和目标系统的集成。
参考答案二
- ETL是Extract-Transform-Load的简称,用于数据仓库的构建维护
- Extract:从数据源抽取数据
- Transform:对数据进行转换、清洗等处理
- Load:将数据加载到数据仓库
落地使用Spark、Hive等进行数据转换,最后加载到Hive数据仓库。
参考答案三
ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程,目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析依据。

通常的做法是从业务系统到ODS做清洗,将脏数据和不完整数据过滤掉,在从ODS到DW的过程中转换,进行一些业务规则的计算和聚合。

ETL工具有Flume,Kafka,sqoop,Logstash,DataX

8.介绍一下离线项目中的数仓分层体系,描述每层数据及其作用?

参考答案一
离线项目中的数仓分层体系一般包括原始数据层、清洗数据层、加工数据层和应用数据层。原始数据层用于存储从各个数据源抽取的数据,保留原始的数据结构和格式。清洗数据层对原始数据进行去重、过滤、格式化等处理,提高数据质量。加工数据层对清洗后的数据进行加工、计算和整合,生成目标数据。应用数据层提供面向用户的数据服务和报表展示,满足业务需求。
参考答案二
- ODS层:操作数据存储层,原始数据
- DWD层:数据仓库层,清洗后数据
- DWS层:数据集市层,汇总加工数据
- ADS层:应用数据存储层,分析和报表的数据
参考答案三
1、贴源层(ODS): ODS层主要存储原始数据(一般都是来源于各个app的日志或者线下门店的表格,txt文本等)
2、明细层(DWD):基于原始数据层,将数据进行简单的清洗、脱敏后处理后建立明细表(明细表中一般也会有etl时间的字段,业务不同,字段也不相同)
3、维度表(DIM):基于原始数据层提取公共指标进行维度建模(实际上和明细层没有依赖关系,主要是根据业务需求来定,常见的有时间,地区编码对应表,所属机构编码对应表,业务类型编码对应表等等,后面想起来再补充)
4、轻度聚合层(DWS):是基于明细层数据,对明细层的数据进行轻度聚合得出(所谓轻度聚合,个人理解是提取业务核心字段,根据业务需求对数据进行进一步的加工)
5、主题层(DWT):根据主题提炼出相关指标,从DWS中提取和维度表关联得出(这个时候业务就要开始详细划分了,一般都是许多小需求围绕一个核心需求作为主题—个人理解)
6、数据中间层(DWM):对于一些跨部门协同,会产生一些公共字段,用DWM进行临时存储从而避免重复计算(类似于咱们这边的模型层)
7、结果展示层(ADS):基于需求,从主题中提取相关字段得出,用于结果展示(咱们这边是把报送的数据导入到Oracle中进行展示,只报送增量数据)
分层优点
每一个数据分层都有它的作用域,这样我们在使用表的时候能更方便地定位和理解。

  • 方便数据血缘追踪:
    简单来说,我们最终给业务呈现的是一个能直接使用业务表,但是它的来源有很多,如果有一张来源表出问题了,我们希望能够快速准确地定位到问题,并清楚它的危害范围。
  • 减少重复开发:
    规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算。
  • 把复杂问题简单化:
    将一个复杂的任务分解成多个步骤来完成,每一层只处理单一的步骤,比较简单和容易理解。而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。
  • 屏蔽原始数据的异常:
    屏蔽业务的影响,不必改一次业务就需要重新接入数据

9.Hive on Spark 数据倾斜的处理方案?

参考答案一
-数据倾斜的原因一般是数据分布不均匀,可以通过调整数据分桶或分区的策略,使数据均匀分布。
-可以对倾斜的数据进行采样,然后将采样数据进行拆分或重组,使数据均匀分布。
-可以使用Spark的优化功能,比如动态分区、广播变量和缓存等,提高任务执行的效率和性能。
参考答案二
- 优化数据分区,将热点数据分到不同分区
- 调整并发,热点数据分区调低并发
- 使用抽样、过滤等方式预处理热点数据
- 使用聚合、join等
参考答案三

  1. 在hive etl时进行数据聚合,把key相同的数据聚合成一条数据,这样就可能不用shuffle了,从而解决数据倾斜。当没办法对key进行聚合时也可以选择其它粒度聚合,比如数据中包含了几个城市,几个职业,可以选择合适的粒度聚合。

  2. 过滤导致倾斜的key如果业务允许某几个key的数据可以丢弃,那么对于有两个key对应10万条数据,而其它key都是几十条,那么就可以过滤那两个key。

  3. 提高ruduce并行度从而使key更分散,从而有可能解决数据倾斜

  4. 双重聚合法(针对非join,如groupByKey,reduceByKey)

    1. 在每个key前加上一个随机数和一个分隔符比如:“2”,那么key对应的数量就比较均匀了,然后做第一次reduce。
    2. 把第一次聚合得到的RDD的前缀(x)去掉,再进行一次聚合即可
  5. reduce join转map join
    ​ 其中一个RDD必须是比较小的,broadcast出去那个小RDD的数据以后,就会在每个executor的block manager中都驻留一份。

    ​ 要确保你的内存足够存放那个小RDD中的数据这种方式下,根本不会发生shuffle操作,肯定也不会发生数据倾斜;从根本上杜绝了join操作可能导致的数据倾斜的问题;

    ​ 对于join中有数据倾斜的情况,大家尽量第一时间先考虑这种方式,效果非常好;如果某个RDD比较小的情况下。

    ​ 对于join这种操作,不光是考虑数据倾斜的问题;即使是没有数据倾斜问题,也完全可以优先考虑,用我们讲的这种高级的reduce join转map join的技术,不要用普通的join,去通过shuffle,进行数据的join;完全可以通过简单的map,使用map join的方式,牺牲一点内存资源;在可行的情况下,优先这么使用。

  6. 可以先从要join的一个RDD中抽取10%的数据并从中得到数量最多的那个key,然后从两个RDD中过滤出这个key的数据,得当两个RDD,rdd1和rdd2,然后对两个RDD中的key加随机前缀,如果rdd2的数据只有一个,那么就用for多生成几个,然后俩个RDD做join,然后对那些非特殊的RDD进行join,然后union两个结果。

10.Spark 跟 MR的区别?

参考答案一
-Spark采用内存计算,而MR采用磁盘计算,因此Spark的计算速度更快。
-Spark支持更多的数据处理操作,比如实时流处理、机器学习和图计算等,而MR主要用于批处理。
-Spark的编程模型更简洁和灵活,支持多种编程语言,比如Scala、Java和Python,而MR主要使用Java编程。
-Spark提供了更多的优化功能,比如内存管理、数据分区和并行度控制等,可以提高任务执行的效率和性能。
参考答案二
- Spark基于内存,MR基于磁盘,Spark计算速度更快
- Spark可以互动查询,MR是批处理
- Spark用DAG执行引擎,MR用MapReduce
- Spark流批一体,MR只能批处理
- Spark基于内存,故难以处理超大数据,MR可以通过流式处理大数据
参考答案三

  • Spark基于内存,MR基于磁盘,因此Spark速度更快
  • spark容错性高,它通过弹性分布式数据集RDD来实现高效容错;mapreduce的话容错可能只能重新计算了,成本较高
  • MR要基于Yarn来进行资源调度。Spark支持多种运行模式,包括Local,Standalone,Yarn,Mesos;
  • Spark更加通用,框架和生态也更加复杂。

11.Hive中常用的开窗函数,并阐述其功能?

参考答案一
Hive中常用的开窗函数包括ROW_NUMBER、RANK、DENSE_RANK、LAG和LEAD等。这些函数用于在查询结果中对数据进行分组、排序和统计等操作。比如,ROW_NUMBER函数可以给每个分组的行分配一个唯一的序号,RANK函数可以根据某个字段的值对分组的行进行排序,LAG函数可以用于获取前一行的值,LEAD函数可以用于获取后一行的值。这些函数可以方便地进行数据分析和统计。
参考答案二
- rank() 排序排序字段,相同数值并列,后续序号有空隙
- dense_rank() 排序排序字段,相同数值并列,后续序号无空隙
- row_number() 无序排序,按行号排列
- ntile() 把有序窗口的数据分为指定的组
参考答案三
窗口函数一般分为三类:聚合型窗口函数和分析型窗口函数以及取值型窗口函数。

  • 聚合型
    • sum 求和
    • avg 求平均
    • max 最大值
    • min 最小值
  • 分析型
    • RANK() :间断,相同值同序号,例如 1、2、2、2、5。
    • DENSE_RANK() :不间断,相同值同序号,例如 1、2、2、2、3。
    • ROW_NUMBER() :不间断,序号不重复,例如 1、2、3、4、5(2、3 可能是相同的值)。
  • 取值型
    • LAG(COL, N, DEFAULT_VAL) :往前第 N 行数据,没有数据的话用 DEFAULT_VAL 代替。
    • LEAD(COL, N, DEFAULT_VAL) :往后第 N 行数据,没有数据的话用 DEFAULT_VAL 代替。
    • FIRST_VALUE(EXPR) :分组内第一个值,但是不是真正意义上的第一个,而是截至到当前行的第一个。
    • LAST_VALUE(EXPR) :分组内最后一个值,但是不是真正意义上的最后一个,而是截至到当前行的最后一个。

12.维度建模用的哪些模型,你们具体是怎么使用的?

参考答案一
维度建模常用的模型包括星型模型和雪花模型。在星型模型中,一个事实表和多个维度表围绕着中心事实表形成星型的结构,维度表和事实表之间通过外键进行关联。在雪花模型中,维度表的结构更加复杂,可以通过多级的关联形成雪花的结构。具体使用时,根据业务需求和数据特点选择合适的模型,并进行维度建模的设计和实现。
参考答案二
- 星型模型:事实表与维度表做连表查询
- 雪花模型:多层维度表连接查询加速
- 桥表:用于维度表的扩展,避免维度表数据爆炸
参考答案三

  • 星型模型:以事实表为中心,所有的维度表直接连在事实表上;简单存在冗余;
  • 雪花模型:雪花模式的维度表可以拥有其他的维度表;去除了数据冗余,更贴近业务,尽可能降低数据存储量以及联合较小的维表来改善查询性能
  • 星座模型:基于多张事实表,而且共享维度信息,即事实表之间可以共享某些维度表

13.阐述连续活跃区间表的作用及其使用场景,并阐述利用这张表的意义是什么?

参考答案一
连续活跃区间表是用于记录用户连续活跃时间段的一张表,可以通过记录用户每次活跃的开始时间和结束时间来计算用户的连续活跃时间段。连续活跃区间表的作用是用于分析用户的活跃情况和用户行为的变化趋势。通过对连续活跃区间表的统计和分析,可以了解用户的活跃度和留存情况,并进行相应的业务决策和推荐策略的调整。
参考答案二
- 标识用户连续活跃的时间区间,可以用于用户流失、回流分析
- 一个区间范围代表一次用户活跃周期,区分新老用户按周期分层分析
参考答案三

14.新用户留存表应该如何设计,为什么?

参考答案一
新用户留存表设计时可以记录用户的注册时间、首次登录时间和最后登录时间等信息,以及用户在注册后的一段时间内的活跃情况。可以通过设计合适的字段和指标来跟踪新用户的留存情况,比如日留存率、周留存率和月留存率等。设计新用户留存表的目的是了解新用户的留存情况,判断用户的粘性和产品的吸引力,从而进行用户增长和产品改进的决策。
参考答案二
- 以注册日期作为维度,统计每个日期注册用户数作为指标
- 每日活跃数作为指标,连接留存日进行 grouping 分析留存率
- 设定时间窗口比如7日留存,滑动窗口分析不同留存区间的留存率
参考答案三

15.漏斗模型如何计算,可以通过伪代码进行描述?

参考答案一
漏斗模型用于计算用户在不同阶段的转化率。可以用伪代码描述漏斗模型的计算过程如下:

定义变量ABCD分别表示不同阶段的用户数量
A = 原始用户数量
B = 进入第二阶段的用户数量
C = 进入第三阶段的用户数量
D = 完成最终阶段的用户数量
转化率1 = B / A
转化率2 = C / B
转化率3 = D / C

根据漏斗模型的计算结果,可以评估用户在不同阶段的转化情况,找出转化率较低的环节,并进行优化和改进。
参考答案二
1. 按时间顺序排列用户访问页面
2. 计算相邻页面流失用户数A,页面访问用户数B
3. 流失率=A/B
4. 按流失率高低生成漏斗路径
参考答案三
漏斗模型是用来分析业务转化率的,计算方法:
具体:业务路径为 浏览->添加购物车->提交订单->支付
比如提交订单的转换率 = 提交订单人数/(添加购物车人数+提交订单人数) 本阶段/上阶段

16.什么是事件归因分析,阐述其作用和计算方法?

参考答案一
事件归因分析是一种分析用户行为和转化路径的方法,通过追踪用户的行为事件,了解不同事件对用户转化的贡献度和影响力。事件归因分析的作用是帮助理解用户行为和决策过程,了解用户的兴趣和需求,从而进行个性化推荐和精准营销。事件归因分析的计算方法可以通过统计用户在不同事件上的行为和转化情况,并计算事件对转化的贡献度和影响力。可以通过多种算法和模型来实现事件归因分析,比如基于规则的归因模型、基于时间窗口的归因模型和基于机器学习的归因模型等。
参考答案二

  • 分析导致目标事件的驱动因素,通常应用于将注册归因于广告推广
  • 使用窗口函数统计注册前一段时间的广告曝光或点击数据
  • 进行多因素归因,建立回归模型计算各因素对注册的贡献度
    参考答案三
    归因分析从字面上看,就是推测这个行为到底是哪些原因导致的。用来解决不同渠道、不同触点贡献度的问题
  • 首次触点归因:待归因事件中,最早发生的事,被认为是导致业务结果的唯一因素
  • 末次触点归因:待归因事件中,最近发生的事,被认为是导致业务结果的唯一因素
  • 线性归因:待归因事件中,每一个事件都被认为对业务结果产生了影响,影响力平均分摊
  • 位置归因:定义一个规则,比如最早、最晚事件占40%影响力,中间事件平摊影响力
  • 时间衰减归因:越晚发生的待归因事件,对业务结果的影响力越大

你可能感兴趣的:(大数据)