Hadoop/MapReduce とは
Hadoop
● Java で書かれた分散処理フレームワーク
● HDFS 複数サーバにファイルを分散して、一つのファイ
ルのように扱える。
● HDFS 上のファイルより、MapReduce アルゴリズムで
の処理が可能
MapReduce
● Mapper で与えられたデータを "キー,値" に変換する
● Reducer に "キー,値のリスト(値, 値, ...)" が渡される。
Reducer は "キー,値" に集約する
● このロジックで分散できるっ...
「この商品を買った人はこんな商品も買っています」
w/ MapReduce
MapReduce アルゴリズムのイメージを掴むためのものです。
機械学習の協調フィルタリング Collaborative Filtering 等とは異なります。
UserID, ItemID
--------------------------
1, 10001
1, 10002
3, 10001
1, 10003
2, 10002
1, 10005
2, 10004
3, 10005
3, 10002...
--------------------------
サーバA
1, 10001:10002
3, 10001
--------------------------
サーバB
1, 10003:10005
2, 10002
----------...
#!/usr/bin/env ruby
results = {}
while line = STDIN.gets
vals = line.strip.split(",")
results[vals[0]] = [] unless results...
#!/usr/bin/env ruby
lastkey = ""
items = []
while line = STDIN.gets
vals = line.strip.split("t")
if lastkey != "" && vals[...
--------------------------
サーバA
10001:10002, 1
10001:10003, 1
10001:10005, 1
10002:10001, 1
10002:10003, 1
10002:10005, 1
...
あとは抽出データをSQLデータベースなどに入れて活用する。関連アイテムの同
時購入数の多いものを類似アイテムとする。
-- "10001:10002, 2"
INSERT INTO recommend_items
(target_item, s...
--------------------------
サーバA
10001,10002-2
10001,10003-1
10001,10005-2
10002,10001-2
10002,10003-1
--------------------...
要するに
GROUP BY
の繰り返し
● Mapper で GROUP のキーを作る
● Reducer で集計結果を得る
Upcoming SlideShare
Loading in...5
×

Hadoop / MapReduce とは

3,621

Published on

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,621
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Hadoop / MapReduce とは

  1. 1. Hadoop/MapReduce とは
  2. 2. Hadoop ● Java で書かれた分散処理フレームワーク ● HDFS 複数サーバにファイルを分散して、一つのファイ ルのように扱える。 ● HDFS 上のファイルより、MapReduce アルゴリズムで の処理が可能
  3. 3. MapReduce ● Mapper で与えられたデータを "キー,値" に変換する ● Reducer に "キー,値のリスト(値, 値, ...)" が渡される。 Reducer は "キー,値" に集約する ● このロジックで分散できるっていう話 ● Hadoop Streaming というツールで、好みの言語で MapReduce できる。 WordCount サンプルがやってることは ● Mapper で与えられたアクセスログ行から "単語, 1" の行を書き出す。 ● Reducer で "単語,(1,1,1,...)" から "単語,単語数" に集計して書き出す
  4. 4. 「この商品を買った人はこんな商品も買っています」 w/ MapReduce MapReduce アルゴリズムのイメージを掴むためのものです。 機械学習の協調フィルタリング Collaborative Filtering 等とは異なります。
  5. 5. UserID, ItemID -------------------------- 1, 10001 1, 10002 3, 10001 1, 10003 2, 10002 1, 10005 2, 10004 3, 10005 3, 10002 -------------------------- 以下のような購入履歴テキストデータから --- 区切りの単位で Mapper に 分散されるとする。 -------------------------- サーバA 1, 10001 1, 10002 3, 10001 -------------------------- サーバB 1, 10003 2, 10002 1, 10005 -------------------------- サーバC 2, 10004 3, 10005 3, 10002 --------------------------
  6. 6. -------------------------- サーバA 1, 10001:10002 3, 10001 -------------------------- サーバB 1, 10003:10005 2, 10002 -------------------------- サーバC 2, 10004 3, 10002:10005 -------------------------- Mapper Reducer 1, 10001:10002:10003:10005 2, 10002:10004 3, 10001:10002:10005 key = ユーザID value = (アイテムID):(アイテムID):... ユーザIDをキーにしてアイテムID文字列を結合する。 要するに GROUP BY ユーザID
  7. 7. #!/usr/bin/env ruby results = {} while line = STDIN.gets vals = line.strip.split(",") results[vals[0]] = [] unless results.key?(vals[0]) results[vals[0]] << vals[1] end results.each do |key, value| str = value.join(":") print "#{key}t#{str}n" end Mapper
  8. 8. #!/usr/bin/env ruby lastkey = "" items = [] while line = STDIN.gets vals = line.strip.split("t") if lastkey != "" && vals[0] != lastkey value = items.join(":") print "#{lastkey}t#{value}n" items = [] end vals[1].split(":").each do |item| items << item unless items.include?(item) end lastkey = vals[0] end if lastkey != "" value = items.join(":") print "#{lastkey}t#{value}n" end Reducer
  9. 9. -------------------------- サーバA 10001:10002, 1 10001:10003, 1 10001:10005, 1 10002:10001, 1 10002:10003, 1 10002:10005, 1 10003:10001, 1 10003:10002, 1 10003:10005, 1 10005:10001, 1 10005:10002, 1 10005:10003, 1 -------------------------- サーバB 10002:10004,1 10004:10002,1 -------------------------- サーバC 10001:10002, 1 10001:10005, 1 10002:10001, 1 10002:10005, 1 10005:10001, 1 10005:10002, 1 -------------------------- Mapper Reducer 関連する2アイテムIDをキーとして同時購入をカウント 10001:10002, 2 10001:10003, 1 10001:10005, 2 10002:10001, 2 10002:10003, 1 10002:10004, 1 10002:10005, 2 10003:10001, 1 10003:10002, 1 10003:10004, 1 10003:10005, 1 10004:10002, 1 10005:10001, 2 10005:10002, 2 10005:10003, 1 key = (アイテムID):(関連アイテムID) value = 関連アイテム購入数 要するに GROUP BY (アイテムID):(関連アイテムID)
  10. 10. あとは抽出データをSQLデータベースなどに入れて活用する。関連アイテムの同 時購入数の多いものを類似アイテムとする。 -- "10001:10002, 2" INSERT INTO recommend_items (target_item, similar_item, similarity) VALUES ("10001", "10002", 2); --"10001:10003, 1" INSERT INTO recommend_items (target_item, similar_item, similarity) VALUES ("10001", "10003", 1); .... SELECT similar_item FROM recommed_items WHERE target_item = "10001" ORDER BY similarity DESC LIMIT 10;
  11. 11. -------------------------- サーバA 10001,10002-2 10001,10003-1 10001,10005-2 10002,10001-2 10002,10003-1 -------------------------- サーバB 10002,10004-1 10002,10005-2 10003,10001-1 10003,10002-1 10003,10004-1 -------------------------- サーバC 10003,10005-1 10004,10002-1 10005,10001-2 10005,10002-2 10005,10003-1 -------------------------- Mapper Reducer アイテムIDをキーでグループ化し、Reducer で条件に合わな い関連アイテムIDを除外することもできる。2未満は含めない 場合の例 10001,10002-2:10005-2:10001-2 10002,10001-2:10005-2 10005:10001-2 key = アイテムID value = (関連アイテムID)-(同時購入数):.... 要するに GROUP BY (アイテムID) HAVING (同時購入数) > 1 Hadoop の稼働コストのほうがかかるので、集計が終わったら Hadoop 外でやるほうがよい。次の Job に引き継ぐためのデータであったり、不要なゴミデータばかりでデータ量が大きすぎる場合には有効。
  12. 12. 要するに GROUP BY の繰り返し ● Mapper で GROUP のキーを作る ● Reducer で集計結果を得る

×