Q : ジョブと実行プランの値がいいは何ですか。

A : EMR では、ジョブを実行するために 2 つのステップが必要です。
  • ジョブの作成

    EMR では、"ジョブ" を作成すると直接実行できない "ジョブ実行設定" が作成されます。 EMR では "ジョブ" を作成することにより、"ジョブの実行方法に関する設定" を作成することになります。 ジョブの設定には、ジョブのために実行される Job JAR、データの入出力アドレス、および特定の実行パラメーターを指定する必要があります。 そのような設定を作成してそれに名前を付けると、ジョブが定義されます。 ただし、実行中のジョブをデバッグする場合は実行プランが必要となります。

  • 実行プランの作成

    実行プランは、ジョブをクラスターに関連付けます。 実行プランを介して、複数のジョブを 1 つのジョブシーケンスに組み合わせ、そのジョブ用に実行中のクラスターを準備することができます。 実行によって一時的なクラスターが自動的に作成されたり、ジョブが既存のクラスターに関連付けられたりすることもあります。 また、実行プランはジョブシーケンス用の定期的な実行プランの設定に役立ち、クラスターはタスクが完了すると自動的に解放されます。 実行レコード一覧で実行ステータスとログエントリを閲覧することも可能です。

Q : ジョブログエントリの閲覧方法を教えてください。

A : EMR システムでは、jobid でジョブ実行中のログエントリを OSS にアップロードしました。 パスは、クラスター作成時にユーザーが設定します。 Web ページ上で直接ジョブログを表示することができます。 ジョブをサブミットしたりスクリプトを実行したりするためにマスターノードにログオンすれば、スクリプトでログを特定できます。

Q : コアノードにログオン方法を教えてください。.

A : 以下の手順に従います。
  1. マスターノードの hadoop アカウントに切り替えます。
    su hadoop
  2. パスワードなしの SSH 認証を使用して対応するコアノードにログオンします。
    ssh emr-worker-1
  3. sudo コマンドで root 権限を取得します。
    sudo vi /etc/hosts

Q : OSS でログを閲覧する方法を教えてください。

A : OSS から直接すべてのログファイルを見つけてダウンロードすることもできます。 ただし、OSS はログを直接表示しないため、使用しづらくなることもあります。 ロギングを有効にして OSS のログの場所を指定した場合、どうすればジョブログエントリを見つけられるでしょうか。 たとえば、OSS://mybucket/emr/spark のパスを指定したとします。
  1. 1. 実行プランページに移動し、対応する実行プランを見つけて、[レコードの表示] をクリックし実行ログページを入力します。
  2. 2. 実行ログページで、最後の実行ログエントリなど特定のログエントリを探します。. 対応する [実行クラスター] をクリックして、実行クラスターの ID を表示します。
  3. 3. 次に OSS://mybucket/emr/spark ディレクトリの下のクラスター ID ディレクトリ OSS://mybucket/emr/spark/ を検索します。
  4. 4. ジョブの実行 ID に応じて OSS://mybucket/emr/spark/cluster ID/jobs の下にある複数のディレクトリが表示されます。各ディレクトリには、ジョブの実行ログファイルが保存されています。

Q : クラスター、実行プラン、実行ジョブのスケジューリングポリシーとは何ですか。

A : 以下のとおり利用可能なスケジューリングポリシーは 3 つあります。
  • クラスターのスケジューリングポリシー

    クラスター一覧では、各クラスターの実行時間を確認できます。 実行時間の計算式は以下のとおりです。実行時間 = クラスターが解放される時間 - クラスターが作成された時間 クラスターの作成と同時にスケジューリングが開始され、クラスターのライフサイクルが終了するまで続きます。

  • 実行プランのスケジューリングポリシー
    実行プランの実行ログ一覧では、すべての実行プランの実行時間を確認でき、タイミングポリシーは 2 つの状況に要約できます。
    • 1. 実行プランがオンデマンドで実行される場合、実行ログの実行プロセスには、クラスターの作成、ジョブのサブミット、ジョブの実行、およびクラスターの解放が含まれます。 オンデマンド実行プランの計算式は、以下のとおりです。実行時間 = クラスターが作成された時間 + 実行計画内のすべてのジョブの実行に使用される合計時間 + クラスターが解放される時間
    • 2. 実行プランが既存のクラスターに関連付けられている場合、クラスターの作成と解放は全体の実行サイクルに含まれません。 この場合は、実行時間 = 実行プラン内のすべてのジョブの実行に使用される合計時間、となります。
  • 実行中のジョブのタイミングポリシー

    指定済みのジョブとは、実行プランに割り当てられているジョブのことです。 ジョブを参照するには、実行プランの実行ログの右側にある [ジョブリストの表示] をクリックします。 各ジョブの実行時間を計算する式は以下のとおりです。実行時間=ジョブが実行を停止する実際の時間 - ジョブが実行を開始する実際の時間。 ジョブが開始または停止する指定済みの時間とは、Spark または Hadoop クラスターによってジョブの実行または停止がスケジューリングされている時間のことです。

Q : 実行プランの初回実行時に利用可能なセキュリティグループがないのはなぜですか。

A : セキュリティ上の理由で、既存のセキュリティグループを直接 EMR セキュリティグループとして使用することはできません。 そのため、EMR でセキュリティグループを作成していないと、利用可能なセキュリティグループを選択できません。テスト用のオンデマンドクラスターを作成するよう推奨します。 新しい EMR セキュリティグループはクラスターを作成するときに作成できます。 テストに合格後、実行プランをスケジューリングするスケジューリングサイクルを設定できます。 以前に作成したセキュリティグループも利用可能です。

Q : MaxCompute の読み取り・書き込み時に "java.lang.RuntimeException.Parse responsed failed: ‘<!DOCTYPE html>…’ のエラーメッセージ が返されます。DOCTYPE html>…’" is returned when reading and writing MaxCompute .

A : odps トンネルエンドポイントが正しいかどうか確認します。 間違っているとこのエラーが発生します。

Q : 複数のコンシューマー ID が同じトピックを消費すると、TPSの競合が発生します。

A : このトピックがベータテストその他の環境で作成されたことが原因で特定の消費者グループの消費データが競合する可能性があります。 チケットを起票して ONS に対応するトピックとコンシューマー ID をご報告・お問い合わせください。

Q : EMR のワーカーノードのジョブログエントリを閲覧できますか。

A:はい、できます。 前提条件 : クラスターを作成するときに [ログの保存] をクリックします。 ログエントリの閲覧方法 : [実行プラン一覧] > [もっと見る] > [ログの実行] > [ログの実行] > [ジョブ一覧の表示] > [ジョブ一覧] > [ワーカーログ] の順に選択します。

Q : Hiveで作成された外部テーブルにデータが含まれていないのはなぜですか。

A : 例を挙げます。
CREATE EXTERNAL TABLE storage_log(content STRING) PARTITIONED BY (ds STRING)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\t'
    STORED AS TEXTFILE
    LOCATION 'oss://log-124531712/biz-logs/airtake/pro/storage'; 
    hive> select * from storage_log;
    OK
    所要時間: 0.3 秒
    作成した外部テーブルにはデータがありません。
Hive は指定されたディレクトリのパーティションディレクトリに自動的にバインドすることはありません。 手動でバインドする必要があります。たとえば以下のように記述します。
alter table storage_log add partition(ds=123);                                                                                                                                             OK
    所要時間 : 0.137 秒
    hive> select * from storage_log;
    OK
    abcd    123
    efgh    123

Q : Spark Streaming ジョブが特に理由もなく停止するのはなぜですか。

A : まず現在の Spark のバージョンが 1.6 より前かどうか確認します。 Spark バージョン 1.6 では、メモリリークのバグが修理されています。 このバグが原因でコンテナーのメモリ使用量が過剰に上昇し、ジョブが中断される恐れがあります。 このエラーが原因の 1 つである可能性があり、つまり Spark 1.6 に問題がないわけではありません。 また、メモリ使用量を最適化するためコードを確認する必要があります。

Q : Spark Streaming ジョブの終了時点で、ジョブのステータスが EMR コンソール上でまだ実行中になっているのはなぜですか。

A:Spark Streaming ジョブの実行モードが yarn-client かどうか確認してください。 Spark Streaming ジョブの実行モードを yarn-cluster に設定します。 yarn-client モードにある Spark Streaming ジョブのステータスをモニタリングしていると EMR ではエラーが発生します。 この問題は早急に修理の対応をします。

Q : "エラー: メインクラスが見つからない、または読み込めません" のエラーメッセージが返されるのはなぜですか。

A : ジョブ設定で Job Jar のパスプロトコルヘッダーが ossref かどうか確認します。 ossref でない場合は ossref に変更します。

Q : クラスター内のマシンの役割分担はどうなっていますか。

A : EMR には、マスターノードと複数のスレーブまたはワーカーノードがあります。 マスターノードはデータ保存またはコンピューティングのタスクを担当しません。 データ保存またはコンピューティングのタスクはスレーブノードが担当します。 たとえば、4 コア 8 GB のマシンが 3 台あるクラスターでは、1 台がマスタノードとして、他の 2 台がスレーブノードとして機能します。 この場合、このクラスターで利用可能なコンピューティングリソースは、2 台の 4 コア 8 GB マシンです。

Q : ローカルの共有ライブラリを MR ジョブで使用する方法を教えてください。

A : 以下に例を示しますが使用できる方法は複数あります。たとえば、mapred-site.xml ファイルを変更します。
<property>  
    <name>mapred.child.java.opts</name>  
    <value>-Xmx1024m -Djava.library.path=/usr/local/share/</value>  
  </property>  
  <property>  
    <name>mapreduce.admin.user.env</name>  
    <value>LD_LIBRARY_PATH=$HADOOP_COMMON_HOME/lib/native:/usr/local/lib</value>  
  </property>

必要に応じてライブラリを追加してローカル共有ライブラリファイルを使用できます。

Q : MR または Spark ジョブで OSS データソースファイルパスを指定する方法を教えてください。

A : 以下の OSS URL: oss://[accessKeyId:accessKeySecret@]bucket[.endpoint]/object/path を使用できます。

ジョブ内で入出力データソースを指定するために使用される URI で、hdfs:// と類似しています。 OSS データの操作時はこの手順に従います。
  • (推奨される方法) EMR は、AssessKey なしで OSS データへのアクセス、 // bucket/Object/pathパス上のファイルへの直接書き込みが可能になる MetaService を提供しています。
  • (推奨されない方法) AccessKeyId、AccessKeySecret、および設定 (Spark ジョブの SparkConf、MR ジョブの設定) へのエンドポイントを設定、または AccessKeyId、AccessKeySecret、および URL のエンドポイントを直接指定できます。 詳細は、「開発の準備 (Development preparation)」セクションをご参照ください。

Q : Spark SQL から "スレッド "メイン" java.sql.SQLException で例外が発生しました : jdbc:mysql:xxx の適切なドライバが見つかりません" のエラーメッセージが返ってくるのはなぜでしょうか。

A :
  • 1. mysql-connector-java の以前のバージョンではこのような問題が発生する場合があります。 mysql-connector-java を最新のバージョンにアップデートしましょう。
  • 2. ジョブパラメーターで —driver-class-path ossref://bucket/…/mysql-connector-java-[version].jar を使用して mysql-connector-java パッケージをロードします。 また、mysql-connector-java パッケージを直接 Job Jar にインストールするとこの問題が発生することもあります。

Q : Spark SQL を RDS に接続すると "サーバーのメッセージです。権限付与が正しく指定されていません。IP がホワイトリストに登録されていません" のエラーメッセージが返ってくるのはなぜですか。

A : RDS ホワイトリストの設定を確認し、クラスターマシンの内部ネットワーク IP アドレスを RDS ホワイトリストに追加します。

Q : 設定が低構成の複数台のマシンにクラスターを作成する場合の注意事項を教えてください。

A :
  • マスターノードに 2 コア 4 GB のマシンを選択する場合、マスターノードはメモリが高負荷状態になります。 これはメモリ不足の原因になりかねません。 マスターノードのメモリキャパシティを増設するよう推奨します。
  • スレーブノードに 2 コア 4 GB マシンを選択する場合、MR または Hive のジョブを実行するときはパラメーターを調整します。 MR ジョブの場合は -D yarn.app.mapreduce.am.resource.mb=1024 パラメーターを追加します。 Hive ジョブの場合は set yarn.app.mapreduce.am.resource.mb=1024 パラメーターを追加します。 この調整によりジョブの中断を防止できます。

Q : Spark SQL でインポートした Parquet テーブルを Hive または Impala のジョブで読み込むと "例外 java.io.IOException:org.apache.parquet.io.ParquetDecodingException で障害が発生しました。hdfs ファイルのブロック -1 に 0 の値を読み込めません// ... /…/part-00000-xxx.snappy.parquet" のエラーメッセージが返されるのはなぜでしょうか。/…/part-00000-xxx.snappy.parquet" returned when Hive or Impala jobs reads Parquet tables that are imported by Spark SQL ?

A : 10 進型で書き込む場合、Hive および Spark SQL は異なる変換方法を使用します。 この違いが原因で Hive が Spark SQL によってインポートされるデータを正しく読み取れない場合があります。 Hive または Impala で Spark SQL を使用してインポートされたデータを使用する必要がある場合は、spark.sql.parquet.writeLegacyFormat=true パラメーターを追加してからデータを再度インポートするよう推奨します。

Q : Beeline で Kerberos セキュリティクラスターへアクセスする方法について教えてください。

A :
  • HA クラスター (ディスカバリーモード)
    
    ! connect jdbc:hive2://emr-header-1:2181,emr-header-2:2181,emr-header-3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;principal=hive/_HOST@EMR.${clusterId). COM
  • HA cluster (directly connected to a machine)

    Connect to emr-header-1.

    ! connect jdbc:hive2://emr-header-1:10000/;principal=hive/emr-header-1@EMR.${clusterId}. COM
    Connect to emr-header-2.
    ! connect jdbc:hive2://emr-header-2:10000/;principal=hive/emr-header-2@EMR.${clusterId}. COM
  • 非 HA クラスター
    ! connect jdbc:hive2://emr-header-1:10000/;principal=hive/emr-header-1@EMR.${clusterId}. COM