基於 Hive 構建資料倉儲

2021-10-05 10:26:58 字數 3023 閱讀 6916

設想有一批各種型別的離線(或實時)資料(文字、csv、excel 等),我們如何挖掘這些資料背後的價值,分析這些資料之間的關聯?

很容易想到的就是,寫程式把每種資料按照某種規則抽取出來放到關係型資料庫中進行分析。

這樣做可能存在什麼樣的問題?

按照某種規則進行抽取,是否會導致原始資料資訊的丟失?

因為前期設計不足或者後期需求變化導致資料的重複處理?

面對上千億,甚至上萬億的資料,如何進行分析?

面對上面這些問題,現在比較常見的解決方案是基於大資料平台構建資料倉儲

下面對資料倉儲的設計和技術選型,結合自己的工作經歷談一些看法。

現在常見的分層模型,一般是參考阿里五層模型做的。如下

下面是各層的依賴關係和資料流向圖:

基於 hive 來實現前三層是非常合適的,hive 的資料儲存在 hdfs 上。hdfs 的擴容是很容易的,故大資料量不再成為問題。另外 hive 提供了類似 sql 的查詢語句,提供了無需程式設計就可以對海量資料進行查詢分析的能力。

實際應用中ods 和 dwd一般可以合為一層,建乙個庫特地用來存放原始資料,務必要增加乙個匯入時間的字段,後期會發現有很多好處。

dw可以細分為抽象的公共資料和主題資料。抽象的公共資料,可以理解為設計一種非常通用的抽取規則,適用於大部分原始資料。主題資料,這個粒度更細一些,將原始資料進行分類,同一類別的資料放到同一張表裡,方便應用進行對接。

dm即融入了一些業務邏輯,將 dw 層的資料進行了一些處理和分析,並將結果根據需求存到不同的儲存系統裡。比如 本月最受歡迎的商品、購買力較高的使用者等。有時也會直接對接原始資料,針對單錶進行分析還好,如果是多表可能存在效率問題,而且這種方式跟原始資料耦合度太高了,不太推薦這種方式。

st這個就理解為對 dm 計算好的資料進行展示的介面,也可以是跟使用者實時互動的,比如 使用者輸入一些分析引數,dm 層將結果計算好後再展現給使用者。

需要設定分割槽欄位嗎?如果需要,如何設計分割槽方案?

仔細看一下,這個其實就是 hive 資料在 hdfs 上的儲存位置。如果不設定分割槽,那麼所有的資料都將放到 shopping 這個目錄下,每次查詢就需要遍歷一遍所有的檔案,想想有點可怕。

資料量大且資料是多次入的,那麼設定分割槽欄位是很有必要的。

下面看下兩種比較好的分割槽方式:

這裡主要談一下前四層實現時涉及到的技術和儲存系統。

回到一開始的場景,這一批離線(或實時)資料如何入到 hive 裡面呢?中間需要做什麼處理?

etl(extract,transform,load):

提取,轉換,載入是很常見的資料處理模式。將處理流程分為三段,屬於將流程標準化,每一步驟由專門的程式去做,如果某一步驟失敗了,那麼只需要重做這一步即可,不用重複整個資料處理流程,想想就很開心。

至此,這一批資料經過 etl 過程就來到了原始資料層。

dws,主題資料

根據業務需要設計多個主題,然後將原始資料抽到不同的主題庫裡面。以購物舉例,比如 使用者瀏覽商品,高流量的商鋪等。

這裡的技術選擇一般有兩種:

dwb,抽象的公共資料

處理流程和技術選擇和主題資料基本是一致的,區別在於,它比主題庫的抽象程度更高,如果主題庫面對的是使用者瀏覽商品的記錄,那麼它面對的就是使用者這個物件了。高層次的抽象是有必要的,可以更加全面的分析乙個事物,模擬下 巨集觀經濟和微觀經濟(暫且認為貼切)。

這一層,就是各種不同業務發揮作用的地方了,我們一般稱為各個應用。比如 展示分析結果的應用、與使用者互動執行查詢分析的應用。

先來回憶下我們的支付寶年賬單,出行、線下消費、網購等等,這個是不是跟前面的主題庫對應上了。這種類似報表一樣的就是針對分析結果進行展示的應用

現在我們站在**賣家(假設食品店)的角度,需要獲取哪些資訊來提公升**的銷售額呢?

經常瀏覽店鋪的都是哪些年齡段的人呢? ——決定我宣傳和銷售的策略

最近乙個月哪些商品(食品)比較暢銷? ——決定我後面進貨的策略

針對第二個問題分析一下需求:

​ 輸入:時間範圍,商品種類

​ 輸出:暢銷的商品,即在給定時間範圍內銷量 top n 的商品。

​ 處理流程:把全網給定時間範圍內食品類商品的銷售記錄拿出來,根據銷量排序後取 top n ,然後返回

這種就是需要跟使用者互動的查詢分析類應用

那麼實現這些功能,需要哪些技術和儲存系統呢?

技術和儲存系統有了,如何來解決上面的問題呢?

hive 裡面的資料一般是不會進行修改的,因為 hive 本身的定位就是用來做查詢和分析的,因此預設是不支援 update 和 delete(高版本 hive 可以增加一些附加配置來實現)。

實際場景中,一般也是不會對某些行執行更新操作的。通常是某批資料處理得有問題,然後又和前面正常的資料混在一起了,如果設定了分割槽字段,可以很容易的通過刪除分割槽,然後重新入庫資料來實現,如下:

alter

table table1 drop

partition

(day

='20190722'

);

本文從個人實際經歷出發,介紹了資料倉儲的分層模型(基於 hive)和相關技術選型,以及設計和開發中的一些注意點。資料倉儲的內容和涉及技術是比較多的,相比起來,本文還是比較淺顯的,但是個人覺得做技術是需要多總結和分享的。後面還需要多深入研究下數倉,與君共勉。

Hive 資料倉儲

hive命令列模式 1 進入bin 執行.hiv 2 配置hive環境變數,直接執行命令 hive service cli 或 hive hive的web模式 執行hive service hwi 啟動後訪問http master 9999 hwi hive的遠端服務 預設埠 10000,執行啟動命...

資料倉儲Hive

資料倉儲是乙個面向主題的 整合的 相對穩定的 反映歷史變化的資料集合,用於支援管理決策。根本目的是為了支援企業內部的商業分析和決策,基於資料倉儲的分析結果,做出相關的經營決策.資料倉儲中的資料比較穩定,保留了大量歷史資料 而資料庫只儲存某一時刻的資料.對於傳統資料倉儲來說,既是資料儲存產品也是分析產...

資料倉儲Hive

乙個公司裡面不同專案可能用到不同的資料來源,有的存在mysql裡面,又的存在mongodb裡面,甚至還有些要做第三方資料。但是現在又想把資料整合起來,進行資料分析。此時資料倉儲 data warehouse,dw 就派上用場了。它可以對多種業務資料進行篩選和整合,可以用於資料分析 資料探勘 資料包表...