---
title: "Oozie スケジューラーに Spark バッチジョブを登録"
slug: "df-use-ex1"
tags: ["Data Forest", "vpc"]
updated: 2026-09-17T09:30:01Z
published: 2026-09-17T09:30:01Z
canonical: "guide.ncloud-docs.com/df-use-ex1"
---
> ## Documentation Index
> Fetch the complete documentation index at: https://guide.ncloud-docs.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Oozie スケジューラーに Spark バッチジョブを登録
VPC環境で利用できます。
Data ForestでSparkバッチ処理をApache Oozieスケジューラーに登録する方法を説明します。このバッチアプリケーションのソースデータは[Elasticsearch](/docs/ja/df-es)に保存されています。

## Step 1. 事前準備
### 1. Data Forestアカウントの作成
- **example**というアカウントを作成します。
- ジョブを提出するためにKerberos Keytabが必要となるため、予めダウンロードします。(**クラスタのアクセス情報** > **Kerberos Keytabのダウンロード**でダウンロードできる)

### 2. Data Forestアプリの作成
- **Elasticsearch**:ソースデータ(ログなど)が溜まる保存場所です。
- **Kibana**:インデックスを検索し、可視化するのに使用します。Kibanaアプリを作成するには、まずElasticsearchアプリを作成する必要があります。**アプリ連携情報**で、予め作成したElasticsearchアプリの名前を選択します。

- **Dev**:Oozieサーバにワークフローを提出するためのクライアントとして使用します。

### 3. サンプルデータの注入
- 別途データ収集モジュールを置かずに、Kibanaアプリで提供する**Sample eCommerce orders**をソースデータとして使用することを例に挙げて説明します。
- Kibana UIで **[Load a data set and a Kibana dashboard]** > **[Sample eCommerce orders]** をクリックしてサンプルインデックスを作成します。
- Kibanaのアドレスは、Kibanaアプリの**Quick links**で確認できます。

## Step 2. Sparkアプリのビルド
実行するSparkアプリをビルドしてください。この例で使用した [Sparkアプリ](https://cdn.document360.io/6998976f-9d95-4df8-b847-d375892b92c2/Images/Documentation/sample-analyzer-1-cbt20210408.tar.gz?sv=2026-02-06&spr=https&st=2026-10-26T14%3A32%3A26Z&se=2026-10-26T15%3A32%3A26Z&sr=c&sp=r&sig=M%2BemMWLDeSLCliARDGLxVxEKAQBKfciUxSSNvNqe42U%3D)は、Elasticsearchに保存されている**kibana_sample_data_ecommerce**インデックスをクレンジングして再度インデックスとして使用するジョブを実行します。実行される時点の24時間前のデータのみ取得して処理した後、再度インデックスとして保存するジョブです。既にビルドされた[JARファイル](https://cdn.document360.io/6998976f-9d95-4df8-b847-d375892b92c2/Images/Documentation/sample-analyzer-1-assembly-0.1.jar?sv=2026-02-06&spr=https&st=2026-10-26T14%3A32%3A26Z&se=2026-10-26T15%3A32%3A26Z&sr=c&sp=r&sig=M%2BemMWLDeSLCliARDGLxVxEKAQBKfciUxSSNvNqe42U%3D)をダウンロードして使用しても構いません。
## Step 3. Oozieコーディネーターでワークフローを実行
すべてのジョブはDevアプリで実行します。Data Forestを使用するためのすべてのクライアント構成がDevアプリにあります。
Oozieは、Apache HadoopのMapReduceジョブフローを管理するスケジューラーシステムです。ワークフローは、フローノード(start、end、decisionなど)とアクションノード(mr、pig、shellなど)で構成されたDAG(Directed Acyclic Graph)です。複数のバッチアプリケーションとそのアプリケーションの前後に必要なスクリプト実行をワークフローに登録すると、フローを一目で把握してモニタリングできます。
以下の図のように簡単な形のワークフローを作成することを例に挙げて説明します。このワークフローが一日に一回ずつ実行されるように、コーディネーターで実行してみます。

### 1. シェルアクションスクリプトの作成
ワークフローにシェルアクションを登録して`spark-submit`を実行する例です。 実行するshスクリプトを作成します。予め作成した`SPARK_JAR`はElasticsearchノードアドレスを引数で取得するため、**Quick links**で**elasticsearch.hosts.inside-of-cluster**を探して使用します。
注意
クラスタの外部からElasticsearchアプリにアクセスする場合には、**elasticsearch.hosts**に明示されたアドレスを使用してください。
**spark_submit_action.sh**
```
#!/bin/sh
CLASS=$1
SPARK_JAR=$2
QUEUE=$3
export HDP_VERSION=3.1.0.0-78
# キータブでKerberos認証
kinit {user name} -kt ./{enter your keytab}
{user name}@KR.DF.NAVERNCP.COM
# Spark設定パス
export SPARK_HOME=./spark2.tar.gz/spark2
export SPARK_CONF_DIR=./spark_conf.tar.gz/conf
# Hadoop設定パス
export HADOOP_CONF_DIR=./hadoop_conf.tar.gz/conf
# Spark作業提出
${SPARK_HOME}/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--queue $QUEUE \
--num-executors 2 \
--executor-memory 1G \
--driver-memory 1G \
--executor-cores 1 \
--name $CLASS \
--class $CLASS \
$SPARK_JAR "{enter your elasticsearch.hosts.inside-of-cluster address}"
```
上記のスクリプトで`SPARK_HOME`、`SPARK_CONF_DIR`、`HADOOP_CONF_DIR`のパスを確認します。スクリプトで使用するすべてのファイルは分散キャッシュにアップロードしたファイルパスです。Data ForestではSparkパッケージを提供しないため、パッケージと構成情報を「tar」で圧縮して[分散キャッシュ](https://oozie.apache.org/docs/4.3.1/WorkflowFunctionalSpec.html#a3.2.2.1_Adding_Files_and_Archives_for_the_Job)にアップロードしてください。アップロードする方法は[ディレクトリの構成と配布](/docs/ja/df-use-ex1#23-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EA%B5%AC%EC%84%B1-%EB%B0%8F-%EB%B0%B0%ED%8F%AC)をご参照ください。
### 2. job.propertiesとworkflow.xml、coordinator.xmlの作成
**job.properties**では、XMLファイルで使用するパラメータを定義します。このファイルは別に配布する必要がなく、Oozie CLIを実行するデバイスにだけ存在すれば良いものです。
```
# cluster configuration
nameNode=hdfs://koya
jobTracker=rm1
# job directory information
homeDir=${nameNode}/user/{user name}/myproject/oozie
workflowDir=${homeDir}/workflow
# oozie configuration
# this is where you deploy coordinator.xml into
oozie.coord.application.path=${homeDir}/coordinator
# user information
user.name= {user name}
# job configuration
class=ecomm.BatchProducerRunnerSpark
queueName=longlived
shellActionScript=spark_submit_action.sh
sparkJar=sample-analyzer-1-assembly-0.1.jar
```
**workflow.xml**は以下のようにシェルアクションを定義できます。job.propertiesに定義したパラメータを使用したことが確認できます。
```
${jobTracker}
${nameNode}
./action.sh
${class}
${sparkJar}
${queueName}
${workflowDir}/${shellActionScript}#action.sh
${workflowDir}/${sparkJar}
${homeDir}/{enter your keytab}
${homeDir}/hadoop_conf.tar.gz
${homeDir}/spark_conf.tar.gz
${homeDir}/spark2.tar.gz
Java failed, error message[${wf:errorMessage(wf:lastErrorNode())}]
```
**coordinator.xml**は、ワークフローをスケジューリングするコーディネーターの明細ファイルです。一日に一回実行されるように設定しました。ワークフローと同様にXML形式です。開始時刻はOozie CLIを実行する際にオプションとして与えます。
```
10
1
${workflowDir}
```
### 3. ディレクトリの構成と配布
1. 以下のようにディレクトリを構成します。(例)
```
hdfs://koya/user/example/myproject/oozie # ユーザーのOozie作業ディレクトリ
├── workflow
│ ├── spark_submit_action.sh # workflow shell actionとして使用されるbashスクリプト
│ ├── sample-analyzer-1-assembly-0.1.jar # spark-submitで実行するJAR
│ └── workflow.xml
├── coordinator
│ └── coordinator.xml
├── spark2.tar.gz # Spark実行JARアーカイブ
├── hadoop_conf.tar.gz # Hadoop Configurationアーカイブ
└── spark_conf.tar.gz # Spark Configurationアーカイブ
```
2. Oozieプロジェクトホームとして使用するディレクトリを作成します。
```
$ hadoop fs -mkdir -p /user/example/myproject/oozie/workflow
$ hadoop fs -mkdir -p /user/example/myproject/oozie/coordinator
```
3. Sparkパッケージをアーカイビングします。
```
$ tar cvfz spark2.tar.gz -C /usr/hdp/3.1.0.0-78/ spark2
```
4. Spark、HadoopのConfigurationをアーカイビングします。デフォルト構成を修正してください。
```
# ユーザーは、/etc/hadoop/conf、/etc/spark2/confの下位のファイルを直接修正できません。
# ファイルをコピーして修正します。
$ mkdir hadoop_conf
$ cp -R /etc/hadoop/conf ./hadoop_conf
$ mkdir spark_conf
$ cp -R /etc/spark2/conf ./spark_conf
```
5. ./spark_conf/conf/spark-env.shで以下の行をコメントとして付けます。 `HADOOP_CONF_DIR`は分散キャッシュパスである必要があるため、以下の情報が入るとファイルを検索できなくなることがあります。
```
# export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-/usr/hdp/3.1.0.0-78/hadoop/conf}
```
6. 修正が完了したらConfigurationファイルもアーカイビングします。
```
$ tar cvfz hadoop_conf.tar.gz -C ./hadoop_conf conf
$ tar cvfz spark_conf.tar.gz -C ./spark_conf conf
```
7. アーカイビングしたパッケージとワークフローを実行するために必要なファイルをすべてHDFSにアップロードします。
```
$ hadoop fs -copyFromLocal -f spark2.tar.gz hadoop_conf.tar.gz \
spark_conf.tar.gz df.test01.keytab /user/example/myproject/oozie
$ hadoop fs -copyFromLocal -f workflow.xml spark_submit_action.sh sample-analyzer-1-assembly-0.1.jar \
/user/example/myproject/oozie/workflow
$ hadoop fs -copyFromLocal -f coordinator.xml /user/example/myproject/oozie/coordinator
```
### 4. ワークフローの実行
Devアプリには**OOZIE_URL**の環境変数が予め設定されています。
```
$ oozie job -oozie $OOZIE_URL -config job.properties -Dstart=`TZ="Asia/Seoul" date "+%Y-%m-%dT%H:00"`+"0900" -run
```
ブラウザで、OOZIE_URLにアクセスして先ほど実行したワークフロー、コーディネーターを確認できます。Resource Managerにアクセスすると、ワークフローに定義した`spark-submit`のシェルアクションからSparkアプリが実行中であることが確認できます。


Sparkアプリが終了すると、**[History Server]** でそのアプリの実行履歴を照会できます。 
## Step 4. Kibanaでデータを確認
Kibanaアプリで`ecomm_data.order.1d.${日付}`形式のインデックスを見つけることができます。
