大数据面试题 -- 01

1、讲一下数仓吧。

数仓是一个面向主题的,集成的,相对稳定的,反映历史变化的一个数据仓库,主要用于支持管理决策。
面向主题:数仓中的数据是按照主题进行存储的,每一个主题都是决策层分析的一个角度。
集成的:不管什么来源的数据都会统一放到数仓中。并且格式,单位,名称等要统一。
相对稳定:数据一旦进入数仓中一般不会轻易改变。就算改变也不改变原数据,只是会根据需求重新考虑数据的更新策略。
反映历史变化的:时间维度是数仓中很重要的一个维度,数仓中的数据时间跨度会很大,可能有几年到十几年,能反映历史变化。

2、数仓分层。

根据业务需求,主题可以分为多层,不是固定的,大概分为4层:
ods(operate data stor):原始数据层,一般保持着最原始的数据,不会做任何的操作。
dwd(data warehouse detail):数据来源于ods层,主要是将ods层的数据关联起来形成一张宽表。
dws(data warehouse stor):根据主题维度指标来进行聚合查询操作,微聚合。
dm(data market)层:数据集市层,根据主题来对来自dws层的数据继续更细力度的汇总查询,导入到关系型数据库中为业务系统使用,也可以导入到hbase中。

分层的作用:复杂问题简单化,数据架构清晰,血缘追踪,减少重复计算。

3、数仓采用的模型是什么?

数仓的模型有三种:

星型:数仓(具体说就是dwd层),中只有一张包含历史数据且数据不冗余的事实表和一组附属维度表,每个维度一张,事实表与维度表之间通过外键和主键关联。(就是一张事实表为中心,多张维度表和事实表联合)会出现数据冗余,但是性能高,公司普遍使用星型模型。

雪花型:维度表通过另一张维度表连接到事实表,数据不冗余。但是多表join影响性能。

星系模型:多个事实表采用星型模型共享维度表,就形成了一个星系。

4、数仓和数库的区别

操作上:数据库面向事务的,行操作,是实时响应的,数仓则是面向分析的,范围操作,是进行分析计算的,一般都是非实时的。

功能上:数据库提供实时的增删改查,数仓则是为分析数据提供决策支持

数据上:数据库只保存最新的数据,数仓则保存所有的数据

数据量:数据库一般为GB,数仓为TB

响应速度:数据局为毫秒级别,数仓往往为小时级别

存储:数据库是真实的物理存储,数仓则是逻辑存储

5、哪些是采用雪花的?

一些宽表会采用雪花,用户行为表要跟各种表结合会形成宽表,订单表要结合用户表订单表商品表,有些又结合了地域信息,就变成星座表了。

6、用户画像负责哪一块?

打标签比较多。

7、跟用户画像那边对接是吧?

对,有算法工程师,可以对接各种算法系数。

8、自己负责过数仓模型建立的过程吗?

有参与,但不全是负责的。

9、做hive的时候用过动态分区吗?

为什么要分区?

为了避免hive在查询时扫描全表,引入分区的概念,在查询时扫描某一个分区即可。

如何分区:在建表时,使用partitioned by (colname type[,…]) 命令进行分区,分区的字段属于表外字段,在hdfs的文件中是不存在的,但是在查询时可以向表内字段一样使用

分区的类型:

1、静态分区

使用load方式进行加载数据

2、动态分区

不使用load方式加载数据(使用insert into动态加载)

步骤:

1)创建分区表(建表时不区分动态分区还是静态分区)

2)创建临时表(为分区表动态导入数据,必须使用一个临时表)

3)设置动态分区模式为非严格模式(严格模式下必须最少指定一个静态分区字段)

4)使用insert into 导入数据 (insert into dy_part3 partition(dt) select * from tmp_part1)

注意: 从临时表动态导入数据到分区表时,赋值给分区字段的临时表中的字段必须在最后一列,如果是多级分区,则必须依次为最后几列

3、混合分区

10、SPARK内存管理机制?堆内内存和堆外内存

堆内内存(On-heap Memory)
堆内内存的大小,由Spark应用程序启动时的–executor-memory或spark.executor.memory参数配置。Executor内运行的并发任务共享JVM堆内内存,这些任务在缓存RDD和广播(Broadcast)数据时占用的内存被规划为存储(Storage)内存,而这些任务在执行Shuffle时占用的内存被规划为执行(Execution)内存,剩余的部分不做特殊规划,那些Spark内部的对象实例,或者用户定义的Spark应用程序中的对象实例,均占用剩余的空间。

堆外内存(Off-heap Memory)
为了进一步优化内存的使用以及提高Shuffle时排序的效率,Spark引入了堆外(Off-heap)内存,使之可以直接在工作节点的系统内存中开辟空间,存储经过序列化的二进制数据。除了没有other空间,堆外内存与堆内内存的划分方式相同,所有运行中的并发任务共享存储内存和执行内存。

Spark 1.6 开始引入了Off-heap memory(详见SPARK-11389)。这种模式不在 JVM 内申请内存,而是调用 Java 的 unsafe 相关 API 进行诸如 C 语言里面的 malloc() 直接向操作系统申请内存。由于这种方式不经过 JVM 内存管理,所以可以避免频繁的 GC,这种内存申请的缺点是必须自己编写内存申请和释放的逻辑。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值