2012年10月14日 星期日

借花獻佛Hbase&MapReduce

前言

學了一個新技術誰不會手癢想要試試看這技術到底能做成啥東西?有一天拜神時不小心看到新竹某某晶圓大廠的教育訓練課程ppt, 很興奮得跟著內容一路實作下去, 結果發現裡面缺東缺西的, 甚至有些寫法會有問題(在我的環境上面), 所以小弟又冒著爆肝眼瞎掉髮禿肚子還有球賽沒看完的風險, 慢慢的拼湊出這片地圖, 僅分享給看到這篇網誌的人

PS:如果那一間某某晶圓大廠的人看到了, 覺得不爽我把你們的東西寫在blog上面請跟我說一聲, 我馬上拿掉

此時的我是邊看lamigo對統一的GAME2邊寫blog, 如果有點語無倫次請多多見諒........XD

環境

這篇一樣
我的版本搭配是hadoop-1.0.3+hbase-0.94.1

載點

這一個連結裡面有我整理的code以及要用的txt檔(先假裝這是log檔)
code.tar.gz解壓縮後的mystore裡面有三個java檔(CreateTable.java, StoreCount.java, StoreSum.java)
兩個txt檔(info.txt, sales.txt)


解釋一下這三個class是作啥事情,
CreateTable是在Hbase中新增一個store的table,並且讀取本機的檔案(info.txt)把商店名稱寫入Detail:Name,商店的位置寫入Detail:Locate, 賣的產品以及價格寫入Products:P1 Products:P2 Products:P3 Products:P4

StoreCount是把消費紀錄(sales.txt)從HDFS中寫入Turnover中,會對應到商店跟產品代號 

StoreSum是把每一間店的銷售紀錄做加總寫入Sum中

實作

這篇的最終目標是利用hbase java api逐步在Hbase中建立一個商店銷售紀錄的table,以下是最後會產生的圖(hbase shell不是長成這樣的)
table:store
Row\key Detail Products Turnover
Name Locate P1 P2 P3 P4 P1 P2 P3 P4 Sum
T01 GunLong 01 20 30 40 50 1 1 1
90
T02 Esing 02 50


2


100
T03 SunDon 03 40 30

1 1

70
T04 StarBucks 04 50 50 20
2 1 1
170

terminal中是像下圖這樣的

由於我在eclipse中執行起來會有問題, 所以我都是在eclipse中寫完後把code打包成jar檔, 不喜歡這樣做的人請慢走, 不送了
並免篇幅過長我也不把code貼在網誌中了,只用指令執行jar檔以及秀出hbase shell執行後的結果 

[步驟一]

code.tar.gz下載後放在家目錄下面解壓縮, 我習慣先在code資料夾中mkdir src, 我會把compile後的.class都放在src中
(這些都是我自己的習慣, 不是必要的操作, 可以依照個人習慣來執行)


再來把.java檔compile成.class檔在包成一個jar檔, 我是覺得這樣比較方便啦, 因為在用hadoop jar執行時只要改一個帶有main method的class名稱就好了

指令如下:
javac -classpath hadoop-1.0.3/hadoop-core-1.0.3.jar:hadoop-1.0.3/lib/hbase-0.94.1.jar -d code/src code/mystore/CreateTable.java

javac -classpath hadoop-1.0.3/hadoop-core-1.0.3.jar:hadoop-1.0.3/lib/hbase-0.94.1.jar -d code/src code/mystore/StoreCount.java

javac -classpath hadoop-1.0.3/hadoop-core-1.0.3.jar:hadoop-1.0.3/lib/hbase-0.94.1.jar -d code/src code/mystore/StoreSum.java

jar -cvf code/mystore.jar -C code/src .


此時你的code底下就產生了一個mystore.jar


[步驟二]

這一個步驟我要建立一個table名叫"store"並且讀取存放在本機的txt檔(info.txt)寫入hbase
指令請下 hadoop jar code/mystore.jar CreateTable store code/info.txt
執行完後你會看到terminal中跟你說"create table store ok"



這時到hbase中用scan 'store'看看
(實況轉播:幹 高國慶給我在八局下扛出兩分炮, 你娘的哩)

都照著info.txt寫進去了, 此時的table就是像以下這樣
table:store
Row\key Detail Products Turnover
Name Locate P1 P2 P3 P4 P1 P2 P3 P4 Sum
T01 GunLong 01 20 30 40 50




T02 Esing 02 50







T03 SunDon 03 40 30






T04 StarBucks 04 50 50 20








[步驟三]

這一個步驟我要從HDFS中讀取寫進去store
先把sales.txt傳到HDFS中, 以下是我自己定的目錄, 可以放在自己喜歡的地方啦

再來執行以下這個指令
hadoop jar code/mystore.jar StoreCount store /hduser/store/input

跑完之後在用scan 'store'來檢查一下


Turnover這一個family column都按照著sales.txt有了value, 這時的table會像下圖這樣
table:store
Row\key Detail Products Turnover
Name Locate P1 P2 P3 P4 P1 P2 P3 P4 Sum
T01 GunLong 01 20 30 40 50 1 1 1

T02 Esing 02 50


2



T03 SunDon 03 40 30

1 1


T04 StarBucks 04 50 50 20
2 1 1


[步驟三]

這一個步驟我要把Turnover:Sum填入消費紀錄的加總, 指令請下hadoop jar code/mystore.jarStoreSum store

執行完後也用scan 'store'檢查看看

可以看看T1的Sum是20*1+30*1+40*1=90 T2的Sum是50*2=100......
此時的 table就像下圖這樣了, 這就是這篇網誌最後的成果了

table:store
Row\key Detail Products Turnover
Name Locate P1 P2 P3 P4 P1 P2 P3 P4 Sum
T01 GunLong 01 20 30 40 50 1 1 1
90
T02 Esing 02 50


2


100
T03 SunDon 03 40 30

1 1

70
T04 StarBucks 04 50 50 20
2 1 1
170

寫到這裡lamigo 6:4 贏了

1 則留言: