• Home
  • コーポレートブログ Geniee’s BLOG
コーポレートブログ

Geniee’s BLOG

ジーニーは最先端の広告テクノロジーで
顧客の収益を最大化します。

こんにちは、R&D本部2019年卒エンジニアの浅井です。
マーケティングテクノロジー開発部MAJINグループでエンジニアをしています。
今回は、オンプレ上にあるHadoop環境をAWSに移行した話をしようと思います。

浅井迅馬/京都大学工学部卒業後、2019年にジーニーに入社
R&D本部マーケティングテクノロジー開発部・MAJIN開発チーム所属

Contents

1 オンプレ上の旧クラスタについて
2 AWS上の新規クラスタについて
3 おわりに 改善できた点・できなかった点

1  オンプレ上の旧クラスタについて

私の開発しているMAJIN(マーケティングオートメーションツール)というプロダクトでは、2016年からオンプレ環境にて構成されたHadoopクラスタを用いて、エンドユーザー行動ログの集計を行っています。
旧クラスタの構成は以下です。

■ハードウェア

クラスタはCloudera Managerを用いて管理されており、Cloudera Managerだけが立っているサーバー(cloudera)が1台あります。
Hadoopクラスタに対する問い合わせを行えるようなGatewayとなるサーバー(client)が2台、コアノードと呼ばれるようなサーバー(core)が19台、マスターノードと呼ばれるようなサーバー(master)が2台の全24台で構成されています。

■アプリケーション

・CDM/CDH
・HBase
・HDFS/YARN
・Zookeeper
・Spark2
・Java
・Scala
・Digdag

MAJINではHDFS及びHBaseをデータレイクとして扱っており、MapReduceやSparkでそれらの集計を行っています。ジョブのスケジューラーとしてはcronとDigdagが使われています。

■アーキテクチャ

旧クラスタの概略を図示すると、以下のようになっています。

旧オンプレアーキテクチャ

td-agentからHBase/HDFSにエンドユーザーの行動ログが流れてきます。そして、clientサーバーにてDigdag/cronを契機にそれらを集計するMapReduce/Sparkが走ります。
この旧クラスタで行われる集計は約30のMAJINの機能に関わっており、約60個のジョブが動いています。

さて、旧クラスタでは以下のような問題を抱えていました。

複雑化したclientサーバー
・Hadoopクラスタへの問い合わせが行えるということで、clientサーバーは様々な用途に使われてきました。
・MapReduceやSparkジョブのサブミット
・ジョブのスケジューラーが動いている
・cron及びDigdag
・ジョブのタスクランナーが動いている
・cronで定期実行される自社製タスクランナー
・Hadoopクラスタへのアドホックな問い合わせ
・MapReduceやSparkジョブのビルド
・Hadoopと関係のない謎のデーモン
clientサーバーは数年間「便利」に使われてきており、このサーバーが停止したらどうなるのかとを想定することすら難しい複雑な環境になっていました。

自社製タスクランナー
このクラスタを立ち上げた時から、cronと自社製のタスクランナーを合わせたジョブワークフローを利用しています。このタスクランナーはPerlで書かれており、さらにPython2系に依存しています。現在MAJINチームではPerlを読み書きできる人間がおらず、またPython2系はEOLを迎えていることから、この自社製タスクランナーのメンテナンス性が問題視されていました。

無駄の多いクラスター
前述の通り、このクラスター上では HDFSやHBaseといったデータレイクからYarnで管理されたジョブまで様々なHadoop周りのコンポーネントが動いています。
すべてが1つのクラスターで動いていることから、負荷が重なるとお互いにリソースを奪い合ってしまう可能性があります。もちろんYarnが完全にHDFSやHBaseのリソースを奪うということはなく、考えられる負荷の上限に合わせたクラスタ構成になっていますが、その分無駄も多くなってしまっています。

こうした問題がある中、2021年7月にクラスタを構成している大部分のサーバーの保守が切れるという事態が発生しました。
そこで、まず移行先として既存のオンプレ継続・IDCF・GCP・AWSと4つの選択肢が挙げられました。そして、移行の要件としては、既存の機能をそのまま移せること、移行自体のコストが小さいこと、移行後の保守コストが既存よりも下がることなどが求められていました。
それゆえに、可能な限りミドルウェア等の管理が不要でかつ既存のMapReduce・Sparkの資産が活かせる環境としてGCP・AWSが残り、最終的に既存のアプリケーションがAWS上で動作していることからAWSを選定しました。またAWSでデータの集計基盤を作るとしても様々な案が考えられますが、今回は移行自体のコストを下げるということで、Athenaなどは使わずAmazon EMRクラスタへ移行する計画が練られ、実行されました。

2 AWS上の新規クラスタについて

新規アーキテクチャの概略図は以下になっています。

大きな変更点としては、1つのクラスタ上で行われていたことを分離しました。
HDFSをS3に、HBaseをEMRクラスタに、MapReduceやSparkを実行するクラスタはSpot Fleetを用いて必要なときに必要な分のEMRクラスタを起動するように変更しました。
またclientサーバーはGatewayの役割だけをもつサーバーとタスクを実行するサーバーに分離しました。それに伴い、自社製タスクランナーを廃止しDigdagに統合しました。

この移行はまずtd-agentからのログをAWSへも転送させるところから着手しました。td-agentからKinesisへはfluent-plugin-kinesisを、HBaseへは既存の自社製pluginを使用しました。
続いてcronからDigdagへの移行に移りました。これによってタスクランナーとスケジューラーが別れて管理されていた問題が解消されました。また自社製タスクランナーにはなかった並行処理の機能や管理画面など、実行速度や運用面においても改善されました。
最終的な切り替えにあたっては処理を冪等に修正し、万が一誤ったデータを書き込んだとしても差し戻せばすぐに修正できる状態にすることで、無停止での移行を実現しました。

しかし、移行もスムーズに行えたわけではありませんでした。例えばDigdagのemrオペレーターはステージングディレクトリにusリージョン以外のS3バケットを指定できないというGitHub上のIssueに気づかず、バケットをusリージョン以外に作ってしまったため作り直しを行いました。他にもDigdagのemr-fleetオペレーターが存在しますが、今回利用にあたってステップの並行実行数やAllocation Strategyの設定ができなかったことから、必要なオプションを設定できるようにしました。

3  おわりに

この移行によって様々なメリットを得ることができました。
■Digdagによる集計アーキテクチャの一本化ができました。
■タスク実行クラスタの自由なプロビジョニングができるようになりました。
■継続して管理が必要なクラスタはHBaseのみになりました。

しかし、まだまだ課題が残っています。
■Digdagのタスクを実行しているサーバーは1台しかなくSPOFになっています。
・Ansibleによる構成管理を行っているため、すぐに復旧可能な状態ではありますが、今後はDigdagで可能なHA構成にする予定です。
■インフラの構成管理ができていません。
・本番環境は手動で作ってしまいました。
・ステージング環境からCloudFormationでの管理を行っています。

移行にあたって協力してくださったAWSソリューションアーキテクトの方々に、心から感謝申し上げます。
今後オンプレHadoopクラスタをAWSなどのクラウドサービスへ移行することを考えている方々の参考になれば幸いです。

一緒に働く仲間募集中!
【ジーニーのリクルートサイトはこちら】
https://geniee.co.jp/recruit/

Back to top