大数据面试准备V3.0

532 阅读12分钟

「Offer 驾到,掘友接招!我正在参与2022春招系列活动-经验复盘,点击查看 活动详情

各位面试官好!

我是面试咱们公司大数据开发实习岗位的xxx,曾就读于xx学校数据科学与大数据专业,2022年毕业。

曾在xx公司实习,有过3个月的Java开发经验,在学校期间做过几个比较大的大数据项目,主要负责ETL入库和数据分析,还负责数仓的部分组件搭建。

另外在校期间接过xx个课设,长期以来极大锻炼了我写代码和与人打交道的能力。

我会经常写技术博客总结学过的大数据知识,目前写了xx篇原创技术博文,曾获奖项,目前博客粉丝2w多。

我是一个抗压能力强,自我约束能力高的年轻人,期望能够成为大家的工作伙伴。

一、简要介绍项目

教育数仓解决的问题:

首先,受互联网+概念,疫情影响,越来越多的教育平台机构涌现。但是由于信息的共享利用不充分,导致企业多年积累了大量数据,而因为信息孤岛的问题,一直没有对这些数据进一步挖掘分析,因此也不能给企业的管理决策层提供有效的数据支撑。

有鉴于此,我们做的这个教育大数据分析平台项目,将大数据技术应用于教育行业,用擅长分析的OLAP系统为企业经营提供数据支撑。

具体的实现思路是,先建立企业的数据仓库,把分散的业务数据预处理,其次根据业务需求从海量的用户行为数据挖掘分析,定制出多维的数据集合,形成数据集市,供各个场景主题使用,最后用BI工具,进行前端展示。

所以,我们的技术解决了企业的三大痛点。一是数据量太大问题,传统数据库无法满足;二是系统多,数据分散问题,无法解决数据孤岛问题;三是,统计工作量太大,分析难度高问题,无法及时为企业提供数据参考。


二、介绍熟悉的框架

我比较熟悉的框架有:Hadoop,Hive,Sqoop,Flume,Spark,实时计算也会用到,最主要的还是Hadoop和Spark。

谈谈你对Hadoop的了解

Hadoop是整个大数据的基石

从结构来看,Hadoop分为HDFS,MapReduce,Yarn三大部分,其中HDFS负责数据的存储,MapReduce负责数据计算,Yarn是负责资源调度。

从整个大数据体系来看,Hadoop负责大数据的存储(主要用到HDFS),再搭配Spark或者Flink做数据处理,一般Spark+Hadoop做离线项目 Flink+Hadoop做实时项目

从版本更新来看,Hadoop3较Hadoop2优化了Shell的很多bug,新增了纠删码 将原来的3倍的空间压缩为1.5倍存储提供更大的空间

(延展:HDFS细说一下, Yarn有哪三种调度,hdfs读写流程)

Hive用过吗?有什么优劣势??

Hive是建立在Hadoop基础上的离线存储海量数据的数据库

它与传统数据库不同

从存储量来看,Hive存储的数据是更大

从计算速度来看,Hive的处理速度较Mysql慢,但是当数据达到一定时,Hive的并行计算就体现出其优势

从存储位置来看,Hive存储在HDFS Mysql存储在本地磁盘

从使用场景来看,Hive用于OLAP系统即分析系统,Mysql用于OLTP系统 更多跟业务有关


数据仓库的概念

数据仓库分层分为 ODS DWD DWM DWS 和APP层。

我做过基于Hive的离线教育数仓项目,主要分为三层,

其中ODS是源数据层 DW是数据仓库层 ADS是前端应用直接读取的数据源; 维度表放在Dimen层 。 DW层还可继续划分为DWD明细层,DWM中间层,DWS业务层。 Dimen层还可划分为高基维度表和低基维度表

数据仓库主要解决了企业做数据分析难 存在数据孤岛和数据体量太大的问题,通过建立一个统一的系统仓库来解决集中存储和海量数据的计算,同时支持SQL化。

~~(延展:星型和雪花 事实表和维度表 指标和维度 ~~

三、介绍项目采用的架构

用到的技术架构包括:mysql,sqoop,基于CM的Hive,Oozie和FineBi。 由于OLTP系统中数据大多存储在mysql,所以我们最终选择Sqoop作为导入导出工具,抽取数据到数仓,并使用基于CM管理的Hive进行数据清洗+分析,然后sqoop导出到mysql,最后用FineBI展示OLAP的数据分析结果。


二,Python爬虫,爬取数据,Flume实时监控导入到HDFS,存储在Hive,通过SparkSQL计算相应的指标,处理完的数据通过sqoop导出到mysql,最后通过echarts可视化展示。


四、详细介绍数仓搭建

数据仓库分层分为四层分别为 ODS DWD DWM DWS 和APP层。

ods 源数据层(ODS) 此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。 dwd 数据仓库层(DW) DW 层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。 此层可以细分为三层: 明细层DWD(Data Warehouse Detail):存储明细数据,此数据是最细粒度的事实数据。该层一般保持和ODS层一样的数据粒度,并且提供一定的数据质量保证。同时,为了提高数据明细层的易用性,该层会采用一些维度退化手法,将维度退化至事实表中,减少事实表和维表的关联。 dwm 中间层DWM(Data WareHouse Middle):存储中间数据,为数据统计需要创建的中间表数据,此数据一般是对多个维度的聚合数据,此层数据通常来源于DWD层的数据。 dws 业务层DWS(Data WareHouse Service):存储宽表数据,此层数据是针对某个业务领域的聚合数据,应用层的数据通常来源与此层,为什么叫宽表,主要是为了应用层的需要在这一层将业务相关的所有数据统一汇集起来进行存储,方便业务层获取。此层数据通常来源与DWD和DWM层的数据。 ads(app) 前端应用直接读取的数据源;根据报表、专题分析的需求而计算生成的数据。

数仓分层:

首先在ODS层原始数据包括有customer_relationship(报名信息),itcast_clazz(报名后的校区和学科信息),employee(内部员工信息),scrm_department(部门信息)。

其次是在DWD层对数据进行清洗,抽取,转换,所以我们在DWD层清洗保留客户表中不为空的,且是已支付的数据,并且转换获得线上线下及年月日等字段。

再次是DWM层,在DWD层基础上,关联校区,学科和咨询中心表,来获取想要的字段。

最后DWS层按产品的属性维度进行统计,得到统计宽表,产品属性维度包括:校区,学科组合分组,来源渠道,咨询中心。

五、数仓业务详解

我们数据仓库是基于维度建模,主要使用星型模型。

维度表:一般是对事实的描述信息。每一张维表对应现实世界中的一个对象或者概念。例如:用户、日期、地区等。

维表的特征:

维表的范围很宽(具有多个属性、列比较多)

跟事实表相比,行数相对较小:通常< 10 万条

说说你做项目遇到的困难?

Sqoop 是在 Hadoop 生态体系和 RDBMS 体系之间传送数据的一种工具。它的工作机制是将导入或导出命令翻译成 mapreduce 程序来实现。在翻译出的 mapreduce 中主要是对 inputformat 和 outputformat 进行定制。

我们在使用 Sqoop 导入导出时出现了 Null 的存储一致性问题,Hive 中的 Null 在底层是以“\N”来存储,而 MySQL 中的 Null 在底层就是 Null。为了保证数据两端的一致性,在导出数据时采用–input-null-string 和–input-null-non-string 两个参数。导入数据时采用–null-string 和–null-non-string。


什么是事实表,什么是维度表,有什么区别和联系? 什么是指标,什么是维度,有什么区别和联系? 数据仓库的主要特性是?

六、离线指标

需求一: 统计期内,访客咨询产生的有效线索的占比。有效线索量 / 咨询量,有效线索指的是拿到电话且电话有效。 指标:有效线索量 维度: 时间维度 : 年、月、天 线上线下

需求二: 统计期内,1-24h之间,每个时间段的有效线索转化率。横轴:1-24h,间隔为1h,纵轴:每个时间段的有效线索转化率。 指标:有效线索量 维度: 时间维度: 小时 线上线下

需求三: 统计期内,新增的咨询客户中,有效线索的数量。

指标: 有效线索量
维度:
    时间维度 : 年、月、天
    线上线下
    新老维度

基于以上三个需求总结如下: 指标: 有效线索量

维度: 固有维度
    时间维度: 年 月 天 小时
    线上线下维度
    新老维度

通过提供的查询SQL: 可以确定涉及的表 及其相关的字段 涉及表: customer_clue 线索表 customer_relationship 意向表 customer_appeal 投诉表 涉及字段: customer_clue线索表: clue_state: 用于判断是否为新老客户 'VALID_NEW_CLUES' 1 --新客户新线索 'VALID_PUBLIC_NEW_CLUE' 2 --老客户新线索 其余为无效 0 customer_relationship_id : 可基于投诉表 从中找到无效线索 用于过滤线索表中字段数据 deleted : 用于去除以标记为删除的数据 create_date_time: 时间字段

    customer_relationship意向表:
                origin_type : 用于判断线上线下
                    NETSERVICE | PRESIGNUP 为线上1  其余为线下0
    customer_appeal投诉表: 
                appeal_status : 1 标识无效  其余都表示有效
                customer_relationship_first_id  必须保证此值不为 0 时 才认为是有客户
                WHERE appeal_status = 1 AND customer_relationship_first_id != 0   得到的是无效线索的
                筛选无效数据条件:
                        ca.appeal_status = 1  AND ca.customer_relationship_first_id != 0
关联条件: 
    线索表.customer_relationship_id = 意向表.id
    投诉表.customer_relationship_first_id = 意向表.id
    

指标: 有效线索量

维度: 固有维度
    时间维度: 年 月 天 小时
    线上线下维度
    新老维度        

七、实时指标

每日日活实时统计

每日订单量实时统计

一小时内日活实时统计

一小时内订单数实时统计

一小时内交易额实时统计

一小时内广告点击实时统计

一小时内区域订单数统计

一小时内区域订单额统计

一小时内各品类销售 top3 商品统计

用户购买明细灵活分析(根据区域,性别,品类等)


八、写出分析最难的两个指标


九、面试官问

自己说完项目之后面试官就开始发问了,注意接招:

  1. 如何保证你写的 sql 正确性? 我一般是造一些特定的测试数据进行测试。
  2. 另外离线数据和实时数据分析的结果比较。
  3. 测试数据哪来的? 一部分自己写 Java 程序自己造,一部分从生产环境上取一部分。
  4. 测试环境什么样? 测试环境的配置是生产的一半
  5. 测试之后如何上线? 上线的时候,将脚本打包,提交 git。先发邮件抄送经理和总监,运维。通过之后跟运维一 起上线。
  6. 你做的项目工作流程是什么? 先与产品讨论,看报表的各个数据从哪些埋点中取

将业务逻辑过程设计好,与产品确定后开始开发

开发出报表 SQL 脚本,并且跑几天的历史数据,观察结果

将报表放入调度任务中,第二天给产品看结果。

周期性将表结果导出或是导入后台数据库,生成可视化报表

  1. Hadoop 宕机?

十、最后的面试小技巧

最后给大家说一点面试小技巧: 一般来说,面试你的人都不是一个很好对付的人。别看他彬彬有礼,看上去笑眯眯的,很和气的样子。但没准儿一肚子坏水。 有些人待人特别客气,说话还稍稍有点结巴的,更容易让人上当。 所以,牢记一点,面试的时候保持高度警觉,对方不经意问出来的问题,很可能是他最想知道的。 首先说话语速不要太快,有些人介绍自己时滔滔不绝,说话特快。其实这里面有个信息传递的问题,跟别人谈事情,语速太快,往往容易说错,对方接受起来也有问题。所以中等语速就可以了。 问到期望薪金的时候,最好的回答是不回答,留到下一次面试再谈。或者可以反问,公司对于这个岗位定的薪金标准是多少。 不要紧张,表现得自然些,要有礼貌,别忘记和主考人招呼,说句"早上好"等。 举止要大方,不可闪缩,要保持自信。待主考人邀请你才可礼貌地坐下,不要太随便或左顾右盼;切忌装出懒洋洋和满不在乎的样子。 微笑可以减轻你内心的不安,更可以令面试的气氛变得融洽愉快。 让主考人知道你珍惜这次面试的机会。当主考人说话时,要眼望对方,并留心倾听。 让主考人先打开话匣子。答问题要直接了当,无须太繁复,也不要单说"是"或"不是";否则,主考人会觉得你欠缺诚意。深入的谈话内容有助主考人对你作出确切的评估。 假如有不太明白主考人的问题,应该礼貌地请他重复。不懂得回答的问题,不妨坦白承认。含糊其辞或乱吹牛会导致面试的失败。 不要打断主考人的说话,被要求就相同的问题重复作答也不能表示不耐烦,更切忌与主考人争辩。 主考人可能问你一些与面试或者申请的职位完全无关的问题,例如时人时事,目的在进一步了解你的思想及见识。 紧记在适当时机带出自已的优点和特长。但切勿显得过份自信或浮夸。 准备一些与该机构和申请的工作有关的问题在面试结束之前提出。这样能表现伙的积极,亦可给主考人留下良好印象。 最后,问清楚多久才知道面试结果。不要忘记向主考人道谢及说声"再见"才离去。