hadoop2.20+hive+sqoop+mysql數據處理案例

一、業務說明

使用Hadoop2及其他開源框架,對本地的日誌文件進行處理,將處理後需要的數據(PV、UV...)重新導入到關係型數據庫(Mysql)中,使用Java程序對結果數據進行處理,組織成報表的形式在數據後臺進行展示。

 

二、爲什麼使用Hadoop(開發動機)

現有的日誌處理方式,是採用純的java程序來計算的,對於大數據的日誌文件來說,這種方案在處理速度、IO佔用、數據備份及資源利用率方面都有一定的缺陷;

 

相比之下使用Hadoop完成數據存儲和計算有以下的好處:

(1)高可靠性:Hadoop支持對數據的多副本備份;
(2)高擴展性:Hadoop是在可用的計算機集簇間分配數據並完成計算任務的,這些集簇可以方便地擴展到數以千計    的節點中。
(3)高效性:通過分發數據,hadoop可以在數據所在的節點上並行地(parallel)處理它們,這使得處理非常的快   速。
(4)高容錯性:Hadoop能夠自動保存數據的多個副本,並且能夠自動將失敗的任務重新分配。

(5)高資源利用率:管理員可以根據當前服務器的配置,來設置不同的資源調度方案(yarn),做到資源利用最大化。

三、數據處理流程圖

 

 

四、類目貢獻率案例流程

一、案例業務目標: 

統計2014年12月16日 全天,用戶點擊數top20的商品類別條目

 

二、開發步驟

 

(1)將2014年12月16日的日誌(約16G)上傳到HDFS文件系統的 /input/log_2014-12-16目錄下

 

 

(2)、編寫MapReduce程序清洗數據

 

程序邏輯分析:

篩選出日誌字段中url包含?id=...的行,該url表示的含義爲用戶點擊了某個商品類目爲id的條目,程序的目標是隻篩選出含有此url的行數據,對於不包含的行將捨棄。 清洗後的數據存放在HDFS的   /output/cleanItem_2014_12_16目錄下(清洗後的數據約爲140MB)

 

 

 

 

(3)、將清洗後的數據映射到Hive表中

 

進入hive的client端,建立一個外部分區表mmb_ordercontribute,這個表的字段與日誌的字段一一對應,但會多一個data的分區字段,這相當於Mysql中的索引,當按照日期查詢時,效率會高,以下是在hive中,mmb_ordercontribute的建表語句:

 

 

如圖所示,表的映射路徑location指向了清洗後的數據目錄

 

(4)操作hive表數據

 

    數據經過映射後,就可以像mysql等數據庫一樣通過sql語句的形式來處理表數據了,比如:

統計當天所有用戶訪問條目的總次數:

 

 

    統計的結果爲:904423

雖然是一個類似mysql的查詢語句,但是處理的流程和mysql是天差地別的,hive會將這條語句解析成一個MapReduce程序進行統計,如圖所示,hive處理完這個查詢cup使用的總時間爲6分鐘左右,而分配到邏輯cpu上,實際使用的時間爲28.5秒,如果去除mapreduce的解析和準備工作,mapreduce的執行時間是非常少的。

但hive並不是所有的sql語句都被映射成mapreduce程序,唯一的例外(不配置的話)就是:SELECT * FROM  table_name LIMIT;因爲這只是在截取表的前幾條數據而已;

 

 

(5)使用Hive處理清洗數據並導出到臨時表

 

真正需要的數據將在此步得出,即:統計出top20的用戶點擊類目,將統計出的數據作爲hive的一張臨時表:

item_20141216表存儲,備後用:

sql語句: 

 

CREATE TABLE 

item_20141216 

AS SELECT 

itemId,COUNT(1) as nums  

FROM

 mmb_ordercontribute

   GROUP BY 

itemId 

ORDER BY

 nums DESC;

 

導出後的表item_20141216 存放在hive的默認數據倉庫下:

 

 

注:每行數據其實由兩部分組成,行號和數量,看着像一個數字是因爲hive表字段的分隔符不是空格或者tab鍵,而是 \001

 

 

 

(6)使用sqoop將臨時表數據導出到mysql對應的表中

在mysql中創建與item_20141216對應的表

 

CREATE TABLE `item_contribute` (

  `itemId` varchar(11) default NULL COMMENT '條目id',

  `nums` int(11) default NULL COMMENT '出現的次數'

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

進入sqoop客戶端執行一下命令輸入連接信息: 

 sqoop export --connect jdbc:mysql://master:3306/test --username hive --password 123456 --table  item_contribute --fields-terminated-by '\001' --export-dir '/user/hive/warehouse/db1.db/item_20141216';

 

將會看到mysql表中的數據被填充: 

 

 

 

(7)接下來就可以利用java程序將數據組織成報表進行展示了!

 


 

發佈了39 篇原創文章 · 獲贊 8 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章