はじめに
新卒2年目の岡崎です。最近、embulkでBigQueryからデータベースにデータを移行しました。その時のことを備忘録として記事にします。
データ移行を行った理由
今までは、過去のデータをGoogleが提供していたUAから見て、分析できました。しかし、UAはGA4に移行を完了するにあたり、過去のデータを見れなくなりました。過去のデータが自社のデータベースにないと、毎回BigQueryを使ってデータを見なくてはいけません。この問題を解決するため、embulkを使ってBigQueryからデータベースにデータを移行します。
前提
今回はembulkを使い、BigQueryからデータベースへデータを移行することを目的とします。また、環境構築はdockerでサクッと行いたいので、dockerを使える環境の準備をしてください。
実装
実装の紹介をします。
DockerFile
ここでは、主にembulkのインストールをします。
embulkの公式ドキュメントによると、Java8が推奨されていますが、今回の実装であればJava21の環境でも問題なく動きました。
FROM openjdk:21-jdk WORKDIR /embulk # jRubyのインストール RUN curl --create-dirs -o "./jruby-complete-9.4.5.0.jar" -L "https://repo1.maven.org/maven2/org/jruby/jruby-complete/9.4.5.0/jruby-complete-9.4.5.0.jar" RUN chmod +x ./jruby-complete-9.4.5.0.jar # embulkのインストール RUN curl --create-dirs -o "./embulk-0.11.4.jar" -L "https://dl.embulk.org/embulk-0.11.4.jar" RUN chmod +x ./jruby-complete-9.4.5.0.jar ENV PATH="/root/.embulk/bin:${PATH}" COPY ./embulk/embulk.properties /root/.embulk/embulk.properties RUN java -jar embulk-0.11.4.jar gem install embulk -v 0.11.4 # プラグインのインストール RUN java -jar embulk-0.11.4.jar gem install embulk-output-mysql ENV GEM_HOME="/root/.embulk/lib/gems" RUN java -Xmx2g -jar embulk-0.11.4.jar gem install embulk-input-bigquery RUN java -jar embulk-0.11.4.jar gem install liquid -v 5.5.0 COPY embulk . RUN chmod +x embulk.sh ENTRYPOINT ["sh", "embulk.sh"]
JRubyのインストール
今回の場合はプラグインのインストールでJRubyのインストールが必要でしたが、不要な場合は飛ばしてください。
RUN curl --create-dirs -o "./jruby-complete-9.4.5.0.jar" -L "https://repo1.maven.org/maven2/org/jruby/jruby-complete/9.4.5.0/jruby-complete-9.4.5.0.jar" RUN chmod +x ./jruby-complete-9.4.5.0.jar
embulk.properties
JRubyのプロパティを設定します。
jruby=file:///embulk/jruby-complete-9.4.5.0.jar
embulkのインストール
今回は最新のバージョンである0.11.4を指定しました。
RUN curl --create-dirs -o "./embulk-0.11.4.jar" -L "https://dl.embulk.org/embulk-0.11.4.jar" RUN chmod +x ./jruby-complete-9.4.5.0.jar ENV PATH="/root/.embulk/bin:${PATH}"
プラグインのインストール
RUN java -jar embulk-{embulkのバージョン}.jar gem install {インストールしたいプラグイン} -v {バージョン}
今回は、以下のプラグインをインストールしています。
用途によって、使用したいプラグインは違うと思います。必要に応じて、プラグインのインストールをしてください。
liquidのインストール
RUN java -jar embulk-0.11.4.jar gem install liquid -v 5.5.0
liquidをインストールすることで、変数を使用することができます。
embulk.sh
embulkのシェルスクリプトの実装例を紹介します。
export TZ="Asia/Tokyo" current_hour=$(date +%H) today=$(date +%Y%m%d) export REPORT_DATE=$today java -jar embulk-0.11.4.jar run bigquery_to_mysql_report_daily_session_raw.yml.liquid echo "データを入れることに成功しました"
以下のコマンドで、embulkを実行します。
java -jar embulk-{embulkのバージョン}.jar run ファイル名
bigquery_to_mysql_report_daily_session_raw.yml.liquid
今回は一例として、BigQueryから日別のセッション数を取得し、それをデータベースに挿入する方法を紹介します。
in: type: bigquery project: 'sample' keyfile: ./keyfile.json sql: | SELECT DATE(timestamp_micros(event_timestamp), 'Asia/Tokyo') AS report_date, 'SERVICE' AS service, platform, device.category AS device_category, CASE WHEN device.operating_system IS NULL THEN 'UNDEFINED' ELSE device.operating_system END AS device_os, COUNT(*) AS session_count FROM `analytics_153613109.events_*` WHERE _TABLE_SUFFIX = '{{ env.REPORT_DATE }}' AND event_name = 'session_start' GROUP BY report_date, platform, device.category, device.operating_system ; columns: - {name: report_date, type: string} - {name: platform, type: string} - {name: device_category, type: string} - {name: device_os, type: string} - {name: user_count, type: long} out: type: mysql host: test user: test password: password database: test_db table: report_daily_active_user_raw mode: merge column_options: report_date: {value_type: string, timestamp_format: '%Y-%m-%d'}
embulkでは、in
とout
に分けて実装をしました。
今回のin句では、BigQueryから日別のセッション数を取得しました。この時の./keyfile.json
には、BigQueryからデータを取得するためのクレデンシャル情報が書かれています。
また、out句では、MySQLへデータを入れるための実装を行っています。必要に応じて、パスワードなどは環境変数に置き換えてください。
docker-compose.yaml
docker-compose.yamlの実装例です。
name: 'sample_service' services: embulk: build: context: . dockerfile: Dockerfile image: latest tty: true
最後に、docker-composeを実行し、実際にデータが入ることが確認できたら、実装完了です。
最後に
今回は、embulkでBigQueryからデータベースにデータを移行しました。embulkを使うことで、簡単にデータ移行できます。機会があったら、ぜひ皆さんも使ってみてください。