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,这种内存申请的缺点是必须自己编写内存申请和释放的逻辑。