基幹業務もhadoop(emr)で!!のその後

64
基幹業務もHadoop(EMR)で!! BigData-JAWS 勉強会#4 2016/12/12 Future Architect Inc, Keigo Suda のその後

Upload: keigo-suda

Post on 16-Apr-2017

617 views

Category:

Internet


0 download

TRANSCRIPT

Page 1: 基幹業務もHadoop(EMR)で!!のその後

基幹業務もHadoop(EMR)で!!BigData-JAWS 勉強会#4

2016/12/12

Future Architect Inc,Keigo Suda

のその後

Page 2: 基幹業務もHadoop(EMR)で!!のその後

いかに本番利⽤に堪えられるようになったかの軌跡ü どういった課題があったかü どのように対応したか

実際に開発が終わったその後の話

Page 3: 基幹業務もHadoop(EMR)で!!のその後

* 2012年新卒⼊社(今年5年⽬ orz)* Technology Innovation Group スペシャリスト* 最近の専⾨ -> ビッグデータ領域(インフラ〜アプリ)* 最近はもっぱらKafkaとストリーム処理エンジンの諸々

須⽥桂伍 (すだ けいご)

Page 4: 基幹業務もHadoop(EMR)で!!のその後

宣伝l 最近やっているIoTためのプラットフォーム構築の話l Apache Kafka on AWS

Page 5: 基幹業務もHadoop(EMR)で!!のその後

もくじl EMRとローソンl 性能テストとチューニングl まとめ

Page 6: 基幹業務もHadoop(EMR)で!!のその後
Page 7: 基幹業務もHadoop(EMR)で!!のその後

http://www.slideshare.net/keigosuda/hadoop-hadoop-hive

設計~開発時の話

Page 8: 基幹業務もHadoop(EMR)で!!のその後

https://future-architect.github.io/articles/20161005/

開発後の話

Page 9: 基幹業務もHadoop(EMR)で!!のその後

EMRとローソン

Page 10: 基幹業務もHadoop(EMR)で!!のその後

店舗発注業務のセンター化

発注時に利⽤するマスタ作成をセンタ集約ü 店舗毎に⾏われていたマスタデータ作成処理を集約ü 店舗からはAPI経由でマスタデータを参照

これに表⽰される各種データを作成

Page 11: 基幹業務もHadoop(EMR)で!!のその後

店舗発注業務の裏側

ローソン全業務で利⽤されるマスタデータを⽇次バッチで最新化

1

最新化された全業務マスタデータの更新差分を各店舗へファイル連携

店舗へ更新分データのファイル連携2

本部センター ファイル連携基盤

ストアコンピュータ

データ反映

発注端末商品を発注

しますね更新データ全業務マスタデータ

⽇次バッチ処理最新化

1 2 3 4

全業務マスタデータの最新化処理連携されたファイルデータを各店舗にあるストコン内のDBへ反映する。

3

最新化されたマスタデータをもとに発注業務を実施発注時の商品データ参照4

更新分データのDB反映処理

Page 12: 基幹業務もHadoop(EMR)で!!のその後

店舗発注業務の裏側

ローソン全業務で利⽤されるマスタデータを⽇次バッチで最新化

1

最新化された全業務マスタデータの更新差分を各店舗へファイル連携

店舗へ更新分データのファイル連携2

本部センター ファイル連携基盤

ストアコンピュータ

データ反映

発注端末商品を発注

しますね更新データ全業務マスタデータ

⽇次バッチ処理最新化

1 2 3 4

全業務マスタデータの最新化処理連携されたファイルデータを各店舗にあるストコン内のDBへ反映する。

3

最新化されたマスタデータをもとに発注業務を実施発注時の商品データ参照4

更新分データのDB反映処理

これまでは処理負荷を各店舗に分散していたイメージ

Page 13: 基幹業務もHadoop(EMR)で!!のその後

店舗DB

発注業務 データ参照 加⼯処理

加⼯処理取込処理取込処理

発注端末

発注端末

発注端末

発注端末

発注端末

発注端末

発注端末

APIAPI API

APIAPI

API

API

全店舗分の発注業務に利⽤するマスタデータをバッチ処理(⽇次)で作成

全業務マスタDBから店舗毎に必要なマスタデータの更新差分をファイルで連携

これまで店舗毎に配信されていた全店舗分の更新差分ファイルを連携

受信⽤DB 公開⽤DB

1. 全業務マスタDBから各店舗へ更新差分ファイルを配信2. 店舗毎にDBへ差分反映後、発注利⽤マスタデータを作成3. 作成されたマスタデータは発注業務時に発注端末から参照

1. 全業務マスタDBから全店舗分の更新差分ファイルを配信2. 受信⽤DBへ差分反映後、全店舗分の発注利⽤マスタデータを作成3. 作成されたマスタデータはREST APIで公開し、発注端末より参照

データ参照

発注業務

Before After機能のセンター集約

Page 14: 基幹業務もHadoop(EMR)で!!のその後

しかしその壁も⾼い・・・

店舗数増加への考慮 ピーク時の処理多重度

限られたバッチウィンドウ膨⼤なレコード件数

Page 15: 基幹業務もHadoop(EMR)で!!のその後

12,000

Page 16: 基幹業務もHadoop(EMR)で!!のその後

16

20%

80%

全店舗分の処理ピークが重なる

Page 17: 基幹業務もHadoop(EMR)で!!のその後

17

発注商品マスタ〜10億レコード

PLUマスタ〜7億レコード

商品マスタ〜5億

約80マスタテーブル(数⼗億レコード)

Page 18: 基幹業務もHadoop(EMR)で!!のその後

EMRでまとめて処理しよう!

エコシステム含めた多様な処理オプション

スケールアウト&スケールアップの戦略が柔軟* クラスタ台数、EC2インスタンスタイプ、タスクグループと様々な組み合わせが可能

* EMR(というかHadoop)を取り囲むエコシステム群による機能補完

EC2だし,いざとなればなんとかなるでしょ(⼩並感)* いざとなればSSHで⼊ってごにょごにょできるし・・・

Page 19: 基幹業務もHadoop(EMR)で!!のその後

アーキテクチャ全体概要

共有マスタ本部システム

ファイル連携基盤

API参照DB加⼯処理クラスタ×2常時起動、ピーク時起動

受信マスタDB

Ⅰ.取込処理 Ⅱ.加⼯処理 Ⅲ.参照処理

参照API

マスタ反映ファイル連携 データ加⼯ APIデータ反映 APIデータ参照

データを返す

過去データ蓄積⽤バケット

MySQL

DOT/POTセンター機能

店 舗

DOT

POT

データ取得

ファイル取込サーバ

MySQL

MySQL

CDNキャッシュ

動画・添付 画像

CDNアップロード

SQLバッチ(HiveQL)

参照APIで取得したURL情報を元に画像ファイルなどをGET

Page 20: 基幹業務もHadoop(EMR)で!!のその後

ここまでがカンファレンス時までの話

(完)

Page 21: 基幹業務もHadoop(EMR)で!!のその後

性能テスト/チューニング

Page 22: 基幹業務もHadoop(EMR)で!!のその後

性能テスト実施環境

共有マスタ本部システム

ファイル連携基盤

API参照DB加⼯処理クラスタ×2常時起動、ピーク時起動

受信マスタDB

Ⅱ.加⼯処理 Ⅲ.参照処理

参照API

データ加⼯ APIデータ反映 APIデータ参照

データを返す

過去データ蓄積⽤バケット

MySQL

DOT/POTセンター機能(擬似)

ファイル取込サーバ

MySQL

MySQL

CDNキャッシュ

動画・添付 画像

CDNアップロード

SQLバッチ(HiveQL)

JMeter

性能テスト環境

Ⅰ.取込処理

マスタ反映ファイル連携

ファイル連携基盤にて性能テスト環境へのファイルを配信してもらい本番

と同じ流量かつデータ量を再現

Page 23: 基幹業務もHadoop(EMR)で!!のその後

性能テスト実施環境

共有マスタ本部システム

ファイル連携基盤

API参照DB加⼯処理クラスタ×2常時起動、ピーク時起動

受信マスタDB

Ⅱ.加⼯処理 Ⅲ.参照処理

参照API

データ加⼯ APIデータ反映 APIデータ参照

データを返す

過去データ蓄積⽤バケット

MySQL

DOT/POTセンター機能(擬似)

ファイル取込サーバ

MySQL

MySQL

CDNキャッシュ

動画・添付 画像

CDNアップロード

SQLバッチ(HiveQL)

JMeter

性能テスト環境

Ⅰ.取込処理

マスタ反映ファイル連携

ファイル連携基盤にて性能テスト環境へのファイルを配信してもらい本番

と同じ流量かつデータ量を再現

Page 24: 基幹業務もHadoop(EMR)で!!のその後

やっぱり本番負荷は並じゃなかった

思っていた以上にジョブ投⼊多重度が⾼かった問題

ちまたのベストプラクティスがはまらない問題*ググって出てくるチューニング例は当てはまらないことが多かった orz

* 実環境では当初想定よりもかなりの処理が多重で実⾏される結果に

RDSがふん詰まる問題* スループットが思った以上に出ない&EMRからボトルネックが移動してきた

Page 25: 基幹業務もHadoop(EMR)で!!のその後

数値でみる処理状況

投⼊ジョブ数(瞬間⾵速) -> 250~/分間

トータル12,000ジョブ/1バッチ処理

Page 26: 基幹業務もHadoop(EMR)で!!のその後

数値でみる処理状況

同時稼働ジョブ数 -> 100~600ジョブ

Page 27: 基幹業務もHadoop(EMR)で!!のその後

特 徴l とにかくジョブの同時投⼊数、稼働数が多い

l 1マスタ作成処理につき平均20ワーク作成ほど * 80マスタテーブル * 店舗数分

l ⼀つ⼀つのクエリは結構重たいl ⾮正規化処理が中⼼のため⼤量読み取り&⼤量書き出し

Page 28: 基幹業務もHadoop(EMR)で!!のその後

処理時間の推移でみるチューニング過程

90分 25分

∞ 90分

まずは1/80マスタを全店舗分

80マスタを全店舗分

Page 29: 基幹業務もHadoop(EMR)で!!のその後

チューニング対応⼀覧l 以下は主にEMR関連で、細々としたアプリケーションのチューニングなども別途対応

Page 30: 基幹業務もHadoop(EMR)で!!のその後

処理時間の推移でみるチューニング過程

90分 25分

∞ 90分

まずは1/80マスタを全店舗分

80マスタを全店舗分

主にHiveのクエリやパラメータチューニング

Page 31: 基幹業務もHadoop(EMR)で!!のその後

クエリチューニングl パーティション利⽤の廃⽌

l パーティション後のファイルサイズが⼩さくなりがちで、結果IO効率が悪くなっていったl パーティション作成処理のオーバーヘッドの積み重ねが処理時間のウェイトを占めるようになっていた

l ワークテーブル数の削減(可読性をさげない程度に)l 複数ワークテーブルを集約して⼀つのクエリにするl 1クエリでさばく処理量を増やすことでIO効率をあげていく(UNION ALLなど)

Page 32: 基幹業務もHadoop(EMR)で!!のその後

クエリをまとめていく例

Page 33: 基幹業務もHadoop(EMR)で!!のその後

パラメータチューニングl 処理エンジンの変更

l 処理エンジンをTezに変更することでオンメモリで処理を⾏い、ディスクIOを減らす

l Reducer数の変更l 最後のファイル書き込みがボトルネックとなる処理が多かったため、起動Reducer数を増やして対応

l MapJoinの積極的活⽤l MapJoinをどんどん誘導していく

l ファイルフォーマットの選択と圧縮⽅式の選択l 処理に適したファイルフォーマット選択とディスクIO負荷を軽減するための適切な圧縮⽅式選択

Page 34: 基幹業務もHadoop(EMR)で!!のその後

処理エンジンの変更l Tezに変更することで処理をオンメモリに切り替え

l MRは多少乱暴に書いても動き切ってくれる安⼼感はあったけど・・・

http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.4.3/bk_performance_tuning/content/hive_perf_best_pract_use_tez.html

Page 35: 基幹業務もHadoop(EMR)で!!のその後

処理エンジンの変更

Page 36: 基幹業務もHadoop(EMR)で!!のその後

処理エンジンの変更l オンメモリ処理への切り替えに伴いコアノードのインスタンスタイプを変更

l d2.4xlarge -> r3.8xlarge

l 同時ジョブ数の増加で最後のHDFSへの書き出しの遅さが⽬⽴つようにl 起動Reducer数を増やすことで対応(愚直に計測・・・)

Page 37: 基幹業務もHadoop(EMR)で!!のその後

Reducer数の変更/コンテナサイズの調整l 以下の可変要素を調整しながらベターなパラメータをひたすら探る

l コンテナサイズ * 起動Reducer数 * 同時投⼊ジョブ数

Page 38: 基幹業務もHadoop(EMR)で!!のその後

Reducer数の変更/コンテナサイズの調整l 調整パラメータ⼀覧

-- Reducer関連SET hive.tez.auto.reducer.parallelism=true;SET hive.exec.reducers.bytes.per.reducer=64000000;

-- YARN Container関連SET hive.tez.container.size=4096;SET hive.tez.java.opts=-Xmx3200m;SET hive.tez.cpu.vcores=1;SET hive.prewarm.enabled=true;SET hive.prewarm.numcontainers=30;

Page 39: 基幹業務もHadoop(EMR)で!!のその後

(参考)コンテナにおけるメモリ利⽤内訳l コンテナのメモリ利⽤内訳はベストプラクティスに従って設定

l https://community.hortonworks.com/articles/14309/demystify-tez-tuning-step-by-step.html

l ヒープサイズはやや⼤きめにとっている

Page 40: 基幹業務もHadoop(EMR)で!!のその後

MapJoinへの積極的誘導l 最初は各クエリの各ワークをレビューしながらヒント句で固定

l 発狂 アヒャヒャヒャ(゚∀゚≡゚∀゚)ヒャヒャヒャl そもそもクエリ内のロジックやら処理データ量やら変わったらどうするのこれ・・・

l もうAutoにまかせちゃうl MapJoinだとまずいものだけをMap Joinさせないl がむしゃらにMapJoinさせようとするとHashテーブルがメモリに乗り切らずOOM

-- Map Join関連SET hive.auto.convert.join=true;SET hive.auto.convert.join.noconditionaltask.size=1300000000;

Page 41: 基幹業務もHadoop(EMR)で!!のその後

ファイルフォーマットの選択/圧縮⽅式の選択l (中間テーブルの)ファイルフォーマット選択にあたっての要件としては以下

l どうせ終わったら消すだけのワークなので早く終わればそれでよし!l スキーマ情報はクエリの中でDDL発⾏していたのでファイルフォーマットでカバーする必要なし

l カラムナ型のファイルフォーマッットも試したものの処理特性もありぱっとせずl ⾮正規化に近い処理をひたすら繰り返すため、カラムナフォーマットの利点をいかしきれず

-- ファイルフォーマット関連&圧縮関連SET hive.default.fileformat=sequencefile;SET mapred.output.compression.type=BLOCK;SET hive.exec.orc.default.compress=SNAPPY;SET hive.exec.compress.intermediate=true;SET hive.exec.compress.output=true;SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;

Page 42: 基幹業務もHadoop(EMR)で!!のその後

MySQL MySQL

TEXTFILE SEAQUENCEFILE+Snappy TEXTFILE

・・・・

加⼯元テーブル ワークテーブル 加⼯後テーブル

Hive

HDFS

ファイルフォーマットの選択/圧縮⽅式の選択受信マスタDB API参照⽤DBEMR

Sqoopエクスポート時の対応フォーマットの制約のため

Sqoopインポート時のHive連携オプションにより⾃動でスキーマ作成

Page 43: 基幹業務もHadoop(EMR)で!!のその後

ファイルフォーマット 圧縮アルゴリズム 圧縮タイプ 処理時間

TEXT SNAPPY - 24:41:00

SEAQUENCESNAPPY BLOCK 24:10:00

SNAPPY RECORD 27:22:00

ORC SNAPPYファイルレベル 27:17:00

ビルトイン 27:00:00

(参考)ファイルフォーマットの選択/圧縮⽅式の選択

Page 44: 基幹業務もHadoop(EMR)で!!のその後

ここまでで単位のマスタ作成は⽬標時間をきる

90分 25分

∞ 90分

まずは1/80マスタを全店舗分

80マスタを全店舗分

Page 45: 基幹業務もHadoop(EMR)で!!のその後

次は本番同等の多重度でやってみて

90分 25分

∞ 90分

まずは1/80マスタを全店舗分

80マスタを全店舗分

主にYARNにおけるチューニング

Page 46: 基幹業務もHadoop(EMR)で!!のその後

やっぱり本番負荷は並じゃなかった

思っていた以上にジョブ投⼊多重度が⾼かった問題

ちまたのベストプラクティスがはまらない問題* ググって出てくるチューニング例は当てはまらないことが多かった orz

* 実環境では当初想定よりもかなりの処理が多重で実⾏される結果に

RDSのご機嫌問題*スループットが思った以上に出ない&EMRからボトルネックが移動してきた

Page 47: 基幹業務もHadoop(EMR)で!!のその後

本当に⼤変だったのはリソースコントロールl なだれ込むジョブにそもそもクラスタが耐えられず orz

l ジョブがペンディングの嵐l カーネルのプロセス数上限に達してそもそもジョブ動かない

Page 48: 基幹業務もHadoop(EMR)で!!のその後

リソースコントロールのための対応l コンテナ配布の最適化l スケジューラの調整

クラスタリソース(コンテナ)

割当 割当 割当

リソース割当待ち状態の滞留ジョブを発⽣させない

同時稼働ジョブ数を増やすために、効率的なリソース配分を実施させる

そのうえで、各マスタ作成処理の最適化を実施する

Page 49: 基幹業務もHadoop(EMR)で!!のその後

コンテナ配布の最適化l 利⽤できるコンテナ数をとにかく増やす

l YARNアプリケーションごとにコンテナ数を調整(節約)l 前述したMapJoinなども考慮して、全体の性能が落ちずかつ複数処理がまわるようなコンテナサ

イズをさぐる

l Sqoopによるインポート/エクスポート処理は起動Map数が指定できるため、起動に必要なサイズにまでぎりぎり減らす

Page 50: 基幹業務もHadoop(EMR)で!!のその後

⽣々しい軌跡l コンテナのメモリサイズを調整しながらギリギリのラインをさぐる

l 結果的に512MB/コンテナあれば同じ処理時間を保ちながら処理ができたl これより⼩さくなると、そもそもOOMで動かなくなる

Page 51: 基幹業務もHadoop(EMR)で!!のその後

スケジューラの調整l スケジューラをFair Schedulerに変更

l とにかく終わったものからどんどんRDSに流してしまいたかったため、ペンディングをなくしたかったl とはいえ、ジョブに応じてコンテナの配分は調整したかったので、そこはキュー設計で頑張る

Page 52: 基幹業務もHadoop(EMR)で!!のその後

キュー設定によるリソース割り当て優先度の調整

キュー設定

root├ peak(業務優先度⾼&リソース要求⾼)

└ shohin└ hatchu_shohin└ ichiran_sansho_yo_shohin└ plu

├ others(業務優先度低&リソース要求低)└ sqoop(Sqoop処理⽤)

└ import└ export

前 提

l YARNスケジューラとして「Fair Scheduler」を利⽤する。l Fair Schedulerにより、マスタ作成処理に重みづけを⾏い、クラスタのリソースを綿密にコントロールすることを⽬的とする。

※Capacity Schedulerはキュー内ではリソースを均等分配できずペンディング状態の処理が発⽣してしまう可能性があるため。

Page 53: 基幹業務もHadoop(EMR)で!!のその後

キュー設定によるリソース割り当て優先度の調整業務優先度⾼ & リソース要求⼤ Sqoop処理⽤途(必要最低限のみ)業務優先度中低 & リソース要求⼩

さらにその中で配分

Page 54: 基幹業務もHadoop(EMR)で!!のその後

▼発注⽤途マスタ作成開始

▼全体商品マスタ作成開始▼PLU⽤マスタ作成開始

▼商品⼀覧参照⽤マスタ作成開始

4:0023:40

▼発注⽤途マスタ作成開始

▼全体商品マスタ作成開始

▼PLU⽤マスタ作成開始

▼商品⼀覧参照⽤マスタ作成開始

リラン枠(1.5時間)

通常時

開始遅延時 必要リソース量の最⼤値⾒積り箇所

リソース配分の決定までの道のり

Page 55: 基幹業務もHadoop(EMR)で!!のその後

そして90分にまでようやっと短縮!!

90分 25分

∞ 90分

まずは1/80マスタを全店舗分

80マスタを全店舗分

Page 56: 基幹業務もHadoop(EMR)で!!のその後

おまけ

Page 57: 基幹業務もHadoop(EMR)で!!のその後

やっぱり本番負荷は並じゃなかった

思っていた以上にジョブ投⼊多重度が⾼かった問題

ちまたのベストプラクティスがはまらない問題*ググって出てくるチューニング例は当てはまらないことが多かった orz

*実環境では当初想定よりもかなりの処理が多重で実⾏される結果に

RDSのご機嫌問題*スループットが思った以上に出ない&EMRからボトルネックが移動してきた

Page 58: 基幹業務もHadoop(EMR)で!!のその後

EMRと同じぐらい⼤変だったRDSチューニングl 最初は最初はほんとにSqoopによるエクスポートが終わらなかった・・・

l Sqoopエクスポートの多重度があがるとRDS(MySQL)のIOがつまる・・・l しまいにはセッションきられる

l 以下を中⼼にチューニングし、なんとか流し切れるまでにl エクスポート対象のテーブルを事前にPKでソートl なるべくディスクへの書き込みによるIOを遅延させる

l innodb_buffer_pool_sizel innodb_max_dirty_pages_pct

l 書き込み周りのスレッド数を微調整l innodb_write_io_threadsl innodb_thread_concurrency

Page 59: 基幹業務もHadoop(EMR)で!!のその後

試しにAurora(MySQL)に変更したみたらl あんなに頑張った結果がノンチューニングで抜かれる(しかも台数も半分で・・・)l 多重度が上がるほど性能が安定&エクスポートするテーブルサイズによらず安定l マルチAZにしても⾮同期だから性能劣化なしl ⼤量データのエクスポート先としても結構有能

Page 60: 基幹業務もHadoop(EMR)で!!のその後

(参考)エクスポート並列数による処理時間結果

0:00:000:00:200:00:400:01:000:01:200:01:400:02:000:02:20

1テー

ブル

あた

りの処

理時

同時テーブルエクスポート数

Aurora 8xrlageAurora 4xlargeMySQL 4xlarge

No RDS AZ構成 パラ [table]map数 処理時間 処理時間/table 参考処理時間(MySQL)

参考処理時間/table(MySQL)

7 r3.4xlarge なし 9 1 0:15:26 0:01:43 0:12:35 0:01:248 r3.4xlarge なし 18 1 0:25:50 0:01:26 0:32:00 0:01:4713 r3.4xlarge あり 36 1 0:56:18 0:01:34 1:18:46 0:02:1116 r3.8xlarge なし 9 1 0:12:30 0:01:2317 r3.8xlarge なし 18 1 0:22:22 0:01:1518 r3.8xlarge なし 36 1 0:46:10 0:01:1721 r3.8xlarge なし 72 1 1:37:21 0:01:21

RDS(JM)

Page 61: 基幹業務もHadoop(EMR)で!!のその後

(参考)Multi AZによる処理時間

101% 104%

123%

140%

0%

20%

40%

60%

80%

100%

120%

140%

160%

9パラ1map 18パラ1map

AZな

しの場

合を

100%

とした

場合

の処

理時

間の

伸び

Aurora

MySQL

No RDS AZ構成 パラ [table]map数 処理時間 処理時間/table 参考処理時間(MySQL)

参考処理時間/table

7 r3.4xlarge なし 9 1 0:15:26 0:01:43 0:12:35 0:01:248 r3.4xlarge なし 18 1 0:25:50 0:01:26 0:32:00 0:01:4711 r3.4xlarge あり 9 1 0:15:36 0:01:44 0:15:26 0:01:4312 r3.4xlarge あり 18 1 0:26:45 0:01:29 0:44:49 0:02:29

Page 62: 基幹業務もHadoop(EMR)で!!のその後

まとめ

Page 63: 基幹業務もHadoop(EMR)で!!のその後

まとめ:教訓l とにかくワークは⼩さく保つ!!(迫真)

l プランの可読性が全然違う

l ちまたのチューニング情報はとっかかりとして有効l ワークロードが異なれば傾向も変わる

l リソース配分部分は結構盲点l 情報も少なく⼀番業務要件できまる部分なのでちゃんと特性を知った上で設計する

l Auroraって万能ですね!l 重たいデータのオフロードもいけるじゃん

Page 64: 基幹業務もHadoop(EMR)で!!のその後

ありがとうございました!!