hadoop2.20+hive+sqoop+mysql数据处理案例
一、業(yè)務(wù)說明
使用Hadoop2及其他開源框架,對本地的日志文件進行處理,將處理后需要的數(shù)據(jù)(PV、UV...)重新導(dǎo)入到關(guān)系型數(shù)據(jù)庫(Mysql)中,使用Java程序?qū)Y(jié)果數(shù)據(jù)進行處理,組織成報表的形式在數(shù)據(jù)后臺進行展示。
?
二、為什么使用Hadoop(開發(fā)動機)
現(xiàn)有的日志處理方式,是采用純的java程序來計算的,對于大數(shù)據(jù)的日志文件來說,這種方案在處理速度、IO占用、數(shù)據(jù)備份及資源利用率方面都有一定的缺陷;
?
相比之下使用Hadoop完成數(shù)據(jù)存儲和計算有以下的好處:
(1)高可靠性:Hadoop支持對數(shù)據(jù)的多副本備份;
(2)高擴展性:Hadoop是在可用的計算機集簇間分配數(shù)據(jù)并完成計算任務(wù)的,這些集簇可以方便地擴展到數(shù)以千計? ??的節(jié)點中。
(3)高效性:通過分發(fā)數(shù)據(jù),hadoop可以在數(shù)據(jù)所在的節(jié)點上并行地(parallel)處理它們,這使得處理非常的快 ??速。
(4)高容錯性:Hadoop能夠自動保存數(shù)據(jù)的多個副本,并且能夠自動將失敗的任務(wù)重新分配。
(5)高資源利用率:管理員可以根據(jù)當前服務(wù)器的配置,來設(shè)置不同的資源調(diào)度方案(yarn),做到資源利用最大化。
三、數(shù)據(jù)處理流程圖
?
?
四、類目貢獻率案例流程
一、案例業(yè)務(wù)目標:?
統(tǒng)計2014年12月16日?全天,用戶點擊數(shù)top20的商品類別條目
?
二、開發(fā)步驟
?
(1)將2014年12月16日的日志(約16G)上傳到HDFS文件系統(tǒng)的?/input/log_2014-12-16目錄下
?
?
(2)、編寫MapReduce程序清洗數(shù)據(jù)
?
程序邏輯分析:
篩選出日志字段中url包含?id=...的行,該url表示的含義為用戶點擊了某個商品類目為id的條目,程序的目標是只篩選出含有此url的行數(shù)據(jù),對于不包含的行將舍棄。?清洗后的數(shù)據(jù)存放在HDFS的???/output/cleanItem_2014_12_16目錄下(清洗后的數(shù)據(jù)約為140MB)
?
?
?
?
(3)、將清洗后的數(shù)據(jù)映射到Hive表中
?
進入hive的client端,建立一個外部分區(qū)表mmb_ordercontribute,這個表的字段與日志的字段一一對應(yīng),但會多一個data的分區(qū)字段,這相當于Mysql中的索引,當按照日期查詢時,效率會高,以下是在hive中,mmb_ordercontribute的建表語句:
?
?
如圖所示,表的映射路徑location指向了清洗后的數(shù)據(jù)目錄
?
(4)操作hive表數(shù)據(jù)
?
????數(shù)據(jù)經(jīng)過映射后,就可以像mysql等數(shù)據(jù)庫一樣通過sql語句的形式來處理表數(shù)據(jù)了,比如:
統(tǒng)計當天所有用戶訪問條目的總次數(shù):
?
?
????統(tǒng)計的結(jié)果為:904423
雖然是一個類似mysql的查詢語句,但是處理的流程和mysql是天差地別的,hive會將這條語句解析成一個MapReduce程序進行統(tǒng)計,如圖所示,hive處理完這個查詢cup使用的總時間為6分鐘左右,而分配到邏輯cpu上,實際使用的時間為28.5秒,如果去除mapreduce的解析和準備工作,mapreduce的執(zhí)行時間是非常少的。
但hive并不是所有的sql語句都被映射成mapreduce程序,唯一的例外(不配置的話)就是:SELECT?*?FROM??table_name?LIMIT;因為這只是在截取表的前幾條數(shù)據(jù)而已;
?
?
(5)使用Hive處理清洗數(shù)據(jù)并導(dǎo)出到臨時表
?
真正需要的數(shù)據(jù)將在此步得出,即:統(tǒng)計出top20的用戶點擊類目,將統(tǒng)計出的數(shù)據(jù)作為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;
?
導(dǎo)出后的表item_20141216?存放在hive的默認數(shù)據(jù)倉庫下:
?
?
注:每行數(shù)據(jù)其實由兩部分組成,行號和數(shù)量,看著像一個數(shù)字是因為hive表字段的分隔符不是空格或者tab鍵,而是?\001
?
?
?
(6)使用sqoop將臨時表數(shù)據(jù)導(dǎo)出到mysql對應(yīng)的表中
在mysql中創(chuàng)建與item_20141216對應(yīng)的表
?
CREATE?TABLE?`item_contribute`?(
??`itemId`?varchar(11)?default?NULL?COMMENT?'條目id',
??`nums`?int(11)?default?NULL?COMMENT?'出現(xiàn)的次數(shù)'
)?ENGINE=MyISAM?DEFAULT?CHARSET=utf8;
?
進入sqoop客戶端執(zhí)行一下命令輸入連接信息:?
?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表中的數(shù)據(jù)被填充:?
?
?
?
(7)接下來就可以利用java程序?qū)?shù)據(jù)組織成報表進行展示了!
?
?
總結(jié)
以上是生活随笔為你收集整理的hadoop2.20+hive+sqoop+mysql数据处理案例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop推测执行(以空间换取时间)
- 下一篇: 2014工作总结