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

Geniee’s BLOG

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

2017年からスタートしている「新卒bootcamp」は今年で7年目となります。
約2カ月の期間で新卒1年目のエンジニアが6月の本配属に向けて、基礎的な知識・技術を習得する導入研修です。
6/16に無事に終了した今年のbootcampを振り返って実行委員会から4名の方々にお話を聞きました。

東 哲志さん
2020年4月入社
CVG事業本部 CATS マネージャー

牛丸 創太郎さん
2020年4月入社
SFA/CRM事業本部

小林 誠明さん
2022年4月入社
テクノロジー戦略本部 Science

窪寺 壮哉さん
2021年7月インターン入社
SFA/CRM事業本部

ーーーbootcampの概要を教えてください。

小林:約2カ月の期間で各技術分野の研修とチーム研修を行います。
新卒の基礎的な知識・技術の向上やどのチームに配属されても必要となる知識を習得することを目的としています。

ーーー具体的な研修内容を教えてください。

牛丸:4/16~5/30は各分野(git、クラウド、コードレビューなど)の研修を、5/31~6/16ではチーム研修を行ないました。
各分野の研修は半日から三日程度の期間で基礎を学び、その後演習を体験し、チーム研修は全体を3チームに分けてそれぞれ別のサービスを作る形で行なわれました。
研修のメインの目的としては、基礎技術・能力の向上・どのチームに配属されても必要になる知識、技術を効率的に習得してもらう事です。

ーーー今年新たに導入された研修はありましたか?

牛丸:Copilot・ChatGPT研修や、ドキュメントライティング研修です。
Copilot・ChatGPT研修は、利用する際の注意点を学び、利用頻度を向上させることで全体の開発速度が上がることを目指した研修です。
ドキュメントライティング研修は書き方の基礎を学ぶことで、社内の資料の質を向上させることが目的です。

窪寺:それとは別に新たな取り組みとして、入社前にプレブートキャンプの課題をメールで送付しました。これにより、新入社員は最低限の技術知識を身につけ、本格的にbootcampへ臨む準備を整えることができたかと思います。

ーーー運営する中で大変だったことはありますか?

窪寺:各講義のクオリティーを担保するのがとても難しかったです。一律で守ってもらう基準を策定したものの、修正を依頼することも少なくありませんでした。来年以降は講義資料のテンプレートを作成することで、ある程度均質化できるのではないかと思います。

小林:難易度の高い研修は、 研修資料の作成にも多くの時間がかかるため、 工数の調整などで苦労しました。難易度が高くなりすぎている研修は一部簡略化し、 講師の負担を軽減することで改善されると考えています。

ーーー運営を通して気づきはありましたか?

牛丸:新卒の配属に関して、人事とHRBPの方々と協力できたおかげで、去年よりもスムーズかつ納得感のある配属になったのではないかと思います。

窪寺:エンジニアの仕事だけでは気付くことができなかった関係各所とのスケジュール調整や働きかけ、コネクションなどの大切さを実感しました。

ーーー今後の展望を教えてください。

東:単純に技術のレベルを底上げするための研修で終わるのではなく、新卒が配属後に即戦力として活躍できるようになるためのサポートを、総合的にできる組織の構築を目指していきたいです。
一方でbootcampの運営を担当してくれるメンバーには、横の連携や他部署の上司との繋がりなどを築き、社内全体への視野をもってリーダーシップを磨くための場として活用して行ってもらえるように業務フローの整備や評価体制を整えていきたいと考えています。

受講者の感想

富岡 真由さん
bootcamp後、GENIEE CVG事業本部へ配属
bootcampは今まで知らなかった様々な技術を学ぶことができた研修でした。その中で特に印象に残ったのはLEMP研修です。それまでの研修で各テーマに沿って学んできた技術を総合的に使用して課題を解いていくことで、自分の理解が甘かった部分などに気がつくことができ、技術者同士のつながりも感じることができました。

内藤 隼矢さん
bootcamp後、SFA/CRM事業本部へ配属
今まで触れたことのない様々な技術を幅広く経験でき、充実した楽しい期間でした。特に印象深いのはチーム研修です。自分を含むほぼ全員が初めての集団開発でしたが、チームリーダーを中心にメンバー全員が協力し合い、プロダクトを完成させられた事に達成感を感じました。

はじめに

GENIEE インフラチーム片岡です。2019年に新卒として入社し、最初の二年間は DSP のフロントチームで管理画面の開発をしていましたが、2021年中頃からチームを異動し、今はインフラ寄りのお仕事をしています。
そのころから、DSP のレポート集計基盤を刷新するプロジェクトが動いており、なんやかんやあって遂に数ヶ月前にリプレイスが終わりました。今回はこれについてお話をしたいと思います。

片岡 崇史/高知工科大学大学院を卒業後 2019 年に新卒入社。R&D アドプラットフォームサプライサイド開発部 DevOps チーム所属。

レポート集計基盤について

弊社では、オープンソースの列指向 DBMS のひとつである ClickHouse を使ってレポートデータを閲覧できるようにしています。
過去の ClickHouse の利用については以下をご覧ください。

レポート集計基盤は、弊社の DSP から配信された広告の成果ログから成果を集計し、最終的に ClickHouse のレポートテーブルに結果を入れます。

旧レポート集計基盤

旧レポート集計基盤は以下のような流れになっていました(図1)。ログを出力するサーバは、ログを Logstash によって Kafka に転送します(図1①)。Flink は Kafka からログを読んで集計処理を行います(図1②)。Flink アプリケーションの処理は大きく分けて、重複排除を行うステップ、数値を集約するステップ、ClickHouse のレポート DB に格納するデータの形に変換するステップがあります。各ステップの処理結果は kafka に転送され、次のステップは先のステップの結果を Kafka から読んで処理を行います。最後に ClickHouse は集計結果を Kafka から読み、レポートテーブルに格納します(図1③)。

↑図1

旧レポート集計基盤の辛かったところ

旧レポート集計基盤では主に以下が問題になっていました。

  1. 成果ログを使った調査が面倒
  2. Flink を運用保守できる人が少ない(再集計が必要になったときの作業が面倒)
  3. Logstash が何故か安定しない

運用上、生の成果ログを使った調査を行いたいことがしばしばあります。しかし、ログファイルは大きいので調査対象の期間が長くなると検索するだけで何十分と時間がかかることもあります。
2つ目の問題として、Flink アプリケーションの保守&運用が難しく、誰も触りたがらないものとなってしまっていてなんとかしなければいけません。
また、ログパイプライン上で何か問題が起きて流れているログが一部欠損したような場合は、その時間帯のログからレポートを再集計する必要がありますが、そのときの手順も複雑でかなり面倒なものとなっていました。この手順のミスで再び再集計作業が必要になることもありました。
ログパイプライン上で問題が起きやすかったのは、ログ転送エージェントとして利用していた Logstash です。突然ログの転送が停止し、「よくわからないが再起動したらなおったのでヨシ」ということもしばしばありました。バージョンアップやチューニング、Logstash のソースコード調査などを行いましたが、結局解決されず原因は謎のままです。

方針と期待する効果

新しいレポート集計基盤の方針としては以下のようになりました。

  1. Flink は撤廃し、成果ログをそのまま ClickHouse に流し、ClickHouse 上で集計を行う
    a. ClickHouse に成果ログを保持するテーブルを設けることで、成果ログの調査 が簡単になる
    b. Kafka のストレージ容量・通信量が削減される
  2. ログ転送エージェントを Logstash から td-agent-bit に変える
  3. ログ形式を JSON に変更する

まず Flink は撤廃することにします(さようなら)。代わりに成果ログの処理を行うのは ClickHouse で行うことにしました。弊社ではこれまで ClickHouse をレポート閲覧・分析用の DB としてのみ利用していたので新しい使い方にはなりますが、先輩方のこれまでの知見もありこれ自体に大きな問題もなく実現することができました。使い方としては基本的に普通の SQL なのでチームの人員に入れ替わりがあっても対応できそうです。
これに伴い、生の成果ログを ClickHouse に流すことになるわけですが、この成果ログを ClickHouse のログテーブルとして一定期間保持するようにすることにしました。これによって、その保持期間の間は調査に必要なログを SQL を使って取得することができます。成果ログを頻繁に調査する人にとっては結構嬉しい改善です。
先に述べたように、旧集計基盤の Flink アプリケーションは、各ステップの処理結果のデータが Flink と Kafka の間で往復していました。今回の変更はこのやりとりを無くすことになるので、Kafka のストレージ容量と通信量が大きく削減されます。
ログ転送エージェントの Logstash が安定しない問題の対策として、これを td-agent-bit (fluent-bit) に置き換えることにしました。弊社ではログ転送エージェントに td-agent (fluentd) を使っている部分が多いですが、以下の理由で td-agent-bit を選択しました。

  • Kafka にログ転送を行うにあたり、td-agent-bit は librdkafka のバージョンが新しいものが使われていてかつ細かい設定が可能である
  • CPU 使用率が大きく減少した。遅延が減ると期待できる

また、元々のログ形式は LTSV でしたが、これを JSON にすることにしました。多少ログのサイズが大きくなることが予想されましたが、代わりにログを扱いやすくすることを目指しました。

新しいログパイプラインとレポート集計系

以上を踏まえて設計すると以下のようになりました。(図2)

↑図2Kafka にログを流すところまでは、ログ転送エージェントが変わったこと以外は基本的に同じです。
上で述べたように、生ログの処理も ClickHouse で行うのですが、これまでレポート閲覧に使っていた ClickHouse クラスタ(以下、閲覧用クラスタと呼ぶ)とは別に、新しくログ処理のための ClickHouse クラスタ(以下、ログ処理用クラスタと呼ぶ)を作りました。Kafka からログを読むのはこのログ処理用クラスタのみになります(図2②)。このクラスタは Kafka から読んだログをパースして一定期間保持します。また、パース済みログを ClickHouse の Materialized View を利用して結果を閲覧用クラスタのレポートテーブルに挿入します(図2③)。このレポートテーブルはテーブルエンジンに SummingMergeTree を使っており、ここで数値が集計されます(後にもう少し詳しく説明します)。このようにクラスタを分けることにより、多くのレポート分析クエリが走って負荷が大きくなってもログ処理系に影響が出ないようにしました(その逆も同様)。
旧レポート集計系の良くなかったところとして、広告配信コストの計算のようなビジネスロジックの一部を Flink で行っていたということがあります。基本的にビジネスロジックは、ログを作るアプリケーション側で処理をして結果をログに落とすという形を取っていたので、ビジネスロジックを処理する場所が分散していました。そのため、今回 Flink に残っているビジネスロジックは全てログを作るアプリケーション側に寄せる変更を行いました。これによって、ClickHouse の集計はログに書いてある値を集約するだけで可能になりました。

ClickHouse 上でのレポート集計に使った機能

簡単にですが、ClickHouse 上でのレポート集計を支える機能の一部をご紹介します。

Kafka table engine

Kafka からログを読むのは Kafka table engine を利用しています。このテーブルを select することで Kafka のデータを consume して読むことができます。consume するので同じデータが読めるのは一度だけで、実際には以下で説明する Materialized View を使ってデータを読みます。

Materialized View

一般的な DB の Materialized View は、クエリ結果を期限付きでキャッシュする形で動作しますが、ClickHouse はそうではありません。ClickHouse の Materialized View は参照しているテーブルにレコードが挿入されたのをトリガーとして、そのレコードのみに対して処理を行い、結果をその Materialized View または指定する別テーブルに挿入します(別テーブルに挿入した結果はもちろん消えることはありません)。差分に対してのみ処理が行われるため高速に処理してくれます。

新レポート集計基盤では主に以下の用途で Materialized View を使っています。

  1. 生ログテーブルを読み、パースしてパース済みのログテーブルに挿入する
  2. パース済みのログテーブルを読み、レポートテーブル(SummingMergeTree table engine)に挿入する

1 では JSON 形式のログをパースして、必要なプロパティをカラムにしてログテーブルに挿入しています。
最終的なレポートテーブルは SummingMergeTree table engine を使っています。SummingMergeTree table engine は、挿入されたレコードを、テーブル定義の中で明示的に指定した特定のカラム(数値の型)のみ足し上げてくれます。2 の Materialized View が各成果情報を SummingMergeTree のレポートテーブルに挿入することによって、レポートテーブル上で必要な各種広告配信の指標(インプレッション数やクリック数、その他配信費など)が足し上げられ、結果が閲覧できます。

JSON を扱うための関数群

ClickHouse では JSON を扱うための SQL の関数が用意されており、我々はこれを利用して JSON のパースを行っています。C++ や simdjson を使って実装されているため、大量のログも高速に処理できています。

改善されたこと

当初の狙いだった以下のことについては達成することができました。

  1. 成果ログの調査が楽になった
  2. レポート集計基盤が安定し、再集計が必要になることがなくなった
  3. Flink を完全撤廃することができた(以前より運用しやすい状態になった)

上記以外では、Kafka の転送量が減ったことによって Kafka のサーバ台数も減らすことができました。Kafka サーバは約半数減、Flink サーバ全台撤廃、ClickHouse の集計用クラスタに数台のサーバを追加となり、全体のサーバの増減としては 10 台以上のサーバ減となりました。
また、ログが落ちてからレポートに反映されるまでの遅延が大幅に短くなりました。旧レポート集計基盤ではピークタイムに約 30 分の遅延がありましたが、新レポート集計基盤では基本的に 2 分以内に収まっています。

おわりに

レポート集計基盤の刷新した件について、新旧の違いと改善できたこと等を説明しました。と、まあ全てが上手くいったような書き方をしてきましたが、間で多々問題があったので着手から完了までかなり時間がかかり、関係各所にはご迷惑をおかけしました。今回は多くの勉強・反省することがあったので、今後これを活かして頑張っていきたいと思います。

こんにちは、DSP開発部の藤原です。
GENIEEに新卒で入社してもうすぐ1年になります。

藤原 碧/早稲田大学卒業後、2021年入社。デマンドサイド事業本部 DSP開発部 DSPグループ LAMPBackチーム所属

今日は自分が所属する部活動、競技プログラミング部について書きたいと思います。

目次

1.競技プログラミング部での活動について

  • コンテスト後の感想戦
  • バーチャルコンテスト
  • チームでのコンテスト参加
  • 社内勉強会

2.部活動発足までの経緯

3.今後の展望

1.競技プログラミング部での活動について

一年を通して主に行ってきた活動について記したいと思います。

  • コンテスト後の感想戦

社員が競技プログラミングのコンテストに参加した後にSlack上で各問題の要点を解説したり解法、提出について分からないところの相談などを行っています。
競技プログラミングの場合、大多数はTwitterで頻繁に感想戦を行っていると思いますが、そちらの縮小版といったところですね。

  • バーチャルコンテスト

コンテストサイトによってはバーチャルコンテスト(コンテストの模擬戦のようなもの)の機能があるものがあります。
その機能を利用して社員がコンテストに参加し、上述の感想戦を行うという形式です。
この場合は集まって行うことも多いため、Slackだけではなくホワイトボードに書きながら実地で(主にAtCoder暖色の方が)解説を行っています。

  • チームでのコンテスト参加

例えば、Xmas Contest (https://atcoder.jp/contests/xmascon22) などチームでの参加が可能となるコンテストへ出場をしています。

  • 社内勉強会

各社員が学んだアルゴリズムをGoogle Slide等を用いて解説していきます。
参加者のレベルに合わせて様々なもの(ABC-Exでよく見られる高度典型であることが多いです)を取り扱っています。昨年ですと、形式的冪級数の逆元やワイルドカードを含むパターンマッチングなどのテーマを取り扱いました。

2.部活動発足までの経緯

競技プログラミング部はまだ発足から1年経っていません。

自分を含めた新卒の方々で、競技プログラミングができ、話し合える場を社内に作りたいという意から部活動を作るに至りました。

新入社員は入社してしばらくの間、様々な研修があります。そこで部活動の存在を知り、同期と話を纏めて、休憩時間に現部長の杉野さんに声をかけました。
結果として1ヶ月後に部活動発足となりました。

当時は手探り状態に近く、バーチャルコンテストを立てるにも日程や難易度調整に難航していました。昔はやっていたが今は離れて久しい方やまだ参加されたことが無い方をどうやって競技プログラミングの沼に嵌らせるか。巷でよく聞く競プロの新規層取り込み問題に悩むことが多かったです。
根気強く誘ってみる、ご飯(ピザとか)で釣ってみるなどでどうにか部員を増やしていました。強い方が大勢いる中で競技プログラミングを体験してみる、というのが一番モチベーションに繋がりやすかったかな、と思います。

3.今後の展望

今後は2023年卒の取り込み、isuconやヒューリスティックなコンテスト等への参加、海外コンテストでの感想戦活発化、社内チームでのコンテスト入賞に取り組みます。

isuconには部員1名が参加となりました。今年はチームで参加し、本選に出場したいです。

海外コンテストは深夜帯であることもあり、翌日を考えると敬遠される方が多いのですが、実力向上には避けては通れない道だと考えています。土日祝日だけでも参加される方が増えると嬉しいです。

2023年卒の方は競技プログラミングを嗜まれている方が多いため今から更なる活発化を楽しみにしています。

優秀な人材が入ってくることもあり、社内コンテストなどの開催もできたらいいなと考えています。

社会人となり競技プログラミングに携われる時間はやや減ったものの、今後も部員一同精進していければと考えています。

Back to top