このトピックでは、DataWorks の EMR Hive ノードを使用して、ods_user_info_d_emr ユーザー情報テーブルと ods_raw_log_d_emr アクセスログテーブルからデータを処理する方法について説明します。OSS から同期されたデータを処理して、ユーザープロファイルデータを生成します。
前提条件
開始する前に、「データの同期」の手順を完了してください。
ステップ 1: ワークフローの設計
ワークフローノード間の依存関係を設定するには、「データの同期」をご参照ください。
新しいワークフローをダブルクリックして設定タブを開きます。 New Node をクリックし、[EMR Hive] を選択して、右側のキャンバスにドラッグします。 New Node ダイアログボックスで、ノードの Node Name を入力し、Confirm をクリックします。
3 つの EMR Hive ノードを作成し、dwd_log_info_di_emr、dws_user_info_all_di_emr、ads_user_info_1d_emr という名前を付け、次の依存関係を設定します。
dwd_log_info_di_emr:OSS からの生ログデータをクレンジングします。
dws_user_info_all_di_emr:クレンジングされたログデータと基本ユーザー情報を集計します。
ads_user_info_1d_emr:最終的なユーザープロファイルデータを生成します。
ステップ 2: 関数の作成
生ログデータをターゲット形式に解析する必要があります。このトピックでは、IP アドレスをリージョンに変換するための関数パッケージを提供します。パッケージをダウンロードし、DataWorks で関数として登録し、コード内で呼び出します。
リソースのアップロード
ip2region-emr.jar ファイルをダウンロードします。
DataStudio で WorkShop ワークフローを開き、[EMR] を右クリックして を選択します。新しいリソースのパラメーターを設定し、New をクリックします。
次の表に、主要なパラメーターを示します。
[Storage Path]: 環境の準備時に EMR クラスターに指定した OSS バケットを選択します。
[ファイルのアップロード]:ダウンロードした ip2region-emr.jar ファイルを選択します。
その他のパラメーターは、デフォルト値のままにするか、必要に応じて設定してください。
ツールバーの
アイコンをクリックして、リソースを開発環境の EMR エンジンプロジェクトにコミットします。
関数の登録
DataStudio で、ワークフローを開き、[EMR] を右クリックして、New Function を選択します。
New Function ダイアログボックスで、Function Name を getregion に設定し、New をクリックして関数を設定します。
次の表に、主要なパラメーターを示します。
[Resource]: ip2region-emr.jar を選択します。
[Class Name]:
org.alidata.emr.udf.Ip2Regionを入力します。
その他のパラメーターは、デフォルト値のままにするか、必要に応じて設定してください。
ツールバーの
アイコンをクリックして、関数を開発環境の EMR エンジンプロジェクトにコミットします。
ステップ 3: EMR Hive ノードの設定
dwd_log_info_di_emr ノードの設定
1. コードの編集
[dwd_log_info_di_emr] ノードをダブルクリックして、設定タブを開きます。コードエディターに、次の SQL ステートメントを入力します。
ワークスペースの DataStudio に複数の EMR エンジンがバインドされている場合は、EMR Engine を選択する必要があります。EMR エンジンが 1 つしかバインドされていない場合は、この手順をスキップできます。
-- DWD 層テーブルを作成します。
CREATE TABLE IF NOT EXISTS dwd_log_info_di_emr (
ip STRING COMMENT 'IP アドレス。',
uid STRING COMMENT 'ユーザー ID。',
`time` STRING COMMENT 'yyyymmddhh:mi:ss 形式の時刻。',
status STRING COMMENT 'サーバーから返されたステータスコード。',
bytes STRING COMMENT 'クライアントに返されたバイト数。',
region STRING COMMENT 'IP アドレスに基づいて取得されたリージョン。',
method STRING COMMENT 'HTTP リクエストタイプ。',
url STRING COMMENT 'URL。',
protocol STRING COMMENT 'HTTP プロトコルバージョン。',
referer STRING COMMENT 'ソース URL。',
device STRING COMMENT 'クライアントタイプ。',
identity STRING COMMENT '種別。有効な値: crawler、feed、user、unknown。'
)
PARTITIONED BY (
dt STRING
);
ALTER TABLE dwd_log_info_di_emr ADD IF NOT EXISTS PARTITION (dt='${bizdate}');
set hive.vectorized.execution.enabled = false;
INSERT OVERWRITE TABLE dwd_log_info_di_emr PARTITION (dt='${bizdate}')
SELECT ip
, uid
, tm
, status
, bytes
, getregion(ip) AS region -- UDF を使用して IP アドレスからリージョンを取得します。
, regexp_extract(request, '(^[^ ]+) .*') AS method -- 正規表現を使用してリクエストを 3 つのフィールドに分割します。
, regexp_extract(request, '^[^ ]+ (.*) [^ ]+$') AS url
, regexp_extract(request, '.* ([^ ]+$)') AS protocol
, regexp_extract(referer, '^[^/]+://([^/]+){1}') AS referer -- 正規表現を使用して referer をクレンジングし、より正確な URL を取得します。
, CASE
WHEN lower(agent) RLIKE 'android' THEN 'android' -- agent からクライアントと種別の情報を取得します。
WHEN lower(agent) RLIKE 'iphone' THEN 'iphone'
WHEN lower(agent) RLIKE 'ipad' THEN 'ipad'
WHEN lower(agent) RLIKE 'macintosh' THEN 'macintosh'
WHEN lower(agent) RLIKE 'windows phone' THEN 'windows_phone'
WHEN lower(agent) RLIKE 'windows' THEN 'windows_pc'
ELSE 'unknown'
END AS device
, CASE
WHEN lower(agent) RLIKE '(bot|spider|crawler|slurp)' THEN 'crawler'
WHEN lower(agent) RLIKE 'feed'
OR regexp_extract(request, '^[^ ]+ (.*) [^ ]+$') RLIKE 'feed' THEN 'feed'
WHEN lower(agent) NOT RLIKE '(bot|spider|crawler|feed|slurp)'
AND agent RLIKE '^[Mozilla|Opera]'
AND regexp_extract(request, '^[^ ]+ (.*) [^ ]+$') NOT RLIKE 'feed' THEN 'user'
ELSE 'unknown'
END AS identity
FROM (
SELECT SPLIT(col, '##@@')[0] AS ip
, SPLIT(col, '##@@')[1] AS uid
, SPLIT(col, '##@@')[2] AS tm
, SPLIT(col, '##@@')[3] AS request
, SPLIT(col, '##@@')[4] AS status
, SPLIT(col, '##@@')[5] AS bytes
, SPLIT(col, '##@@')[6] AS referer
, SPLIT(col, '##@@')[7] AS agent
FROM ods_raw_log_d_emr
WHERE dt = '${bizdate}'
) a;2. スケジューリングプロパティの設定
この設定では、日次スケジューリングシナリオを実装します。00:30 に、アップストリームの [ods_raw_log_d_emr] ノードが OSS の [user_log.txt] ファイルから EMR の [ods_raw_log_d_emr] テーブルへのデータ同期を完了した後、[dwd_log_info_di_emr] ノードがトリガーされます。このノードは、[ods_raw_log_d_emr] テーブルからデータを処理し、結果を [dwd_log_info_di_emr] テーブルの対応するパーティションに書き込みます。
パラメーター | 設定 |
[Scheduling Parameters] | Scheduling Parameters セクションで、以下のパラメーターを追加します:
|
[Time attribute] | RUN Attribute を [ステータスに関係なく許可] に設定します。 |
[Scheduling Dependency] | Scheduling Dependency セクションで、ノードの出力テーブルが正しく設定されていることを確認します。 形式は |
時間プロパティでは、Scheduling periodが日単位に設定されている場合、現在のノードにScheduling Timeを別途設定する必要はありません。このノードの毎日の開始時刻は、ワークフロー内の[workshop_start_emr]仮想ノードのスケジュール時刻によって制御されます。つまり、このノードは毎日 00:30 以降にのみ実行されるようにスケジュールされます。
3. 設定の保存
必要に応じて、その他の必要なパラメーターを設定します。設定が完了したら、ツールバーの
アイコンをクリックして、設定を保存します。
dws_user_info_all_di_emr ノードの設定
1. コードの編集
[dws_user_info_all_di_emr] ノードをダブルクリックして、設定タブを開きます。コードエディターに、次の SQL ステートメントを入力します。
ワークスペースの DataStudio に複数の EMR エンジンがバインドされている場合は、EMR Engine を選択する必要があります。EMR エンジンが 1 つしかバインドされていない場合は、この手順をスキップできます。
-- DW 層テーブルを作成します。
CREATE TABLE IF NOT EXISTS dws_user_info_all_di_emr (
uid STRING COMMENT 'ユーザー ID。',
gender STRING COMMENT '性別。',
age_range STRING COMMENT '年齢範囲。',
zodiac STRING COMMENT '星座。',
region STRING COMMENT 'IP アドレスに基づいて取得されたリージョン。',
device STRING COMMENT 'クライアントタイプ。',
identity STRING COMMENT '種別。有効な値: crawler、feed、user、unknown。',
method STRING COMMENT 'HTTP リクエストタイプ。',
url STRING COMMENT 'URL。',
referer STRING COMMENT 'ソース URL。',
`time` STRING COMMENT 'yyyymmddhh:mi:ss 形式の時刻。'
)
PARTITIONED BY (
dt STRING
);
ALTER TABLE dws_user_info_all_di_emr ADD IF NOT EXISTS PARTITION (dt='${bizdate}');
INSERT OVERWRITE TABLE dws_user_info_all_di_emr PARTITION (dt='${bizdate}')
SELECT COALESCE(a.uid, b.uid) AS uid
, b.gender
, b.age_range
, b.zodiac
, a.region
, a.device
, a.identity
, a.method
, a.url
, a.referer
, a.`time`
FROM (
SELECT *
FROM dwd_log_info_di_emr
WHERE dt = '${bizdate}'
) a
LEFT OUTER JOIN (
SELECT *
FROM ods_user_info_d_emr
WHERE dt = '${bizdate}'
) b
ON a.uid = b.uid;2. スケジューリングプロパティの設定
この設定では、日次スケジューリングシナリオを実装します。00:30 に、アップストリームの [ods_user_info_d_emr] および [dwd_log_info_di_emr] タスクが完了した後、[dws_user_info_all_di_emr] ノードがトリガーされます。このノードは、[ods_user_info_d_emr] テーブルと [dwd_log_info_di_emr] テーブルのデータをマージし、結果を [dws_user_info_all_di_emr] テーブルに書き込みます。
パラメーター | 設定 |
[Scheduling Parameters] | Scheduling Parameters セクションに、以下のパラメーターを追加します。
|
[Time attribute] | RUN Attribute を [ステータスにかかわらず許可] に設定します。 |
[Scheduling Dependency] | Scheduling Dependency セクションで、ノードの出力テーブルが正しく設定されていることを確認します。 形式は |
時間プロパティでは、Scheduling periodが日単位に設定されている場合、現在のノードにScheduling Timeを別途設定する必要はありません。このノードの毎日の開始時刻は、ワークフロー内の[workshop_start_emr]仮想ノードのスケジュール時刻によって制御されます。つまり、このノードは毎日 00:30 以降にのみ実行されるようにスケジュールされます。
3. 設定の保存
必要に応じて、その他の必要なパラメーターを設定します。設定が完了したら、ツールバーの
アイコンをクリックして、設定を保存します。
ads_user_info_1d_emr ノードの設定
1. コードの編集
[ads_user_info_1d_emr] ノードをダブルクリックして、設定タブを開きます。コードエディターに、次の SQL ステートメントを入力します。
ワークスペースの DataStudio に複数の EMR エンジンがバインドされている場合は、EMR Engine を選択する必要があります。EMR エンジンが 1 つしかバインドされていない場合は、この手順をスキップできます。
-- RPT 層テーブルを作成します。
CREATE TABLE IF NOT EXISTS ads_user_info_1d_emr (
uid STRING COMMENT 'ユーザー ID。',
region STRING COMMENT 'IP アドレスに基づいて取得されたリージョン。',
device STRING COMMENT 'クライアントタイプ。',
pv BIGINT COMMENT 'ページビュー数。',
gender STRING COMMENT '性別。',
age_range STRING COMMENT '年齢範囲。',
zodiac STRING COMMENT '星座。'
)
PARTITIONED BY (
dt STRING
);
ALTER TABLE ads_user_info_1d_emr ADD IF NOT EXISTS PARTITION (dt='${bizdate}');
INSERT OVERWRITE TABLE ads_user_info_1d_emr PARTITION (dt='${bizdate}')
SELECT uid
, MAX(region)
, MAX(device)
, COUNT(0) AS pv
, MAX(gender)
, MAX(age_range)
, MAX(zodiac)
FROM dws_user_info_all_di_emr
WHERE dt = '${bizdate}'
GROUP BY uid;2. スケジューリングプロパティの設定
アップストリームの [dws_user_info_all_di_emr] ノードが [ods_user_info_d_emr] テーブルと [dwd_log_info_di_emr] テーブルのマージを完了した後、[ads_user_info_1d_emr] ノードがトリガーされ、データをさらに処理して最終的なデータセットを生成します。
パラメーター | 設定 |
[Scheduling Parameters] | Scheduling Parameters セクションで、次のパラメーターを追加します。
|
[Time attribute] | RUN Attribute を [ステータスに関係なく許可] に設定します。 |
[Scheduling Dependency] | Scheduling Dependency セクションで、ノードの出力テーブルが正しく設定されていることを確認します。 形式は |
時間プロパティでは、Scheduling periodが日単位に設定されている場合、現在のノードにScheduling Timeを別途設定する必要はありません。このノードの毎日の開始時刻は、ワークフロー内の[workshop_start_emr]仮想ノードのスケジュール時刻によって制御されます。つまり、このノードは毎日 00:30 以降にのみ実行されるようにスケジュールされます。
3. 設定の保存
必要に応じて、その他の必要なパラメーターを設定します。設定が完了したら、ツールバーの
アイコンをクリックして、設定を保存します。
ステップ 4: ワークフローのコミット
ワークフロー内のすべてのノードを設定したら、ワークフローをテストして、期待どおりに実行されることを確認します。テストが成功したら、ワークフローをコミットしてデプロイします。
ワークフローの設定タブで、
アイコンをクリックして、ワークフローを実行します。ワークフロー内のすべてのノードの横に
アイコンが表示されたら、
アイコンをクリックして、ワークフローをコミットします。Submit ダイアログボックスで、送信するノードを選択し、Ignore I/O Inconsistency Alerts を選択して、Confirm をクリックします。
ワークフローをコミットした後、ノードをデプロイします。
ページの右側でPublishをクリックすると、デプロイメントパッケージページが開きます。
デプロイするノードを選択し、Deploy をクリックします。Confirm Release ダイアログボックスで、Publish をクリックします。
ステップ 5: 本番環境でのタスクの実行
タスクがデプロイされると、システムは翌日に実行されるインスタンスを生成します。デプロイされたワークフローに対してSupplementary dataを実行して、タスクが本番環境で期待どおりに実行されるかどうかを確認できます。詳細については、「データ補完インスタンスの管理」をご参照ください。
タスクがデプロイされた後、右上隅の Operation and Maintenance Center をクリックします。
または、ワークフローの設定タブに移動し、ツールバーのオペレーションに行くをクリックしてOperation and Maintenance Center ページを開きます。
左側のナビゲーションペインで、 を選択すると、定期的なタスク ページに移動します。 workshop_start_emr 仮想ノードをクリックします。
右側の DAG で、workshop_start_emr ノードを右クリックし、 を選択します。
バックフィルするタスクを選択し、ビジネス日付を入力して、Submit and Redirect をクリックします。
「データバックフィル」ページで、すべての SQL タスクが正常に実行されるまでRefreshをクリックし続けます。
次のステップ
スケジュールされたタスクシナリオでは、出力テーブルに対してデータ品質モニタリングを設定して、出力データの品質を検証できます。詳細については、「データ品質モニタリングの設定」をご参照ください。