SlideShare a Scribd company logo
1 of 16
Hadoop with Ruby
- 僕がPythonを選んだ理由
実際は
「Kawasaki.rbのきっかけとなった
“Rubyのハッシュが遅かった事例”の紹介」
- NKT77
<B,1>
<C,1>
<E,1>
MapReduce with Hadoop
• WordCountの例
mapper1
mapper2
mapperN
...
<単語,頻度>
<A,1>
<C,1>
<D,1>
<C,1>
<D,1>
<E,1>
<A,1>
<B,1>
<C,1>
<C,1>
<C,1>
<D,1>
<D,1>
<E,1>
<A,1>
<B,1>
<C,3>
<D,2>
<E,1>
reducer
Map Shuffle Reduce
<B,1>
<C,1>
<E,1>
MapReduce with Hadoop
• WordCountの例
mapper1
mapper2
mapperN
...
<単語,頻度>
<A,1>
<C,1>
<D,1>
<C,1>
<D,1>
<E,1>
<A,1>
<B,1>
<C,1>
<C,1>
<C,1>
<D,1>
<D,1>
<E,1>
<A,1>
<B,1>
<C,3>
<D,2>
<E,1>
reducer
Map Shuffle Reduce
超大規模なデータも
HDFS上に展開すること
でマシンを増やして
スケールアウト
超大規模なデータも
HDFS上に展開すること
でマシンを増やして
スケールアウト
超大規模なデータも
HDFS上に展開すること
でマシンを増やして
スケールアウト
超大規模なデータも
MapReduceで処理する
ことでマシンを増やして
スケールアウト
Hadoop Streaming
Hadoop Streamingの仕組みを使うと、標準入出力に対応する
任意の言語でMap/Reduceを書くことができる
• WordCountの例
#!/usr/bin/env ruby
$stdin.each do |line|
line.strip.split(" ").each do |w|
puts "#{w}¥t1"
end
end
line = $stdin.gets
w, f = line.strip.split("¥t")
w_prev = w
f_sum = f.to_i
$stdin.each do |line|
w, f = line.strip.split("¥t")
if w == w_prev
f_sum += f.to_i
else
puts "#{w_prev} #{f_sum}"
w_prev = w
f_sum = f.to_i
end
end
puts "#{w_prev} #{f_sum}"
A B C D
A C B E
A E
Mapper
Reducer
A 1
A 1
A 1
B 1
B 1
C 1
C 1
D 1
E 1
E 1
A 3
B 2
C 2
D 1
E 2
Hadoop Streaming
Hadoop Streamingの仕組みを使うと、標準入出力に対応する
任意の言語でMap/Reduceを書くことができる
• WordCountの例
#!/usr/bin/env ruby
$stdin.each do |line|
line.strip.split(" ").each do |w|
puts "#{w}¥t1"
end
end
line = $stdin.gets
w, f = line.strip.split("¥t")
w_prev = w
f_sum = f.to_i
$stdin.each do |line|
w, f = line.strip.split("¥t")
if w == w_prev
f_sum += f.to_i
else
puts "#{w_prev} #{f_sum}"
w_prev = w
f_sum = f.to_i
end
end
puts "#{w_prev} #{f_sum}"
A B C D
A C B E
A E
Mapper
Reducer
A 1
A 1
A 1
B 1
B 1
C 1
C 1
D 1
E 1
E 1
A 3
B 2
C 2
D 1
E 2
Amazon Web Serviceの
ElasticMapReduceのサービスを利用して
簡単にHadoop Streamingが使える !
→Rubyで大規模データ処理!
当然こんなちょっとした処理も可能
• 大規模データのIDのマッピング
商品1 ID1
商品2 ID2
...
商品100万 ID100万
def load_idmap(idmapfile)
idmap = {}
puts idmapfile
open(idmapfile).each do |line|
rkey, rval = line.strip.split(" ")
idmap[rkey] = rval
end
idmap
end
idmap = load_idmap("idmap.dat")
$stdin.each do |line|
line.strip.split(" ").each do |w|
puts "#{idmap[w]}¥t1"
end
end
Mapper
A B C D
A C B E
A E
1 2 3 4
1 3 2 5
1 5
...???
• 大規模データのIDのマッピング
AWSのEMRで実際に実験
変換するID列: 8文字ID列~50億アイテム(LZO形式で26G)
マッピング:~100万組
前頁のMapperで変換を実行し、
念のためにPython実装でも実行
Ruby(1.9.3) Python(2.7.3)
実行時間 23.2時間 2.0時間
Rubyの連想配列について
• Rubyは大きな連想配列を持たせると遅くなる(2013年1月)
配列の生成時間:
理想的には線形になるはず、、
50万行 100万行 300万行
秒
マッピングの連想配列サイズ
Rubyの連想配列について
• Rubyは大きな連想配列を持たせると遅くなる(2013年1月)
配列の参照時間:
理想的にはO(1)になるはず、、
秒
マッピングの連想配列サイズ
1万行 10万行 100万行 300万行
RubyのHashについての参考情報
・ハッシュの速度低下についての報告はいくつかある
Inserting hash value slows down as table gets larger
http://www.ruby-forum.com/topic/1301386
遅いのはGabage Collectのせい?
http://www.platanus.cz/blog/working-with-huge-hashes-in-ruby
Google_hashを使うと速くなる?
https://github.com/rdp/google_hash/blob/master/README
・ハッシュアルゴリズム解説の例
Ruby
http://d.hatena.ne.jp/zariganitosh/20090716/1247709137
チェイン法
Python
http://www.laurentluce.com/posts/python-dictionary-implementation/
Open Addressing法
RubyのHashについての参考情報
・ハッシュの速度低下についての報告はいくつかある
Inserting hash value slows down as table gets larger
http://www.ruby-forum.com/topic/1301386
遅いのはGabage Collectのせい?
http://www.platanus.cz/blog/working-with-huge-hashes-in-ruby
Google_hashを使うと速くなる?
https://github.com/rdp/google_hash/blob/master/README
・ハッシュアルゴリズム解説の例
Ruby
http://d.hatena.ne.jp/zariganitosh/20090716/1247709137
チェイン法
Python
http://www.laurentluce.com/posts/python-dictionary-implementation/
Open Addressing法
専門家に報告
とりあえず実験
保留
1億要素のインサートとルックアップの秒数
Google Hashの効果
○Intの10ケタ文字列をHashに入れるときにIntに変換
python Ruby Ruby
+GoogleHash
insertion 57.19 141.15 46.59
lookup 50.50 63.15 25.23
○要素がIntのとき
python Ruby Ruby
+GoogleHash
insertion 22.53 114.61 47.92
lookup 17.11 43.16 14.06
python Ruby Ruby
+GoogleHash
insertion 44.11 126.09 102.15
lookup 20.13 60.93 47.94
○Intの10ケタの文字列
キーが文字列のときは効果が小さい
EMRのコスト
• 大規模データのIDのマッピング
Ruby(1.9.3) Python(2.7.3)
実行時間 23.2時間 2.0時間
料金 11178円 972円
High Memory Extra Large Instance (m2.xlarge)を使用
6.5 EC2 Compute Units, 10 instances
(0.45$/h + 0.09$/h)*X h*10instances * 90円で計算
AWSのEMRで実際に実験
変換するID列: 8文字ID列~50億アイテム(LZO形式で26G)
マッピング:~100万組
前頁のMapperで変換を実行し、
念のためにPython実装でも実行
EMRのお値段
• 大規模データのIDのマッピング
AWSのEMRで実際に実験
変換するID列: ~50億IDアイテム(LZO形式で26G)
マッピング:~100万組
前頁のMapperで変換を実行し、
念のためにPython実装でも実行
Ruby(1.9.3) Python(2.7.3)
実行時間 23.2時間 2.0時間
料金 11178円 972円
High Memory Extra Large Instance (m2.xlarge)を使用
6.5 EC2 Compute Units, 10 instances
(0.45$/h + 0.09$/h)*X h*10instances * 90円で計算
クラウドコンピューティングでは、
速度がシビアに金額に効いてくるので怖い
まとめ
• 今回はRubyのハッシュの遅延の事例を紹介
• 大規模のクラウドコンピューティングだと普段
気にしていない速度差もコストに効いてくる
• 今回は1.9.3の実験結果、Rubyは常に進化し
ているので常にベンチマークが必要
ありがとうございました!

More Related Content

What's hot

drecomにおけるwinning the metrics battle
drecomにおけるwinning the metrics battledrecomにおけるwinning the metrics battle
drecomにおけるwinning the metrics battle
Mitsuki Kenichi
 
C++のビルド高速化について
C++のビルド高速化についてC++のビルド高速化について
C++のビルド高速化について
AimingStudy
 
PFI Seminar 2012/03/15 カーネルとハッシュの機械学習
PFI Seminar 2012/03/15 カーネルとハッシュの機械学習PFI Seminar 2012/03/15 カーネルとハッシュの機械学習
PFI Seminar 2012/03/15 カーネルとハッシュの機械学習
Preferred Networks
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
MITSUNARI Shigeo
 

What's hot (20)

drecomにおけるwinning the metrics battle
drecomにおけるwinning the metrics battledrecomにおけるwinning the metrics battle
drecomにおけるwinning the metrics battle
 
あまぁいRcpp生活
あまぁいRcpp生活あまぁいRcpp生活
あまぁいRcpp生活
 
Common LispでGPGPU
Common LispでGPGPUCommon LispでGPGPU
Common LispでGPGPU
 
M1 gp
M1 gpM1 gp
M1 gp
 
Rcppのすすめ
RcppのすすめRcppのすすめ
Rcppのすすめ
 
20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo
 
Measurement of Maximum new NAT-sessions per second / How to send packets
Measurement of Maximum new NAT-sessionsper second / How to send packetsMeasurement of Maximum new NAT-sessionsper second / How to send packets
Measurement of Maximum new NAT-sessions per second / How to send packets
 
lsh
lshlsh
lsh
 
サイボウズ・ラボユース成果発表会資料
サイボウズ・ラボユース成果発表会資料サイボウズ・ラボユース成果発表会資料
サイボウズ・ラボユース成果発表会資料
 
C++のビルド高速化について
C++のビルド高速化についてC++のビルド高速化について
C++のビルド高速化について
 
入門機械学習6章
入門機械学習6章入門機械学習6章
入門機械学習6章
 
CuPy解説
CuPy解説CuPy解説
CuPy解説
 
Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Scalable Partial Least Squares Regression on Grammar-Compressed Data MatricesScalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
 
PFI Seminar 2012/03/15 カーネルとハッシュの機械学習
PFI Seminar 2012/03/15 カーネルとハッシュの機械学習PFI Seminar 2012/03/15 カーネルとハッシュの機械学習
PFI Seminar 2012/03/15 カーネルとハッシュの機械学習
 
120414 foss4g nagoya_presentation2
120414 foss4g nagoya_presentation2120414 foss4g nagoya_presentation2
120414 foss4g nagoya_presentation2
 
Slide dist
Slide distSlide dist
Slide dist
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたWASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみた
 
DP特集
DP特集DP特集
DP特集
 
20211112_jpugcon_gpu_and_arrow
20211112_jpugcon_gpu_and_arrow20211112_jpugcon_gpu_and_arrow
20211112_jpugcon_gpu_and_arrow
 

Similar to 20130626 kawasaki.rb NKT77

実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalaz
Tomoharu ASAMI
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
Masahiro Nagano
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
Naoya Ito
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
Tomoharu ASAMI
 

Similar to 20130626 kawasaki.rb NKT77 (20)

Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
Kubernetes on Alibaba Cloud
Kubernetes on Alibaba CloudKubernetes on Alibaba Cloud
Kubernetes on Alibaba Cloud
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
 
1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ
 
実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalaz
 
DynamoDB MyNA・JPUG合同DB勉強会 in 東京
DynamoDB   MyNA・JPUG合同DB勉強会 in 東京DynamoDB   MyNA・JPUG合同DB勉強会 in 東京
DynamoDB MyNA・JPUG合同DB勉強会 in 東京
 
HashiCorpのNomadを使ったコンテナのスケジューリング手法
HashiCorpのNomadを使ったコンテナのスケジューリング手法HashiCorpのNomadを使ったコンテナのスケジューリング手法
HashiCorpのNomadを使ったコンテナのスケジューリング手法
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門
 
Architecting on Alibaba Cloud - Fundamentals - 2018
Architecting on Alibaba Cloud - Fundamentals - 2018Architecting on Alibaba Cloud - Fundamentals - 2018
Architecting on Alibaba Cloud - Fundamentals - 2018
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
 
AWS Black Belt Online Seminar 2017 Amazon DynamoDB
AWS Black Belt Online Seminar 2017 Amazon DynamoDB AWS Black Belt Online Seminar 2017 Amazon DynamoDB
AWS Black Belt Online Seminar 2017 Amazon DynamoDB
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
 
SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料
 
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
 
MapReduce/YARNの仕組みを知る
MapReduce/YARNの仕組みを知るMapReduce/YARNの仕組みを知る
MapReduce/YARNの仕組みを知る
 
Oedo Ruby Conference 04: Ruby会議でSQLの話をするのは間違っているだろうか
Oedo Ruby Conference 04: Ruby会議でSQLの話をするのは間違っているだろうかOedo Ruby Conference 04: Ruby会議でSQLの話をするのは間違っているだろうか
Oedo Ruby Conference 04: Ruby会議でSQLの話をするのは間違っているだろうか
 
Hacking Ruby with Python
Hacking Ruby with PythonHacking Ruby with Python
Hacking Ruby with Python
 

20130626 kawasaki.rb NKT77