BLOG

ブログ

GitHub Actionsを用いたデータパイプライン設計時の注意点

背景

 データ分析基盤の信頼性向上には、データパイプラインの自動化が必要不可欠です。手動運用ではヒューマンエラーや運用コストの増大が懸念されるため、CI/CDの仕組みを導入して自動化することが求められています。GitHub Actionsは、GitHubとの親和性が高く、コミュニティが提供するActions(再利用可能な自動化タスクのテンプレート)が豊富なため、データパイプラインの自動化を手軽に素早く実現できるツールです。しかし、実際の運用環境では、パフォーマンスの最適化やコスト管理など、いくつか注意すべきポイントがあります。

 本記事では、基本的なデータパイプラインの実装例とともに、ランナー選択、並列処理の活用、キャッシュの利用といったパフォーマンス改善方法について解説します。

データパイプライン向けワークフロー実装例

 まずは基本的なデータパイプラインについてご紹介します。以下の構成例では、毎日3:00に定期的に「output.csv」というデータをAmazon Simple Storage Service(Amazon S3)にアップロードする場合を想定しています。データパイプラインは大きく分けて「Extract(抽出)」「Transform(加工)」「Load(ロード)」の3つのプロセスを経てアウトプットを生成するのが一般的です。

構成例

リポジトリGitHub
CI/CDGitHub Actions
state管理場所Amazon Simple Storage Service(Amazon S3)
加工済みデータの格納場所Amazon Simple Storage Service(Amazon S3)

パイプラインのコード例

この構成例をコード化すると以下のようになります。

name: ETL Pipeline
on:
  schedule:
    - cron: "0 3 * * *"  # 毎日AM3:00に実行

jobs:
  # データ取得と環境準備
  extract:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.10'
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
      - name: Get raw data from S3
        run: aws s3 cp s3://bucket/raw_data.csv ./input.csv
        id: extract

  # データ加工処理
  transform:
    needs: extract
    runs-on: ubuntu-latest
    steps:
      - name: Transform csv
        run: |
          python transform.py \
          --input ./input.csv \
          --output ./output.csv
        env:
          PROCESSING_THREADS: 4

  # 加工済みデータをアップロード
  load:
    needs: transform
    runs-on: ubuntu-latest
    steps:
      - name: Upload to S3
        uses: aws-actions/configure-aws-credentials@v4
        with:          role-to-assume: arn:aws:iam::123456789012:role/my-github-role
          role-session-name: GithubActionsSession
          aws-region: ap-northeast-1
        run: aws s3 cp output.csv s3://your-data-bucket/

小規模なものであれば、こちらのETLパイプラインでやりたいことを最低限実現することは可能です。一方で、中〜大規模なCI/CDを組む際は、これでは不十分な場合があり、幾つか改善の余地があるコードとなっています。パフォーマンス改善のポイントを確認していきましょう。

パフォーマンス改善のポイント

1. 適切なランナー選択

jobs:
  extract:
    # 特別な理由が無ければ ubuntu-latest を使用する
    runs-on: ubuntu-latest

WindowsやmacOSのランナーは、Ubuntuのランナーに比べ同一処理の料金が2倍以上かかる仕様となっています。特別な理由が無ければ ubuntu-latest を使用するのが無難です。

また、Amazon Elastic Compute Cloud(EC2)やオンプレミスサーバーをセルフホステッドランナーとして利用することで、パフォーマンスとコスト面でメリットが得られる場合があります。

例:

  • Amazon Elastic Compute Cloud(c5.2xlarge)をセルフホステッドランナー運用
  • Spot Instancesとすることでコスト削減を実現

セルフホステッドランナーは、GitHub画面の「Settings > Actions > Runners」から「New self-hosted runner」を押下することで作成することができます。

お持ちのサーバーでいくつかのコマンドを叩くだけで、簡単に構築することができます。(具体的な構築方法については、詳しく手順化して下さってる方がいますので割愛します。参考:GitHub Actionsのセルフホステッドランナーを構築する

ランナーが正常に動作しネットワークの疎通も取れていると「Status」はIdleと表示されます。この状態で、パイプラインのymlファイルで「runs-on: self-hosted」を指定することで、セルフホステッドランナーを使用したCI/CDを実現することができます。

ただし、自前でサーバーを管理するコストがかかるため、運用方針や要件に合わせて何を優先するかを天秤にかける必要はあります。

2. 並列処理の活用

大量データの処理では、データを複数のシャードに分割して並列実行することで、全体の処理時間を大幅に短縮できる場合があります。以下の例では、1つの処理を4つのシャードに分けて並列実行する例です。

jobs:
  shard-1:
    runs-on: ubuntu-latest
    steps:
      - name: データ処理(Shard 1)
        run: python process.py --shard 1

  shard-2:
    runs-on: ubuntu-latest
    steps:
      - name: データ処理(Shard 2)
        run: python process.py --shard 2

  shard-3:
    runs-on: ubuntu-latest
    steps:
      - name: データ処理(Shard 3)
        run: python process.py --shard 3

  shard-4:
    runs-on: ubuntu-latest
    steps:
      - name: データ処理(Shard 4)
        run: python process.py --shard 4

この例では、理論上、処理時間を1/4に短縮することができ、大幅な時間短縮とランニングコストの削減が期待できます。

3. キャッシュの活用

依存パッケージの再インストールや、Dockerレイヤーのビルド時間を短縮するには、キャッシュ機能が有効です。これにより再構築にかかる時間を短縮することができます。

以下は、pythonの依存パッケージをキャッシュする例です。

- name: Cache pip dependencies
  uses: actions/cache@v4
  with:
    path: ~/.cache/pip
    key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
    restore-keys: |
      ${{ runner.os }}-pip-

特にデータパイプラインでは、パイプライン内で同じ作業が繰り返されるケースが多く、大量データを処理した結果をキャッシュとして保持することで、同じ処理を何度も行わなくて済みます。

GitHub Actionsのログ画面で、以下のように「Cache hit…」のようなログが表示されていれば、キャッシュヒットしていることが確認できます。

最後に

今回は、GitHub Actionsを用いたデータパイプラインのCI/CD実装において、具体的なデータパイプラインの実装例とともに、パフォーマンス改善のポイントについて解説しました。

実際の運用では、小規模なパイプラインで設定を検証し、徐々にスケールアップして本番環境に展開するアプローチでリスクを抑えつつCI/CDの仕組みを導入することができます。是非、実践してみてください。

参考リンク

SinkCapitalではデータに関する支援を行っています

弊社はスペシャリスト人材が多く在籍するデータ組織です。 データ分析や分析基盤の設計などでお困りの方がいらっしゃれば、 まずは無料で、こちらから各分野のスペシャリストに直接相談出来ます。