SlideShare a Scribd company logo
クラウド時代の 並列分散処理技術  2010/12/22 Ruby ビジネスセミナー ハピルス株式会社 藤川幸一 Twitter: @fujibee
 
アジェンダ 自己紹介 クラウド時代と大量データ なぜ並列分散処理が必要か 未踏プロジェクトについて Hapyrus について まとめ 質疑応答
自己紹介 藤川幸一 ハピルス株式会社代表 学生時代から IT ベンチャーに参加 Yahoo! JAPAN ->  テクノロジックアート -> シンプレクス・テクノロジー -> シリウステクノロジーズ -> 独立 未踏人材育成事業クリエータ 現在は Hadoop を Web サービスとして使うプロダクトを開発中
クラウド時代と大量データ
クラウド時代とは 「クラウド」がバズワードの時代は終わった? サービス側から見たクラウド システムの構成要素としてのクラウド
クラウドと大量データ クラウドの向こう側には・・・ クラウドは必然的に集約に向かう 大量データ時代は必然
並列分散処理技術
大量データを処理するには 例えば 400TB( テラバイト・メガバイトの 100 万倍 ) 1台で処理すると・・・ 読み込みだけで 100 日くらいかかる! 400TB ÷ 50MB/sec ≒ 80,000sec ≒ 2,000 時間 ≒  92 日 並列分散の仕組みが必要 例えば: ファイルシステム・処理技術
スケールアップとスケールアウト スケールアップ 1台の性能を向上させる 性能 価格 ある程度まで行くと 価格と性能が比例しない
スケールアップとスケールアウト スケールアウト 複数台を並行処理させて性能を向上させる 性能 価格 ( 台数 ) 価格と性能は (ある程度まで)比例する
並列分散処理は難しい ボトルネックが発生 データのやり取り 結果集計 処理を分散させる仕組み 耐障害性 プログラミングが難しい 資源の効率的な利用 引用:  Think IT http://thinkit.co.jp/story/2010/06/11/1608
並列分散処理フレームワーク MapReduce Google が開発->論文で公開 開発者は Map と Reduce と呼ばれるプログラムを書く その他の分散に必要な仕組みはフレームワークでカバー
Hadoop Google 論文から作られたオープンソースクローン 分散ファイルシステム HDFS を含む ジョブのスケジューリング 部分的にサーバが機能しなくても処理継続できる仕組み などなど
分散データストア技術 スケールアウト可能なデータ格納機構 分散キーバリューストア Memcached Cassandra (Facebook) Hbase (Hadoop) Redis (github) 国産のものも Kumofs Roma ( 楽天 ) TokyoCabinet
Ruby による並列分散処理技術 楽天技術研究所 fairy Roma Hadoop を Ruby で利用する Hadoop Streaming Hadoop Papyrus ( 後述 )
未踏プロジェクトについて
IPA 未踏人材育成事業 独立行政法人 情報処理推進機構  = IPA 未踏人材育成事業 もともとは「未踏ソフトウェア」と呼ばれる 有望なプロジェクトを PM が採択し開発・成果発表を行う 2009 年上期に採択される
私のプロジェクト MapReduce 汎用化のための DSL 基盤・実行基盤の開発 もっと簡単に Hadoop を使えるようにしたい! Ruby で DSL( ドメイン特化言語 ) を使って 環境を簡単に準備して実行
Hadoop Papyrus Hadoop ジョブを Ruby の DSL で実行できるオープンソースフレームワーク 本来 Hadoop ジョブは Java で記述する Java だと複雑な記述がほんの数行で書ける Hudson 上でジョブを記述 / 実行が可能
Step.1 Java ではなく Ruby で記述
Step.2 Ruby による DSL で MapReduce を シンプルに Map Reduce Job Description Log Analysis DSL
Step.3 Hadoop サーバ構成を容易に利用可能に
package org . apache . hadoop . examples ; import java.io.IOException ; import java.util.StringTokenizer ; import org.apache.hadoop.conf.Configuration ; import org.apache.hadoop.fs.Path ; import org.apache.hadoop.io.IntWritable ; import org.apache.hadoop.io.Text ; import org.apache.hadoop.mapreduce.Job ; import org.apache.hadoop.mapreduce.Mapper ; import org.apache.hadoop.mapreduce.Reducer ; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat ; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat ; import org.apache.hadoop.util.GenericOptionsParser ; public   class   WordCount   { public   static   class   TokenizerMapper   extends Mapper < Object ,  Text ,  Text ,  IntWritable >   { private   final   static  IntWritable one  =   new  IntWritable ( 1 ); private  Text word  =   new  Text (); public   void   map( Object key ,  Text value ,  Context context ) throws  IOException ,  InterruptedException  { StringTokenizer itr  =   new  StringTokenizer ( value . toString ()); while   ( itr . hasMoreTokens ())   { word . set ( itr . nextToken ()); context . write ( word ,  one ); } } } public   static   class   IntSumReducer   extends Reducer < Text ,  IntWritable ,  Text ,  IntWritable >   { private  IntWritable result  =   new  IntWritable (); public   void   reduce( Text key ,  Iterable < IntWritable >  values , Context context )   throws  IOException ,  InterruptedException  { int  sum  =  0 ; for   ( IntWritable val  :  values )   { sum  +=  val . get (); } result . set ( sum ); context . write ( key ,  result ); } } public   static   void   main( String []  args )   throws  Exception  { Configuration conf  =   new  Configuration (); String []  otherArgs  =   new  GenericOptionsParser ( conf ,  args ) . getRemainingArgs (); if   ( otherArgs . length  !=  2 )   { System . err . println ( &quot;Usage: wordcount <in> <out>&quot; ); System . exit ( 2 ); } Job job  =   new  Job ( conf ,  &quot;word count&quot; ); job . setJarByClass ( WordCount . class ); job . setMapperClass ( TokenizerMapper . class ); job . setCombinerClass ( IntSumReducer . class ); job . setReducerClass ( IntSumReducer . class ); job . setOutputKeyClass ( Text . class ); job . setOutputValueClass ( IntWritable . class ); FileInputFormat . addInputPath ( job ,   new  Path ( otherArgs [ 0 ])); FileOutputFormat . setOutputPath ( job ,   new  Path ( otherArgs [ 1 ])); System . exit ( job . waitForCompletion (true)   ?  0  :  1 ); } } 同様な処理が Java では 70 行必要だが、 HadoopPapyrus だと 10 行に! dsl 'LogAnalysis‘ from ‘test/in‘ to ‘test/out’ pattern /([^|:]+)[^:]*/ column_name :link topic &quot;link num&quot;, :label => 'n' do        count_uniq column[:link] end Java Hadoop Papyrus
実際の画面など DEMO
Hapyrus について
Hadoop は敷居が高い 簡単な試行は簡単 でも、ちゃんとしたアプリケーションは難しい 環境構築 アプリケーション開発
Hadoop をサービスとして使う 環境だけではなく、アプリケーション開発も 用意されたスクリプトによってノウハウを手にできる
Hapyrus まもなくベータテスト開始 そのフィードバックをもとに、 2011 年早いうちに公開予定
Sneak Preview DEMO
まとめ クラウド時代は大量データ時代 大量データを処理するには並列分散技術が必要 数々の並列分散処理技術 特に Hadoop について 私の取り組みの紹介 未踏での Ruby x Hadoop Hapyrus
ご清聴ありがとうございました

More Related Content

クラウド時代の並列分散処理技術

Editor's Notes

  1. We are involved the problem. This is the IDC study. In 2009, we have 0.8 Zetta byte digital data. Zetta bytes means million times of Peta bytes, You know, Mega bytes, Giga, Tera, Peta. Exa, Zetta. We are in “Cloud Era”. Data we have to process get bigger and bigger. In 2020, it will grow by 35 zetta bytes, it’s huge! We all should tackle this “Information Explosion” like this.
  2. バズワードは消えていくものだが、クラウドは残る。 ガートナーのハイプサイクル
  3. クラウドの向こう側には、データが集約される かつて、世界に5台のコンピュータがあればいいと IBM 初代社長のトーマス・ワトソン・シニアが言ったといわれる クラウドは向こう側で処理をするということなので、集約するほうが費用対効果が高い。ハード・ソフトとも となると、データはますます集約されて大きくなる
  4. Ruby はインターネットサービス開発と親和性が高い。開発効率や言語としての柔軟性が高い。 Java と Ruby をつなぐ JRuby という技術を用いる。
  5. ドメイン毎に DSL( ドメイン特化言語 ) という形でフレームワーク化し、開発者に MapReduce を意識しない形で処理を書くことができるようにする。 そのフレームワークはオープンソース化していろいろな分野の DSL が開発できるようにする。
  6. Hudson という継続的ビルドツールを Hadoop 処理サーバ環境として利用。その上で DSL が実行できるようにする。