全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

首頁(yè)技術(shù)文章正文

大數(shù)據(jù)面試題之?dāng)?shù)倉(cāng)問(wèn)題

更新時(shí)間:2018-11-29 來(lái)源:黑馬程序員技術(shù)社區(qū) 瀏覽量:

ods dw dm  的區(qū)別

ODS應(yīng)用場(chǎng)景 

A. 在業(yè)務(wù)系統(tǒng)和數(shù)據(jù)倉(cāng)庫(kù)之間形成一個(gè)隔離層,ODS直接存放從各個(gè)業(yè)務(wù)系統(tǒng)抽取過(guò)來(lái)的數(shù)據(jù),這些數(shù)據(jù)從結(jié)構(gòu)和數(shù)據(jù)邏輯關(guān)系上和業(yè)務(wù)系統(tǒng)保持一致,降低了數(shù)據(jù)抽取的復(fù)雜性。它的存在可以避免數(shù)據(jù)倉(cāng)庫(kù)直接調(diào)用業(yè)務(wù)系統(tǒng)的數(shù)據(jù)。 
B. 轉(zhuǎn)移一部分業(yè)務(wù)系統(tǒng)細(xì)節(jié)查詢(xún)的功能。因ODS存放的數(shù)據(jù)與業(yè)務(wù)系統(tǒng)相同,原來(lái)由業(yè)務(wù)系統(tǒng)
產(chǎn)生的報(bào)表,現(xiàn)在可以從ODS中產(chǎn)生了。 
C. 完成數(shù)據(jù)倉(cāng)庫(kù)中不能完成的一些功能。ODS存放的是明細(xì)數(shù)據(jù),數(shù)據(jù)倉(cāng)庫(kù)或DM存放的是匯聚
數(shù)據(jù),ODS可提供查詢(xún)明細(xì)的功能。 

數(shù)據(jù)源源不斷寫(xiě)入到ODS, 一經(jīng)寫(xiě)入的數(shù)據(jù)就不能被更改,鑒于這些特性,ODS一般會(huì)考慮使用分布式文件存儲(chǔ)系統(tǒng)。 ODS數(shù)據(jù)只能增加不能修改,數(shù)據(jù)是業(yè)務(wù)系統(tǒng)的原樣拷貝,可能存在數(shù)據(jù)沖突的可能,解決方式是為每一條數(shù)據(jù)增加一個(gè)時(shí)間版本來(lái)區(qū)分相同的數(shù)據(jù)。 

OLTP DB保留的是數(shù)據(jù)信息的最新?tīng)顟B(tài),只有一個(gè)狀態(tài)。ODS支持OLTP類(lèi)型的數(shù)據(jù)更新,數(shù)據(jù)更新時(shí)間短,數(shù)據(jù)可實(shí)現(xiàn)準(zhǔn)實(shí)時(shí)更新,性能與及時(shí)性都高于EDW 。ODS層的數(shù)據(jù)粒度是最細(xì)的,它的歷史數(shù)據(jù)一般保存3-6個(gè)月,以節(jié)省空間。如果量不大,有些可以保存更長(zhǎng)時(shí)間。

客戶(hù)等關(guān)鍵實(shí)體數(shù)據(jù)。ODS長(zhǎng)久保存當(dāng)前數(shù)據(jù),EDW長(zhǎng)久保存當(dāng)前與歷史數(shù)據(jù)。
詳單數(shù)據(jù)。ODS保存1個(gè)月到3個(gè)月;EDW保存2年。
匯總數(shù)據(jù)。ODS保存3年;EDW保存5年。
其他數(shù)據(jù)。ODS保存13個(gè)月;EDW保存3年。

ODS主要面向營(yíng)業(yè)、渠道等一線(xiàn)生產(chǎn)人員和一線(xiàn)管理人員,為了實(shí)現(xiàn)準(zhǔn)實(shí)時(shí)、跨系統(tǒng)的運(yùn)營(yíng)細(xì)節(jié)數(shù)據(jù)的查詢(xún),以獲得細(xì)粒度的運(yùn)營(yíng)數(shù)據(jù)展現(xiàn),例如渠道人員查詢(xún)客戶(hù)的全視圖信息由ODS提供數(shù)據(jù)支撐。ODS中也存在部分粗粒度匯總數(shù)據(jù),但匯總的維度少且簡(jiǎn)單。

DW  

數(shù)據(jù)倉(cāng)庫(kù)(Data Warehouse):是一個(gè)面向主題的(Subject Oriented)、集成的(Integrated)、相對(duì)穩(wěn)定的(Non-Volatile)、反映歷史變化(Time Variant)的數(shù)據(jù)集合,用于支持管理決策(Decision Making Support)。



時(shí)效:T+1


A.  主要提供查詢(xún)服務(wù),并要求查詢(xún)能夠及時(shí)響應(yīng). 
B.  數(shù)據(jù)質(zhì)量,DW提供很多決策系統(tǒng)的支撐數(shù)據(jù),數(shù)據(jù)準(zhǔn)確非常重要。DW的數(shù)據(jù)應(yīng)該是唯一的具有
權(quán)威性的數(shù)據(jù),企業(yè)所有決策系統(tǒng)只能使用從DW提供的被認(rèn)可的數(shù)據(jù)。
C.  擴(kuò)展性,業(yè)務(wù)擴(kuò)展和降低企業(yè)建設(shè)數(shù)據(jù)倉(cāng)庫(kù)的成本考慮 。
D.  面向主題,DW中的數(shù)據(jù)是按照一定的主題域進(jìn)行組織的,每一個(gè)主題對(duì)應(yīng)一個(gè)宏觀的分析領(lǐng)域。
數(shù)據(jù)倉(cāng)庫(kù)排除對(duì)決策無(wú)用的數(shù)據(jù),提供特定主題的簡(jiǎn)明視圖。 


DW中的數(shù)據(jù)需要定期進(jìn)行質(zhì)量審核,保證權(quán)威準(zhǔn)確;DW中的數(shù)據(jù)只允許增加,不允許刪除和修改。EDW需要的運(yùn)營(yíng)數(shù)據(jù),如果在ODS中已存在,EDW則直接從ODS獲取這部分?jǐn)?shù)據(jù)。EDW需要的運(yùn)營(yíng)數(shù)據(jù),如果在ODS中沒(méi)有,EDW則直接從生產(chǎn)系統(tǒng)獲取這部分?jǐn)?shù)據(jù)。


  1. DW層的數(shù)據(jù)應(yīng)該是一致的、準(zhǔn)確的、干凈的數(shù)據(jù),即對(duì)源系統(tǒng)數(shù)據(jù)進(jìn)行了清洗(去除了雜質(zhì))后的數(shù)據(jù)。這一層的數(shù)據(jù)一般是遵循數(shù)據(jù)庫(kù)第三范式的,其數(shù)據(jù)粒度通常和ODS的粒度相同。在DW層會(huì)保存BI系統(tǒng)中所有的歷史數(shù)據(jù),例如保存10年的數(shù)據(jù)。


    EDW主要面向?qū)I(yè)分析人員、輔助決策支持人員等,為了實(shí)現(xiàn)基于歷史數(shù)據(jù)的統(tǒng)計(jì)分析和數(shù)據(jù)挖掘,以獲得客戶(hù)深層次的特征和市場(chǎng)發(fā)展的規(guī)律,例如專(zhuān)業(yè)分析人員的經(jīng)營(yíng)狀況趨勢(shì)分析由EDW提 供支撐。

    DM  


    數(shù)據(jù)集市,以某個(gè)業(yè)務(wù)應(yīng)用為出發(fā)點(diǎn)而建設(shè)的局部DW。DM只關(guān)心自己需要的數(shù)據(jù),不會(huì)全量考慮企業(yè)整體數(shù)據(jù)架構(gòu)和應(yīng)用,每個(gè)應(yīng)用有自己的DM。 數(shù)據(jù)集市就是滿(mǎn)足特定的部門(mén)或者用戶(hù)的需求,按照多維的方式進(jìn)行存儲(chǔ),包括定義維度、需要計(jì)算的指標(biāo)、維度的層次等,生成面向決策分析需求的數(shù)據(jù)立方體(data cube)。


    這層數(shù)據(jù)是面向主題來(lái)組織數(shù)據(jù)的,通常是星形或雪花結(jié)構(gòu)的數(shù)據(jù)。從數(shù)據(jù)粒度來(lái)說(shuō),這層的數(shù)據(jù)是輕度匯總級(jí)的數(shù)據(jù),已經(jīng)不存在明細(xì)數(shù)據(jù)了。從數(shù)據(jù)的時(shí)間跨度來(lái)說(shuō),通常是 DW 層的一部分,主要的目的是為了滿(mǎn)足用戶(hù)分析的需求,而從分析的角度來(lái)說(shuō),用戶(hù)通常只需要分析近幾年(如近三年的數(shù)據(jù))的即可。從數(shù)據(jù)的廣度來(lái)說(shuō),仍然覆蓋了所有業(yè)務(wù)數(shù)據(jù)。一個(gè)星型結(jié)構(gòu)包含兩個(gè)基本部分——一個(gè)事實(shí)表和各種支持維表。


    事實(shí)表  ---- 
    描述數(shù)據(jù)集市中最密集的數(shù)據(jù)。在電話(huà)公司中,用于呼叫的數(shù)據(jù)是典型的最密集數(shù)據(jù);在銀行中,與賬目核對(duì)和自動(dòng)柜員機(jī)有關(guān)的數(shù)據(jù)是典型的最密集數(shù)據(jù)。對(duì)于零售業(yè)而言,銷(xiāo)售和庫(kù)存數(shù)據(jù)是最密集的數(shù)據(jù)等。通常,事實(shí)表的數(shù)據(jù)不能更改,但可以輸入數(shù)據(jù)。 它包括:一個(gè)反映事實(shí)表建立目的的實(shí)體的主鍵,如一張訂單、一次銷(xiāo)售、一個(gè)電話(huà)等等,主鍵信息,連接事實(shí)表與維表的外鍵。 


    維度表 ---- 維表是圍繞著事實(shí)表建立的。維表包含非密集型數(shù)據(jù),它通過(guò)外鍵與事實(shí)表相連。典型的維表建立在數(shù)據(jù)集市的基礎(chǔ)上,包括產(chǎn)品目錄、客戶(hù)名單、廠(chǎng)商列表等等。


    數(shù)據(jù)集市產(chǎn)品 --- 
    國(guó)外知名的Garnter關(guān)于數(shù)據(jù)集市產(chǎn)品報(bào)告中,位于第一象限的敏捷商業(yè)智能產(chǎn)品有QlikView, Tableau和SpotView



    2. hive 的幾種存儲(chǔ)格式

    Hive文件存儲(chǔ)格式
    1.textfile
    textfile為默認(rèn)格式
    存儲(chǔ)方式:行存儲(chǔ)
    磁盤(pán)開(kāi)銷(xiāo)大 數(shù)據(jù)解析開(kāi)銷(xiāo)大
    壓縮的text文件 hive無(wú)法進(jìn)行合并和拆分

    2.sequencefile
    二進(jìn)制文件,以<key,value>的形式序列化到文件中
    存儲(chǔ)方式:行存儲(chǔ)
    可分割 壓縮
    一般選擇block壓縮
    優(yōu)勢(shì)是文件和Hadoop api中的mapfile是相互兼容的。


    3.rcfile
    存儲(chǔ)方式:數(shù)據(jù)按行分塊 每塊按照列存儲(chǔ)
    壓縮快 快速列存取
    讀記錄盡量涉及到的block最少
    讀取需要的列只需要讀取每個(gè)row group 的頭部定義。
    讀取全量數(shù)據(jù)的操作 性能可能比sequencefile沒(méi)有明顯的優(yōu)勢(shì)



    4.orc

    存儲(chǔ)方式:數(shù)據(jù)按行分塊 每塊按照列存儲(chǔ)

    壓縮快 快速列存取

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



    5.自定義格式
    用戶(hù)可以通過(guò)實(shí)現(xiàn)inputformat和 outputformat來(lái)自定義輸入輸出格式。

    總結(jié):
    textfile 存儲(chǔ)空間消耗比較大,并且壓縮的text 無(wú)法分割和合并 查詢(xún)的效率最低,可以直接存儲(chǔ),加載數(shù)據(jù)的速度最高
    sequencefile 存儲(chǔ)空間消耗最大,壓縮的文件可以分割和合并 查詢(xún)效率高,需要通過(guò)text文件轉(zhuǎn)化來(lái)加載
    rcfile 存儲(chǔ)空間最小,查詢(xún)的效率最高 ,需要通過(guò)text文件轉(zhuǎn)化來(lái)加載,加載的速度最低

    3.flume 各個(gè)組件的介紹
    1.   SourceNetCat Source:綁定的端口(tcp、udp),將流經(jīng)端口的每一個(gè)文本行數(shù)據(jù)作為Event輸入;type:source的類(lèi)型,必須是netcat。
    bind:要監(jiān)聽(tīng)的(本機(jī)的)主機(jī)名或者ip。此監(jiān)聽(tīng)不是過(guò)濾發(fā)送方。一臺(tái)電腦不是說(shuō)只有一個(gè)IP。有多網(wǎng)卡的電腦,對(duì)應(yīng)多個(gè)IP。
    port:綁定的本地的端口。

    Avro Source:監(jiān)聽(tīng)一個(gè)avro服務(wù)端口,采集Avro數(shù)據(jù)序列化后的數(shù)據(jù);type:avrosource的類(lèi)型,必須是avro。
    bind:要監(jiān)聽(tīng)的(本機(jī)的)主機(jī)名或者ip。此監(jiān)聽(tīng)不是過(guò)濾發(fā)送方。一臺(tái)電腦不是說(shuō)只有一個(gè)IP。有多網(wǎng)卡的電腦,對(duì)應(yīng)多個(gè)IP。
    port:綁定的本地的端口。

    Exec Source:于Unix的command在標(biāo)準(zhǔn)輸出上采集數(shù)據(jù);type:source的類(lèi)型:必須是exec。
    command:要執(zhí)行命令。

    Spooling Directory Source:監(jiān)聽(tīng)一個(gè)文件夾里的文件的新增,如果有則采集作為source。type:source 的類(lèi)型:必須是spooldir
    spoolDir:監(jiān)聽(tīng)的文件夾 【提前創(chuàng)建目錄】
    fileSuffix:上傳完畢后文件的重命名后綴,默認(rèn)為.COMPLETED
    deletePolicy:上傳后的文件的刪除策略never和immediate,默認(rèn)為never。
    fileHeader:是否要加上該文件的絕對(duì)路徑在header里,默認(rèn)是false。
    basenameHeader:是否要加上該文件的名稱(chēng)在header里,默認(rèn)是false。

    2. SinkHDFS Sink:將數(shù)據(jù)傳輸?shù)絟dfs集群中。type:sink的類(lèi)型 必須是hdfs。
    hdfs.path:hdfs的上傳路徑。
    hdfs.filePrefix:hdfs文件的前綴。默認(rèn)是:FlumeData
    hdfs.rollInterval:間隔多久產(chǎn)生新文件,默認(rèn)是:30(秒) 0表示不以時(shí)間間隔為準(zhǔn)。
    hdfs.rollSize:文件到達(dá)多大再產(chǎn)生一個(gè)新文件,默認(rèn)是:1024(bytes)0表示不以文件大小為準(zhǔn)。
    hdfs.rollCount:event達(dá)到多大再產(chǎn)生一個(gè)新文件,默認(rèn)是:10(個(gè))0表示不以event數(shù)目為準(zhǔn)。
    hdfs.batchSize:每次往hdfs里提交多少個(gè)event,默認(rèn)為100
    hdfs.fileType:hdfs文件的格式主要包括:SequenceFile, DataStream ,CompressedStream,如果使用了CompressedStream就要設(shè)置壓縮方式。
    hdfs.codeC:壓縮方式:gzip, bzip2, lzo, lzop, snappy
    注:%{host}可以使用header的key。以及%Y%m%d來(lái)表示時(shí)間,但關(guān)于時(shí)間的表示需要在header里有timestamp這個(gè)key。

    Logger Sink將數(shù)據(jù)作為日志處理(根據(jù)flume中的設(shè)置的日志方式來(lái)顯示)要在控制臺(tái)顯示在運(yùn)行agent的時(shí)候加入:-Dflume.root.logger=INFO,console 。
    type:sink的類(lèi)型:必須是 logger。
    maxBytesToLog:打印body的最長(zhǎng)的字節(jié)數(shù) 默認(rèn)為16

    Avro Sink:數(shù)據(jù)被轉(zhuǎn)換成Avro Event,然后發(fā)送到指定的服務(wù)端口上。type:sink的類(lèi)型:必須是 avro。
    hostname:指定發(fā)送數(shù)據(jù)的主機(jī)名或者ip
    port:指定發(fā)送數(shù)據(jù)的端口

    File Roll Sink:數(shù)據(jù)發(fā)送到本地文件。type:sink的類(lèi)型:必須是 file_roll。
    sink.directory:存儲(chǔ)文件的目錄【提前創(chuàng)建目錄】
    batchSize:一次發(fā)送多少個(gè)event。默認(rèn)為100
    sink.rollInterval:多久產(chǎn)生一個(gè)新文件,默認(rèn)為30s。單位是s。0為不產(chǎn)生新文件?!炯词箾](méi)有數(shù)據(jù)也會(huì)產(chǎn)生文件】

    3.ChannelMemory Channel使用內(nèi)存作為數(shù)據(jù)的存儲(chǔ)。Type channel的類(lèi)型:必須為memory
    capacity:channel中的最大event數(shù)目
    transactionCapacity:channel中允許事務(wù)的最大event數(shù)目

    File Channel 使用文件作為數(shù)據(jù)的存儲(chǔ)Type channel的類(lèi)型:必須為 file
    checkpointDir :檢查點(diǎn)的數(shù)據(jù)存儲(chǔ)目錄【提前創(chuàng)建目錄】
    dataDirs :數(shù)據(jù)的存儲(chǔ)目錄【提前創(chuàng)建目錄】
    transactionCapacity:channel中允許事務(wù)的最大event數(shù)目

    Spillable Memory Channel 使用內(nèi)存作為channel超過(guò)了閥值就存在文件中Type channel的類(lèi)型:必須為SPILLABLEMEMORY
    memoryCapacity:內(nèi)存的容量event數(shù)
    overflowCapacity:數(shù)據(jù)存到文件的event閥值數(shù)
    checkpointDir:檢查點(diǎn)的數(shù)據(jù)存儲(chǔ)目錄
    dataDirs:數(shù)據(jù)的存儲(chǔ)目錄

    4. InterceptorTimestamp Interceptor 時(shí)間戳攔截器 在header里加入key為timestamp,value為當(dāng)前時(shí)間。type:攔截器的類(lèi)型,必須為timestamp
    preserveExisting:如果此攔截器增加的key已經(jīng)存在,如果這個(gè)值設(shè)置為true則保持原來(lái)的值,否則覆蓋原來(lái)的值。默認(rèn)為false

    Host Interceptor 主機(jī)名或者ip攔截器,在header里加入ip或者主機(jī)名type:攔截器的類(lèi)型,必須為host
    preserveExisting:如果此攔截器增加的key已經(jīng)存在,如果這個(gè)值設(shè)置為true則保持原來(lái)的值,否則覆蓋原來(lái)的值。默認(rèn)為false
    useIP:如果設(shè)置為true則使用ip地址,否則使用主機(jī)名,默認(rèn)為true
    hostHeader:使用的header的key名字,默認(rèn)為host

    Static Interceptor 靜態(tài)攔截器,是在header里加入固定的key和value。type:avrosource的類(lèi)型,必須是static。
    preserveExisting:如果此攔截器增加的key已經(jīng)存在,如果這個(gè)值設(shè)置為true則保持原來(lái)的值,否則覆蓋原來(lái)的值。默認(rèn)為false
    key:靜態(tài)攔截器添加的key的名字
    value:靜態(tài)攔截器添加的key對(duì)應(yīng)的value值

    5.  Channel SelectorMultiplexing Channel Selector 根據(jù)header的key的值分配channelselector.type 默認(rèn)為replicating
    selector.header:選擇作為判斷的key
    selector.default:默認(rèn)的channel配置
    selector.mapping.*:匹配到的channel的配置

    6. Sink Processor負(fù)載均衡
    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:開(kāi)啟后,故障的節(jié)點(diǎn)會(huì)列入黑名單,過(guò)一定時(shí)間再次發(fā)送,如果還失敗,則等待是指數(shù)增長(zhǎng);直到達(dá)到最大的時(shí)間。
    如果不開(kāi)啟,故障的節(jié)點(diǎn)每次都會(huì)被重試。
    selector.maxTimeOut:最大的黑名單時(shí)間(單位為毫秒)。

    故障轉(zhuǎn)移
    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 對(duì)于故障的節(jié)點(diǎn)最大的黑名單時(shí)間 (in millis 毫秒)


    今日小作業(yè):
    4. flume 和 kafka 的區(qū)別

    hive的底層實(shí)現(xiàn)原理

    hive和hbase的區(qū)別  以及為什么hive是數(shù)據(jù)倉(cāng)庫(kù)

    spark 消費(fèi) kafka時(shí) 會(huì)出現(xiàn)的問(wèn)題   和  spark消費(fèi)kafka時(shí) 是如何消費(fèi)的

    hive 和spark的運(yùn)行機(jī)理有什么不同

    hive 實(shí)現(xiàn) 查詢(xún)某字段連續(xù)出現(xiàn)    查詢(xún)列表時(shí)間


    作者:黑馬程序員大數(shù)據(jù)培訓(xùn)學(xué)院

    首發(fā): http://java.itheima.com


分享到:
在線(xiàn)咨詢(xún) 我要報(bào)名
和我們?cè)诰€(xiàn)交談!