すべてのプロダクト
Search
ドキュメントセンター

DataWorks:EMR MR ノードの作成

最終更新日:Jun 22, 2026

E-MapReduce (EMR) MR ノードは、大規模なデータセットを複数の並列マップタスクに分割して、大規模計算を高速化します。このトピックでは、Object Storage Service (OSS) からテキストを読み取り、単語をカウントする WordCount の例を使用して EMR MR ノードを作成する方法を示します。

前提条件

  • EMR クラスターが DataWorks に登録されている必要があります。詳細については、「DataStudio (旧バージョン): EMR 計算リソースのバインド」をご参照ください。

  • (任意、RAM ユーザー向け) タスク開発用の RAM ユーザーは、ワークスペースのメンバーであり、Development または スペースマネージャー のロールを持っている必要があります。ワークスペース管理者ロールには広範な権限があるため、慎重に割り当ててください。詳細については、「ワークスペースへのメンバーの追加」をご参照ください。

  • サーバーレスリソースグループを購入し、ワークスペースのバインディングやネットワーク設定を含めて構成する必要があります。詳細については、「サーバーレスリソースグループの使用」をご参照ください。

  • データ開発 (DataStudio) でワークフローを作成する必要があります。詳細については、「ワークフローの作成」をご参照ください。

  • EMR MR ノードジョブがオープンソースコードを参照する必要がある場合は、まずそのコードを EMR JAR リソースノードにリソースとしてアップロードする必要があります。詳細については、「EMR リソースの作成と使用」をご参照ください。

  • EMR MR ノードジョブがユーザー定義関数 (UDF) を参照する必要がある場合は、まず UDF を EMR JAR リソースノードにリソースとしてアップロードし、次に関数を作成して登録する必要があります。詳細については、「EMR 関数の作成」をご参照ください。

  • このトピックのジョブ開発例を実行する場合は、まず OSS バケットを作成する必要があります。詳細については、「コンソールでのバケットの作成」をご参照ください。

制限事項

  • このタイプのタスクは、サーバーレスリソースグループ (推奨) または専用スケジューリングリソースグループでのみ実行できます。

  • DataWorks で DataLake またはカスタムクラスターのメタデータを管理するには、まずクラスターに EMR-HOOK を構成する必要があります。EMR-HOOK がないと、DataWorks はリアルタイムのメタデータを表示したり、監査ログを生成したり、データリネージを表示したり、EMR 関連のガバナンスタスクを実行したりできません。EMR-HOOK の構成方法の詳細については、「Hive 用の EMR-HOOK の構成」をご参照ください。

サンプルデータと JAR パッケージの準備

サンプルデータの準備

input01.txt という名前のサンプルファイルを次の内容で作成します。

hadoop emr hadoop dw
hive hadoop
dw emr

サンプルデータファイルのアップロード

  1. OSS コンソールにログインします。左側のナビゲーションウィンドウで、[バケット] をクリックします

  2. 対象のバケット名をクリックして、File Management ページを開きます。

    このトピックでは、onaliyun-bucket-2 という名前のバケットを例として使用します。

  3. New Directory をクリックして、サンプルデータと JAR リソース用のディレクトリを作成します。

    • [ディレクトリ名]emr/datas/wordcount02/inputs に設定して、サンプルデータ用のディレクトリを作成します。

    • JAR リソース用のディレクトリを作成するには、[ディレクトリ名]emr/jars に設定します。

  4. サンプルデータファイルをデータディレクトリにアップロードします。

    • /emr/datas/wordcount02/inputs パスに移動し、Upload File をクリックします。

    • [アップロードするファイル] エリアで [ファイルを選択] をクリックし、input01.txt ファイルをバケットに追加してから、Upload File をクリックします。

MapReduce JAR パッケージのビルド

  1. IntelliJ IDEA プロジェクトを開き、次の POM 依存関係を追加します。

            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-mapreduce-client-common</artifactId>
                <version>2.8.5</version> <!-- EMR MR uses version 2.8.5. -->
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-common</artifactId>
                <version>2.8.5</version>
            </dependency>
  2. MapReduce で OSS ファイルの読み書きを行うには、次のパラメーターを設定する必要があります。

    重要

    リスク警告:Alibaba Cloud アカウントの AccessKey は、すべての API へのフルアクセス権を持っています。API アクセスや日常の運用保守には RAM ユーザーを使用することを推奨します。AccessKey ID と AccessKey Secret をプロジェクトコード内や漏洩の可能性のある場所に保存しないでください。AccessKey が漏洩すると、アカウント配下のすべてのリソースのセキュリティが侵害される可能性があります。以下のコードサンプルは参考用です。AccessKey 情報は安全に保管してください。

    conf.set("fs.oss.accessKeyId", "${accessKeyId}");
    conf.set("fs.oss.accessKeySecret", "${accessKeySecret}");
    conf.set("fs.oss.endpoint","${endpoint}");

    次の表にパラメーターを示します。

    • ${accessKeyId}:ご利用の Alibaba Cloud アカウントの AccessKey ID。

    • ${accessKeySecret}:ご利用の Alibaba Cloud アカウントの AccessKey Secret。

    • ${endpoint}:OSS エンドポイント。OSS バケットは EMR クラスターと同じリージョンにある必要があり、このリージョンによってエンドポイントが決まります。詳細については、「リージョンとエンドポイント」をご参照ください。

    以下の Java コードは、公式の Hadoop ウェブサイトの WordCount の例を変更する方法を示しています。AccessKey ID と AccessKey Secret を追加して、ジョブに OSS ファイルへのアクセス権限を付与します。

    サンプルコード

    package cn.apache.hadoop.onaliyun.examples;
    import java.io.IOException;
    import java.util.StringTokenizer;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.Mapper;
    import org.apache.hadoop.mapreduce.Reducer;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    import org.apache.hadoop.util.GenericOptionsParser;
    public class EmrWordCount {
        public static class TokenizerMapper
                extends Mapper<Object, Text, Text, IntWritable> {
            private final static IntWritable one = new IntWritable(1);
            private Text word = new Text();
            public void map(Object key, Text value, Context context
            ) throws IOException, InterruptedException {
                StringTokenizer itr = new StringTokenizer(value.toString());
                while (itr.hasMoreTokens()) {
                    word.set(itr.nextToken());
                    context.write(word, one);
                }
            }
        }
        public static class IntSumReducer
                extends Reducer<Text, IntWritable, Text, IntWritable> {
            private IntWritable result = new IntWritable();
            public void reduce(Text key, Iterable<IntWritable> values,
                               Context context
            ) throws IOException, InterruptedException {
                int sum = 0;
                for (IntWritable val : values) {
                    sum += val.get();
                }
                result.set(sum);
                context.write(key, result);
            }
        }
        public static void main(String[] args) throws Exception {
            Configuration conf = new Configuration();
            String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
            if (otherArgs.length < 2) {
                System.err.println("Usage: wordcount <in> [<in>...] <out>");
                System.exit(2);
            }
            conf.set("fs.oss.accessKeyId", "${accessKeyId}"); // 
            conf.set("fs.oss.accessKeySecret", "${accessKeySecret}"); // 
            conf.set("fs.oss.endpoint", "${endpoint}"); //
            Job job = Job.getInstance(conf, "word count");
            job.setJarByClass(EmrWordCount.class);
            job.setMapperClass(TokenizerMapper.class);
            job.setCombinerClass(IntSumReducer.class);
            job.setReducerClass(IntSumReducer.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            for (int i = 0; i < otherArgs.length - 1; ++i) {
                FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
            }
            FileOutputFormat.setOutputPath(job,
                    new Path(otherArgs[otherArgs.length - 1]));
            System.exit(job.waitForCompletion(true) ? 0 : 1);
        }
    }          
  3. コードを JAR ファイルにパッケージ化します。

    Java コードを編集して保存した後、JAR ファイルにパッケージ化します。この例で生成される JAR パッケージの名前は onaliyun_mr_wordcount-1.0-SNAPSHOT.jar です。

ステップ 1:EMR MR ノードの作成

  1. [DataWorks コンソール] にログインします。対象のリージョンで、左側のナビゲーションウィンドウで データ開発と О&М > データ開発 をクリックします。ドロップダウンリストからワークスペースを選択し、入力 データ開発 をクリックします。

  2. EMR MR ノードを作成します。

    1. 対象のワークフローを右クリックし、Create Node > EMR > EMR MR を選択します。

      説明

      または、Create アイコンにポインターを合わせ、Create Node > EMR > EMR MR を選択することもできます。

    2. Create Node ダイアログボックスで、Name を入力し、Engine InstanceNode TypePath を選択します。[確認] をクリックして EMR MR ノードエディターを開きます。

      説明

      ノード名には、英字、数字、アンダースコア (_)、ピリオド (.) を使用できます。

ステップ 2:EMR MR タスクの開発

EMR MR ノードエディターで、作成したノードをダブルクリックしてタスク開発ページを開きます。シナリオに基づいて、次のいずれかのオプションを選択します。

オプション 1:リソースのアップロードと参照

ローカルマシンから DataStudio にリソースをアップロードして、ノードで参照できます。リソースが大きすぎてコンソール経由でアップロードできない場合は、HDFS に保存し、代わりにコードから参照します。

  1. EMR JAR リソースを作成します。

    詳細については、「EMR リソースの作成と使用」をご参照ください。この例では、サンプルデータと JAR パッケージの準備セクションで生成された JAR パッケージは、emr/jars ディレクトリに保存されます。この機能を初めて使用するときは、Authorize をクリックし、次に Click Upload をクリックして JAR リソースをアップロードします。左側のワークフローナビゲーションツリーで、[リソース] を右クリックして [リソースの作成] ダイアログボックスを開きます。[エンジンタイプ][EMR] に、[リソースタイプ][EMR JAR] に設定します。[ストレージパス] には、[OSS のワンクリック承認] を選択します。ファイルをアップロードし、その [名前]onaliyun_mr_wordcount-1.0-SNAPSHOT.jar に設定してから、[作成] をクリックします。

  2. EMR JAR リソースを参照します。

    1. 作成した EMR MR ノードを開き、コードエディタに移動します。

    2. EMR > Resources フォルダで、参照するリソース (この例では onaliyun_mr_wordcount-1.0-SNAPSHOT.jar) を見つけ、リソースを右クリックし、Insert Resource Path を選択します。

    3. リファレンスを選択すると、EMR MR ノードのコード編集ページに成功メッセージが表示されます。これは、コードリソースが正常に参照されたことを示しています。次に、以下のコマンドを実行します。以下のコマンドのリソースパッケージ、バケット名、パス情報は例です。これらを実際の情報に置き換える必要があります。

      ##@resource_reference{"onaliyun_mr_wordcount-1.0-SNAPSHOT.jar"}
      onaliyun_mr_wordcount-1.0-SNAPSHOT.jar cn.apache.hadoop.onaliyun.examples.EmrWordCount oss://onaliyun-bucket-2/emr/datas/wordcount02/inputs oss://onaliyun-bucket-2/emr/datas/wordcount02/outputs
      説明

      EMR MR ノードのコードエディターはコメント文をサポートしていません。

オプション 2:OSS REF の使用

OSS REF メソッドを使用して、OSS からリソースを直接参照できます。ノードが実行されると、DataWorks は指定された OSS リソースを自動的にロードしてジョブが使用できるようにします。このメソッドは、EMR タスクが JAR またはスクリプトに依存する場合に適しています。

  1. JAR リソースをアップロードします。

    1. コードを開発した後、OSS コンソールにログインします。 お使いのリージョンの左側のナビゲーションウィンドウで、[バケット] をクリックします。

    2. 対象のバケットの名前をクリックして、File Management ページを開きます。

      このトピックでは、onaliyun-bucket-2 という名前のバケットを例として使用します。

    3. JAR リソースをそのストレージディレクトリにアップロードします。

      emr/jars ディレクトリに移動し、Upload File をクリックします。[アップロードするファイル] エリアで [ファイルの選択] をクリックし、onaliyun_mr_wordcount-1.0-SNAPSHOT.jar ファイルをバケットに追加してから、Upload File をクリックします。

  2. JAR リソースを参照します。

    コードを編集して JAR リソースを参照します。

    EMR MR ノードの構成ページで、コードを編集して JAR リソースを参照します。

    hadoop jar ossref://onaliyun-bucket-2/emr/jars/onaliyun_mr_wordcount-1.0-SNAPSHOT.jar cn.apache.hadoop.onaliyun.examples.EmrWordCount oss://onaliyun-bucket-2/emr/datas/wordcount02/inputs oss://onaliyun-bucket-2/emr/datas/wordcount02/outputs
    説明

    コマンドのフォーマットは次のとおりです:hadoop jar <path_of_the_JAR_file_to_run> <fully_qualified_name_of_the_main_class> <input_directory> <output_directory>

    次の表に、JAR ファイルのパスのパラメーターを示します。

    パラメーター

    説明

    実行する JAR ファイルのパス

    フォーマットは ossref://{endpoint}/{bucket}/{object} です。

    • Endpoint:OSS エンドポイント。このパラメーターは任意です。省略した場合、システムはデフォルトで EMR クラスターのリージョンを使用し、その同じリージョン内の OSS リソースにのみアクセスできます。

    • Bucket:OSS でオブジェクトを格納するためのコンテナ。各 バケット は一意の名前を持ちます。OSS コンソールにログインして、アカウント配下のすべての バケット を表示できます。

    • objectバケット に格納されている特定のオブジェクト (ファイル名やパスなど)。

(任意) 詳細設定の構成

[詳細設定] タブでノード固有のプロパティを構成できます。プロパティの構成方法の詳細については、「Spark Configuration」をご参照ください。利用可能な詳細パラメーターは、次の表に示すように、EMR クラスターのタイプによって異なります。

DataLake およびカスタムクラスター

詳細パラメーター

説明

queue

ジョブが送信されるスケジューリングキュー。デフォルト値は default です。EMR YARN の詳細については、「基本的なキュー構成」をご参照ください。

priority

ジョブの優先度。デフォルト値は 1 です。

その他

[詳細設定] タブで MR タスクのカスタムパラメーターを追加することもできます。コードをコミットすると、DataWorks は -D key=value フォーマットを使用して新しいパラメーターをコマンドに自動的に追加します。

Hadoop クラスター

詳細パラメーター

説明

queue

ジョブが送信されるスケジューリングキュー。デフォルト値は default です。EMR YARN の詳細については、「基本的なキュー構成」をご参照ください。

priority

ジョブの優先度。デフォルト値は 1 です。

USE_GATEWAY

ジョブをゲートウェイクラスター経由で送信するかどうかを指定します。有効な値:

  • true:ゲートウェイクラスター経由でジョブを送信します。

  • false (デフォルト):ゲートウェイクラスター経由でジョブを送信しません。ジョブはデフォルトでマスターノードに送信されます。

説明

ノードが存在するクラスターがゲートウェイクラスターに関連付けられておらず、このパラメーターを手動で true に設定した場合、EMR ジョブの送信は失敗します。

タスクの実行

  1. ツールバーで、高级运行 アイコンをクリックします。Parameter ダイアログボックスで、スケジューリングリソースグループを選択し、Running をクリックします。

    説明
    • パブリックネットワークまたは VPC 経由で計算リソースにアクセスするには、計算リソースとの接続テストに合格したスケジューリング用のリソースグループを使用する必要があります。詳細については、「ネットワーク接続ソリューション」をご参照ください。

    • 後続のタスクでリソースグループを変更する必要がある場合は、[パラメーターを指定して実行] 高级运行 アイコンをクリックし、目的のリソースグループを選択できます。

  2. 保存 アイコンをクリックしてコードを保存します。

  3. (任意) スモークテストの実行。

    開発環境でスモークテストを実行したい場合は、ノードをコミットする前または後に行うことができます。詳細については、「スモークテストの実行」をご参照ください。

ステップ 3:スケジューリングプロパティの構成

システムにノード上のタスクを定期的に実行させたい場合は、ノードの構成タブの右側のナビゲーションウィンドウで [プロパティ] をクリックして、ビジネス要件に基づいてタスクのスケジューリングプロパティを構成できます。詳細については、「概要」をご参照ください。

説明

タスクをコミットする前に、「プロパティ」タブで[再実行]および[親ノード]パラメーターを設定する必要があります。

ステップ 4:タスクのデプロイ

ノード上のタスクが構成された後、タスクをコミットしてデプロイする必要があります。タスクをコミットしてデプロイすると、システムはスケジューリング構成に基づいてタスクを定期的に実行します。

  1. 上部のツールバーにある 保存 アイコンをクリックしてタスクを保存します。

  2. 上部のツールバーにある 提交 アイコンをクリックしてタスクをコミットします。

    [送信] ダイアログボックスで、[変更の説明] パラメーターを設定します。 次に、ビジネス要件に基づいて、タスクのコミット後にタスクコードをレビューするかどうかを決定します。

    説明
    • タスクをコミットする前に、プロパティ タブで [再実行] および [親ノード] パラメーターを設定する必要があります。

    • コードレビュー機能を使用して、タスクのコード品質を確保し、無効なタスクコードによるタスク実行エラーを防ぐことができます。コードレビュー機能を有効にすると、コミットされたタスクコードは、コードレビューに合格した後にのみデプロイできます。詳細については、「コードレビュー」をご参照ください。

標準モードのワークスペースを使用する場合、タスクをコミットしてから本番環境にデプロイする必要があります。ノードにタスクをデプロイするには、ノードの構成タブの右上隅にある [デプロイ] をクリックします。詳細については、「ノードのデプロイ」をご参照ください。

その他の操作

タスクをコミットしてデプロイすると、スケジューリング構成に基づいて定期的に実行されます。対応するノードの構成タブの右上隅にある[オペレーションセンター]をクリックしてオペレーションセンターに移動し、タスクのスケジューリングステータスを表示できます。詳細については、「定期タスクの管理」をご参照ください。

結果の表示

  • OSS コンソールにログインします。バケットの指定されたディレクトリで出力を表示します。パスの例:emr/datas/wordcount02/outputs。wordcount02 ジョブが完了すると、OSS の /emr/datas/wordcount02/outputs/ ディレクトリに _SUCCESS フラグファイルと複数の part-r-* 結果シャードファイルが生成されます。これらのファイルは、ジョブが出力を正常に生成したことを確認します。

  • DataWorks で統計を読み取ります。

    1. EMR Hive ノードを作成します。詳細については、「EMR Hive ノードの作成」をご参照ください。

    2. EMR Hive ノードで、OSS のデータ上に Hive 外部テーブルを作成します。以下はサンプルコードです:

      CREATE EXTERNAL TABLE IF NOT EXISTS wordcount02_result_tb
      (
          `word` STRING COMMENT 'word',
          `cout` STRING COMMENT 'count'   
      ) 
      ROW FORMAT delimited fields terminated by '\t'
      location 'oss://onaliyun-bucket-2/emr/datas/wordcount02/outputs/';
      SELECT * FROM wordcount02_result_tb;

      クエリを実行すると、[結果] タブに単語の出現頻度統計が表示されます:dw (2)、hadoop (3)、emr (2)、hive (1)。