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程序將數據組織成報表進行展示了!
?
?
總結
以上是生活随笔為你收集整理的hadoop2.20+hive+sqoop+mysql数据处理案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop推测执行(以空间换取时间)
- 下一篇: 解决Mysql读写分离数据延迟