首页技术文章正文

大数据面试题之数仓问题

更新时间:2018-11-29 来源:黑马程序员技术社区 浏览量:

ods dw dm  的区别

ODS应用场景 

A. 在业务系统和数据仓库之间形成一个隔离层,ODS直接存放从各个业务系统抽取过来的数据,这些数据从结构和数据逻辑关系上和业务系统保持一致,降低了数据抽取的复杂性。它的存在可以避免数据仓库直接调用业务系统的数据。 
B. 转移一部分业务系统细节查询的功能。因ODS存放的数据与业务系统相同,原来由业务系统
产生的报表,现在可以从ODS中产生了。 
C. 完成数据仓库中不能完成的一些功能。ODS存放的是明细数据,数据仓库或DM存放的是汇聚
数据,ODS可提供查询明细的功能。 

数据源源不断写入到ODS, 一经写入的数据就不能被更改,鉴于这些特性,ODS一般会考虑使用分布式文件存储系统。 ODS数据只能增加不能修改,数据是业务系统的原样拷贝,可能存在数据冲突的可能,解决方式是为每一条数据增加一个时间版本来区分相同的数据。 

OLTP DB保留的是数据信息的最新状态,只有一个状态。ODS支持OLTP类型的数据更新,数据更新时间短,数据可实现准实时更新,性能与及时性都高于EDW 。ODS层的数据粒度是最细的,它的历史数据一般保存3-6个月,以节省空间。如果量不大,有些可以保存更长时间。

客户等关键实体数据。ODS长久保存当前数据,EDW长久保存当前与历史数据。
详单数据。ODS保存1个月到3个月;EDW保存2年。
汇总数据。ODS保存3年;EDW保存5年。
其他数据。ODS保存13个月;EDW保存3年。

ODS主要面向营业、渠道等一线生产人员和一线管理人员,为了实现准实时、跨系统的运营细节数据的查询,以获得细粒度的运营数据展现,例如渠道人员查询客户的全视图信息由ODS提供数据支撑。ODS中也存在部分粗粒度汇总数据,但汇总的维度少且简单。

DW  

数据仓库(Data Warehouse):是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。



时效:T+1


A.  主要提供查询服务,并要求查询能够及时响应. 
B.  数据质量,DW提供很多决策系统的支撑数据,数据准确非常重要。DW的数据应该是唯一的具有
权威性的数据,企业所有决策系统只能使用从DW提供的被认可的数据。
C.  扩展性,业务扩展和降低企业建设数据仓库的成本考虑 。
D.  面向主题,DW中的数据是按照一定的主题域进行组织的,每一个主题对应一个宏观的分析领域。
数据仓库排除对决策无用的数据,提供特定主题的简明视图。 


DW中的数据需要定期进行质量审核,保证权威准确;DW中的数据只允许增加,不允许删除和修改。EDW需要的运营数据,如果在ODS中已存在,EDW则直接从ODS获取这部分数据。EDW需要的运营数据,如果在ODS中没有,EDW则直接从生产系统获取这部分数据。


  1. DW层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。这一层的数据一般是遵循数据库第三范式的,其数据粒度通常和ODS的粒度相同。在DW层会保存BI系统中所有的历史数据,例如保存10年的数据。


    EDW主要面向专业分析人员、辅助决策支持人员等,为了实现基于历史数据的统计分析和数据挖掘,以获得客户深层次的特征和市场发展的规律,例如专业分析人员的经营状况趋势分析由EDW提 供支撑。

    DM  


    数据集市,以某个业务应用为出发点而建设的局部DW。DM只关心自己需要的数据,不会全量考虑企业整体数据架构和应用,每个应用有自己的DM。 数据集市就是满足特定的部门或者用户的需求,按照多维的方式进行存储,包括定义维度、需要计算的指标、维度的层次等,生成面向决策分析需求的数据立方体(data cube)。


    这层数据是面向主题来组织数据的,通常是星形或雪花结构的数据。从数据粒度来说,这层的数据是轻度汇总级的数据,已经不存在明细数据了。从数据的时间跨度来说,通常是 DW 层的一部分,主要的目的是为了满足用户分析的需求,而从分析的角度来说,用户通常只需要分析近几年(如近三年的数据)的即可。从数据的广度来说,仍然覆盖了所有业务数据。一个星型结构包含两个基本部分——一个事实表和各种支持维表。


    事实表  ---- 
    描述数据集市中最密集的数据。在电话公司中,用于呼叫的数据是典型的最密集数据;在银行中,与账目核对和自动柜员机有关的数据是典型的最密集数据。对于零售业而言,销售和库存数据是最密集的数据等。通常,事实表的数据不能更改,但可以输入数据。 它包括:一个反映事实表建立目的的实体的主键,如一张订单、一次销售、一个电话等等,主键信息,连接事实表与维表的外键。 


    维度表 ---- 维表是围绕着事实表建立的。维表包含非密集型数据,它通过外键与事实表相连。典型的维表建立在数据集市的基础上,包括产品目录、客户名单、厂商列表等等。


    数据集市产品 --- 
    国外知名的Garnter关于数据集市产品报告中,位于第一象限的敏捷商业智能产品有QlikView, Tableau和SpotView



    2. hive 的几种存储格式

    Hive文件存储格式
    1.textfile
    textfile为默认格式
    存储方式:行存储
    磁盘开销大 数据解析开销大
    压缩的text文件 hive无法进行合并和拆分

    2.sequencefile
    二进制文件,以<key,value>的形式序列化到文件中
    存储方式:行存储
    可分割 压缩
    一般选择block压缩
    优势是文件和Hadoop api中的mapfile是相互兼容的。


    3.rcfile
    存储方式:数据按行分块 每块按照列存储
    压缩快 快速列存取
    读记录尽量涉及到的block最少
    读取需要的列只需要读取每个row group 的头部定义。
    读取全量数据的操作 性能可能比sequencefile没有明显的优势



    4.orc

    存储方式:数据按行分块 每块按照列存储

    压缩快 快速列存取

    效率比rcfile高,是rcfile的改良版本



    5.自定义格式
    用户可以通过实现inputformat和 outputformat来自定义输入输出格式。

    总结:
    textfile 存储空间消耗比较大,并且压缩的text 无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高
    sequencefile 存储空间消耗最大,压缩的文件可以分割和合并 查询效率高,需要通过text文件转化来加载
    rcfile 存储空间最小,查询的效率最高 ,需要通过text文件转化来加载,加载的速度最低

    3.flume 各个组件的介绍
    1.   SourceNetCat Source:绑定的端口(tcp、udp),将流经端口的每一个文本行数据作为Event输入;type:source的类型,必须是netcat。
    bind:要监听的(本机的)主机名或者ip。此监听不是过滤发送方。一台电脑不是说只有一个IP。有多网卡的电脑,对应多个IP。
    port:绑定的本地的端口。

    Avro Source:监听一个avro服务端口,采集Avro数据序列化后的数据;type:avrosource的类型,必须是avro。
    bind:要监听的(本机的)主机名或者ip。此监听不是过滤发送方。一台电脑不是说只有一个IP。有多网卡的电脑,对应多个IP。
    port:绑定的本地的端口。

    Exec Source:于Unix的command在标准输出上采集数据;type:source的类型:必须是exec。
    command:要执行命令。

    Spooling Directory Source:监听一个文件夹里的文件的新增,如果有则采集作为source。type:source 的类型:必须是spooldir
    spoolDir:监听的文件夹 【提前创建目录】
    fileSuffix:上传完毕后文件的重命名后缀,默认为.COMPLETED
    deletePolicy:上传后的文件的删除策略never和immediate,默认为never。
    fileHeader:是否要加上该文件的绝对路径在header里,默认是false。
    basenameHeader:是否要加上该文件的名称在header里,默认是false。

    2. SinkHDFS Sink:将数据传输到hdfs集群中。type:sink的类型 必须是hdfs。
    hdfs.path:hdfs的上传路径。
    hdfs.filePrefix:hdfs文件的前缀。默认是:FlumeData
    hdfs.rollInterval:间隔多久产生新文件,默认是:30(秒) 0表示不以时间间隔为准。
    hdfs.rollSize:文件到达多大再产生一个新文件,默认是:1024(bytes)0表示不以文件大小为准。
    hdfs.rollCount:event达到多大再产生一个新文件,默认是:10(个)0表示不以event数目为准。
    hdfs.batchSize:每次往hdfs里提交多少个event,默认为100
    hdfs.fileType:hdfs文件的格式主要包括:SequenceFile, DataStream ,CompressedStream,如果使用了CompressedStream就要设置压缩方式。
    hdfs.codeC:压缩方式:gzip, bzip2, lzo, lzop, snappy
    注:%{host}可以使用header的key。以及%Y%m%d来表示时间,但关于时间的表示需要在header里有timestamp这个key。

    Logger Sink将数据作为日志处理(根据flume中的设置的日志方式来显示)要在控制台显示在运行agent的时候加入:-Dflume.root.logger=INFO,console 。
    type:sink的类型:必须是 logger。
    maxBytesToLog:打印body的最长的字节数 默认为16

    Avro Sink:数据被转换成Avro Event,然后发送到指定的服务端口上。type:sink的类型:必须是 avro。
    hostname:指定发送数据的主机名或者ip
    port:指定发送数据的端口

    File Roll Sink:数据发送到本地文件。type:sink的类型:必须是 file_roll。
    sink.directory:存储文件的目录【提前创建目录】
    batchSize:一次发送多少个event。默认为100
    sink.rollInterval:多久产生一个新文件,默认为30s。单位是s。0为不产生新文件。【即使没有数据也会产生文件】

    3.ChannelMemory Channel使用内存作为数据的存储。Type channel的类型:必须为memory
    capacity:channel中的最大event数目
    transactionCapacity:channel中允许事务的最大event数目

    File Channel 使用文件作为数据的存储Type channel的类型:必须为 file
    checkpointDir :检查点的数据存储目录【提前创建目录】
    dataDirs :数据的存储目录【提前创建目录】
    transactionCapacity:channel中允许事务的最大event数目

    Spillable Memory Channel 使用内存作为channel超过了阀值就存在文件中Type channel的类型:必须为SPILLABLEMEMORY
    memoryCapacity:内存的容量event数
    overflowCapacity:数据存到文件的event阀值数
    checkpointDir:检查点的数据存储目录
    dataDirs:数据的存储目录

    4. InterceptorTimestamp Interceptor 时间戳拦截器 在header里加入key为timestamp,value为当前时间。type:拦截器的类型,必须为timestamp
    preserveExisting:如果此拦截器增加的key已经存在,如果这个值设置为true则保持原来的值,否则覆盖原来的值。默认为false

    Host Interceptor 主机名或者ip拦截器,在header里加入ip或者主机名type:拦截器的类型,必须为host
    preserveExisting:如果此拦截器增加的key已经存在,如果这个值设置为true则保持原来的值,否则覆盖原来的值。默认为false
    useIP:如果设置为true则使用ip地址,否则使用主机名,默认为true
    hostHeader:使用的header的key名字,默认为host

    Static Interceptor 静态拦截器,是在header里加入固定的key和value。type:avrosource的类型,必须是static。
    preserveExisting:如果此拦截器增加的key已经存在,如果这个值设置为true则保持原来的值,否则覆盖原来的值。默认为false
    key:静态拦截器添加的key的名字
    value:静态拦截器添加的key对应的value值

    5.  Channel SelectorMultiplexing Channel Selector 根据header的key的值分配channelselector.type 默认为replicating
    selector.header:选择作为判断的key
    selector.default:默认的channel配置
    selector.mapping.*:匹配到的channel的配置

    6. Sink Processor负载均衡
    a1.sinkgroups=g1
    a1.sinkgroups.g1.sinks=k1 k2
    a1.sinkgroups.g1.processor.type=load_balance
    a1.sinkgroups.g1.processor.backoff=true
    a1.sinkgroups.g1.processor.selector=round_robin
    a1.sinkgroups.g1.processor.selector.maxTimeOut=30000

    backoff:开启后,故障的节点会列入黑名单,过一定时间再次发送,如果还失败,则等待是指数增长;直到达到最大的时间。
    如果不开启,故障的节点每次都会被重试。
    selector.maxTimeOut:最大的黑名单时间(单位为毫秒)。

    故障转移
    a1.sinkgroups=g1
    a1.sinkgroups.g1.sinks=k1 k2
    a1.sinkgroups.g1.processor.type=failover
    a1.sinkgroups.g1.processor.priority.k1=10
    a1.sinkgroups.g1.processor.priority.k2=5
    a1.sinkgroups.g1.processor.maxpenalty=10000
    #maxpenalty 对于故障的节点最大的黑名单时间 (in millis 毫秒)


    今日小作业:
    4. flume 和 kafka 的区别

    hive的底层实现原理

    hive和hbase的区别  以及为什么hive是数据仓库

    spark 消费 kafka时 会出现的问题   和  spark消费kafka时 是如何消费的

    hive 和spark的运行机理有什么不同

    hive 实现 查询某字段连续出现    查询列表时间


    作者:黑马程序员大数据培训学院

    首发: http://java.itheima.com


分享到:
在线咨询 我要报名
和我们在线交谈!