ON
EMR活用事例
〜3日で出来たレコメンデーション〜
#singtacks
SHIN Takeuchi
BIZREACH Inc. - Co-Founder/CTO
LUXA Inc. – Co-Founder/CTO
Lei Hau’oli Co., Ltd. – Founder/CEO
プロフィール
• 竹内 真(SHIN Takeuchi)
– 所属企業
• 株式会社レイハウオリ 代表取締役CEO
• 株式会社ビズリーチ 取締役CTO
• 株式会社ルクサ CTO
– 立ち上げ&運営サービス
• 2009年04月 ビズリーチ
• 2009年10月 ドラゴンQ
• 2010年08月 ルクサ
• 2012年10月 RegionUP
• 2013年05月 codebreak;
• 今後も新サービスが続々登場の予感。。。
#singtacks supported by2
Elastic MapReduce(EMR)とは?
• 分散処理が簡単に出来るウェブサービス
– とりあえず細かいことは抜きにして
• 大量の計算をズバっと短時間でやりたい時に使える
– レコメンデーション、データマイニングなど?
• クラウドなので、計算する時だけインスタンス立ち上げOK
– 常設しておくことを考えると、とってもお得
#singtacks supported by3
ビズリーチについて
• ビズリーチはハイクラス向け会員制転職サイト
www.bizreach.jp
– 特徴
・求職者も有料
・年収1,000万円超え求人
が数千件
・ヘッドハンターと採用企業
が混在してスカウト可能
#singtacks supported by4
ビズリーチのビジネスモデル
• ビジネスモデル
– 求職者が求人への応募など、アクションを起こすために有料会
員になる必要がある(4,980円/月)
– ヘッドハンターがビズリーチ会員を転職成功させた場合、決定
年収を元に算出した利用料をいただく
– 採用企業がビズリーチ会員を採用した場合、及びビズリーチ自
体をご利用いただく場合に利用料をいただく
➡応募やスカウトが増えれば増えるほど、
売上が上がる仕組み
#singtacks supported by5
レコメンデーション機能を入れよう
• 応募増加施策
– Amazon(本体)さんのように「この求人を見た人は、
こんな求人もチェックしています」をやってみよう
• 過去の統計からも「1人あたりの応募数が一定数を超えると、転職
決定率が劇的に上がる」傾向がある
• 求人閲覧の重みを「1」、応募を「10」、書類通過を「100」とし
て、ユーザ行動ベースでレコメンドしてみよう
• 何はともあれやってみることが肝心(ベンチャー精神)
#singtacks supported by6
実装方式
#singtacks supported by7
日次バッチ処理で実装
0) 予めS3にApache Mahoutのjar(ライブラリ)をアップロードしておく
1) RDBから行動履歴を抽出してCSVファイルを作成(S3へアップロード)
実装方式(続き)
#singtacks supported by8
日次バッチ処理で実装
2) バッチ処理でEMRのインスタンスを起動(2台)
Master – 1台
Slave – 1台
3) 起動したEMR上で計算処理を実行(Mahoutのmain関数実行)
実装方式(続き)
#singtacks supported by9
日次バッチ処理で実装
4) EMR上で生成した結果セット(2次元配列)をMongoDBへインポート
構成概要
#singtacks supported by10
Internet
solr1
solr2
Internet
mem
cached
solr-
nginx
mongosolr1
solr2
1系0系
batch
EMR
Code(EMRの起動前準備)
#singtacks supported by11
AWSCredentials credentials =
new BasicAWSCredentials(
awsConf.getAccessKey(),
awsConf.getSecretKey());
AmazonElasticMapReduceClient emrClient =
new AmazonElasticMapReduceClient(
credentials,
createClientConfiguration());
Code(実行パラメータ作成)
#singtacks supported by12
List<String> args = new ArrayList<String>();
args.add("-Dmapred.input.dir=s3n://.../.../”);
args.add("-Dmapred.output.dir=s3n://.../.../”);
args.add("--maxSimilaritiesPerItem");
args.add("10");
args.add("--similarityClassname");
args.add(”ALGORITHM-NAME”);
args.add("--booleanData");
args.add("false");
Code(起動&実行)
#singtacks supported by13
RunJobFlowRequest request = new RunJobFlowRequest()
.withName(param.getJobFlowName())
.withSteps(
new StepConfig().withName(“")
.withActionOnFailure(ActionOnFailure.TERMINATE_JOB_FLOW)
.withHadoopJarStep(new StepFactory().newEnableDebuggingStep()),
new StepConfig().withName(“")
.withActionOnFailure(ActionOnFailure.TERMINATE_JOB_FLOW)
.withHadoopJarStep(new HadoopJarStepConfig().withJar(“”)
.withMainClass(param.getMainClassName())
.withArgs(param.getArgs())))
.withInstances(
new JobFlowInstancesConfig().withPlacement(new PlacementType(“”))
.withInstanceCount(2)
.withMasterInstanceType(“LARGE”)
.withSlaveInstanceType(“LARGE”)
.withKeepJobFlowAliveWhenNoSteps(false)
.withHadoopVersion(emrConf.getHadoopVersion()))
.withAmiVersion(emrConf.getAmiVersion()).withLogUri(“s3n://.../”);
RunJobFlowResult runJobFlow = client.runJobFlow(request);
結果
#singtacks supported by14
出来ました
実際の効果と考察
• 効果
• 実装容易性
– バッチからのEMRインスタンスの起動及び処理実装が簡
単だった(Javaだから?)
• レコメンデーションや分散処理がHadoopの知識がほぼ無くても
簡易的に実装出来るのは、導入ハードルが低く、気軽な気持ち
でトライできる
• 低コスト
– large x 2 instances x 1h/daily x 30days = 約$21
(オンデマンドインスタンス / 東京)
#singtacks supported by15
了
#singtacks supported by16
ご清聴ありがとうございました

ビズリーチにおけるEMR(AWS)活用事例