このトピックでは、DataFlow クラスターの使用に関するよくある質問 (FAQ) に回答します。
-
クラスターの使用と操作:
-
ジョブの問題:
-
アップストリームおよびダウンストリームストレージ (コネクタ) の問題をトラブルシューティングするにはどうすればよいですか?
-
DataFlow クラスターの Flink ジョブがパスワードなしで OSS の読み書きを試みたときにエラーが発生した場合はどうすればよいですか?
-
Flink UI で、Records Received がゼロのジョブに対してオペレーターが 1 つしか表示されないのはなぜですか?
-
「java.lang.OutOfMemoryError: GC overhead limit exceeded」エラーを解決するにはどうすればよいですか?
-
「Exception in thread 'main' java.lang.NoSuchFieldError: DEPLOYMENT_MODE」エラーを解決するにはどうすればよいですか?
-
クラスターログの表示
JobManager のステータスに基づいてログを表示します:
-
Flink クラスターの JobManager が終了している場合は、
yarn logs -applicationId application_xxxx_yyコマンドを実行してログをローカルマシンにプルして表示できます。また、YARN Web UI で完了したジョブのログリンクにアクセスして、Web ブラウザーでログを表示することもできます。 -
Flink クラスターの JobManager がまだ実行中の場合は、次のいずれかの方法があります:
-
対応する Flink Web UI にアクセスしてログを表示します。
-
コマンドラインツールを使用します。
yarn logs -applicationId application_xxxx_yy -am ALL -logFiles jobmanager.logを実行して JobManager のログを表示するか、yarn logs -applicationId application_xxxx_yy -containerId container_xxxx_yy_aa_bb -logFiles taskmanager.logを実行して TaskManager のログを表示します。
-
JAR パッケージの競合の解決
この問題は、通常、ジョブログに NoSuchFieldError/NoSuchMethodError/ClassNotFoundException などのエラーを引き起こします。この問題をトラブルシューティングして解決するには、次の手順に従ってください:
-
競合する依存関係クラスを特定します。エラーメッセージの例外クラスに基づいて、このクラスを含む依存関係の JAR パッケージを見つけます。次に、ジョブの
pom.xmlファイルがあるディレクトリでmvn dependency:treeを実行して、依存関係ツリーを表示し、その起点を特定します。 -
競合する依存関係クラスを除外します。
-
pom.xmlファイルで JAR パッケージのスコープが誤って設定されている場合は、スコープをprovidedに変更して JAR パッケージを除外します。 -
例外クラスを含む JAR パッケージを使用する必要がある場合は、除外ルールを追加して、競合するクラスを含む依存関係を除外します。
-
例外クラスを使用する必要があり、クラスターの対応するバージョンに置き換えることができない場合は、Maven Shade Plugin を使用してクラスをシェーディングします。
さらに、クラスパスに JAR パッケージの複数のバージョンが存在する場合、ジョブで使用されるクラスのバージョンはクラスの読み込み順序に依存します。特定のクラスがどの JAR パッケージから読み込まれるかを確認するには、flink-conf.yaml ファイルで JVM パラメーター
env.java.opts: -verbose:classを設定するか、動的パラメーター-Denv.java.opts="-verbose:class"を指定して、読み込まれたクラスとそのソースを出力します。説明JobManager または TaskManager の場合、この情報は
jobmanager.outまたはtaskmanager.outファイルに出力されます。 -
外部マシンからのジョブの送信
外部マシンから DataFlow クラスターにジョブを送信するには、次の手順に従ってください:
-
外部マシンがネットワーク経由で DataFlow クラスターに接続できることを確認してください。
-
Flink ジョブを送信するクライアントマシンで Hadoop YARN 環境を設定します。
DataFlow クラスターでは、Hadoop YARN ソフトウェアは
/opt/apps/YARN/yarn-currentディレクトリにインストールされ、その設定ファイルは/etc/taihao-apps/hadoop-conf/ディレクトリにあります。クライアントマシンにyarn-currentディレクトリとhadoop-confディレクトリをダウンロードする必要があります。次に、クライアントマシンで次の環境変数を設定します。
export HADOOP_HOME=/path/to/yarn-current && \ export PATH=${HADOOP_HOME}/bin/:$PATH && \ export HADOOP_CLASSPATH=$(hadoop classpath) && \ export HADOOP_CONF_DIR=/path/to/hadoop-conf重要yarn-site.xmlなどの Hadoop 設定ファイルでは、ResourceManager などのサービスアドレスに完全修飾ドメイン名 (FQDN) を使用します。例:master-1-1.c-xxxxxxxxxx.cn-hangzhou.emr.aliyuncs.com。外部マシンからジョブを送信する場合は、これらの FQDN が解決可能であることを確認するか、設定ファイル内の FQDN を対応する IP アドレスに置き換えてください。 -
設定が完了したら、外部マシンで Flink ジョブを開始します。たとえば、
flink run -d -t yarn-per-job -ynm flink-test $FLINK_HOME/examples/streaming/TopSpeedWindowing.jarコマンドを実行します。その後、DataFlow クラスターの YARN Web UI で対応する Flink ジョブを確認できます。
外部マシンからのクラスターホスト名の解決
外部マシンから DataFlow クラスターのホスト名を解決するには、次のいずれかの方法があります:
-
クライアントマシンの
/etc/hostsファイルを編集して、ホスト名と IP アドレスのマッピングを追加します。 -
Alibaba Cloud DNS PrivateZone が提供する DNS サービスを使用します。
独自のドメイン名解決サービスがある場合は、次の JVM ランタイムパラメーターを設定して使用することもできます。
env.java.opts.client: "-Dsun.net.spi.nameservice.nameservers=xxx -Dsun.net.spi.nameservice.provider.1=dns,sun -Dsun.net.spi.nameservice.domain=yyy"
Flink ジョブのステータスの確認
-
E-MapReduce (EMR) コンソールを使用します。
EMR は Knox をサポートしており、インターネット経由で YARN や Flink などのサービスの Web UI にアクセスできます。YARN を通じて Flink Web UI にアクセスできます。詳細については、「Web UI でジョブステータスを表示」をご参照ください。
-
SSH トンネルを使用します。詳細については、「SSH トンネルを作成してオープンソースコンポーネントの Web UI にアクセスする」をご参照ください。
-
YARN REST API に直接アクセスします。
curl --compressed -v -H "Accept: application/json" -X GET "http://master-1-1:8088/ws/v1/cluster/apps?states=RUNNING&queue=default&user.name=***"説明YARN REST API にアクセスするには、セキュリティグループでポート 8443 と 8088 へのアクセスが許可されていることを確認してください。または、DataFlow クラスターとクライアントノードが同じ Virtual Private Cloud (VPC) 内にあることを確認してください。
Flink ジョブログへのアクセス
-
実行中のジョブの場合、Flink Web UI を通じてそのログにアクセスできます。
-
完了したジョブの場合、Flink HistoryServer でその統計情報を表示するか、
yarn logs -applicationId application_xxxx_yyyyコマンドを実行してそのログにアクセスできます。完了したジョブのログは、デフォルトで HDFS クラスターのhdfs:///tmp/logs/$USERNAME/logs/ディレクトリに保存されます。
Flink HistoryServer へのアクセス
DataFlow クラスターは、デフォルトで master-1-1 ノード (マスターサーバーグループの最初のマシン) のポート 18082 で Flink HistoryServer を起動します。このサーバーは、完了したジョブの統計情報を収集します。アクセスするには、次の手順に従ってください:
-
master-1-1ノードのポート 18082 へのアクセスを許可するセキュリティグループルールを設定します。 -
http://$master-1-1-ip:18082に直接アクセスします。
Flink HistoryServer は、完了したジョブの詳細なログを保存しません。ログを表示するには、YARN API または YARN Web UI を使用してください。
商用コネクタの使用
DataFlow クラスターは、Hologres、SLS、MaxCompute、DataHub、Elasticsearch、ClickHouse など、多くの商用コネクタを提供します。Flink ジョブでは、オープンソースのコネクタに加えて、これらの商用コネクタを使用できます。次の例は、付属の Hologres コネクタの使用方法を示しています。
-
ジョブ開発
-
DataFlow クラスターから商用コネクタの JAR パッケージをダウンロードします (場所は
/opt/apps/FLINK/flink-current/opt/connectorsディレクトリ)。次に、次のコマンドを実行して、ローカルの Maven 環境にコネクタをインストールしてください。mvn install:install-file -Dfile=/path/to/ververica-connector-hologres-1.13-vvr-4.0.7.jar -DgroupId=com.alibaba.ververica -DartifactId=ververica-connector-hologres -Dversion=1.13-vvr-4.0.7 -Dpackaging=jar -
プロジェクトの
pom.xmlファイルに次の依存関係を追加してください。<dependency> <groupId>com.alibaba.ververica</groupId> <artifactId>ververica-connector-hologres</artifactId> <version>1.13-vvr-4.0.7</version> <scope>provided</scope> </dependency>
-
-
ジョブの実行
-
方法 1:
-
Hologres コネクタを別のディレクトリにコピーしてください。
hdfs mkdir hdfs:///flink-current/opt/connectors/hologres/ hdfs cp hdfs:///flink-current/opt/connectors/ververica-connector-hologres-1.13-vvr-4.0.7.jar hdfs:///flink-current/opt/connectors/hologres/ververica-connector-hologres-1.13-vvr-4.0.7.jar -
ジョブを送信する際に、コマンドに次のパラメーターを追加してください。
-D yarn.provided.lib.dirs=hdfs:///flink-current/opt/connectors/hologres/
-
-
方法 2:
-
Hologres コネクタを、ジョブ送信クライアントの /opt/apps/FLINK/flink-current/opt/connectors/ververica-connector-hologres-1.13-vvr-4.0.7.jar ディレクトリにコピーします。このディレクトリ構造は、DataFlow クラスター内のものと一致している必要があります。
-
ジョブを送信する際に、コマンドに次のパラメーターを追加してください。
-C file:///opt/apps/FLINK/flink-current/opt/connectors/ververica-connector-hologres-1.13-vvr-4.0.7.jar
-
-
方法 3:Hologres コネクタをジョブの JAR パッケージにパッケージ化します。
-
GeminiStateBackend の使用
DataFlow クラスターは、オープンソース版の 3~5 倍のパフォーマンスを提供するエンタープライズ級の GeminiStateBackend を提供します。DataFlow クラスターは、デフォルトで GeminiStateBackend を使用します。GeminiStateBackend の高度な設定に関する詳細については、「エンタープライズ級のステートバックエンド設定」をご参照ください。
オープンソースのステートバックエンドの使用
DataFlow クラスターは、デフォルトでエンタープライズ級の GeminiStateBackend を使用します。特定のジョブで rocksdb などのオープンソースのステートバックエンドを使用したい場合は、-D フラグを使用して指定できます。例:
flink run-application -t yarn-application -D state.backend=rocksdb /opt/apps/FLINK/flink-current/examples/streaming/TopSpeedWindowing.jar
または、この変更を後続のすべてのジョブに有効にするには、EMR コンソールに移動し、state.backend パラメーターの値を目的のステートバックエンド (たとえば rocksdb) に変更してください。Save をクリックし、次に Deploy Client Configuration をクリックしてください。
クライアントログの表示
EMR クラスター環境では、FLINK_LOG_DIR 環境変数が Flink クライアントログの保存場所を指定します。そのデフォルト値は /var/log/taihao-apps/flink です (3.43.0 より前のバージョンでは、デフォルトは /mnt/disk1/log/flink でした)。SQL Client ログなどの完全なクライアントログを表示する必要がある場合は、このディレクトリで対応するファイルを見つけることができます。
ジョブパラメーターが有効にならない問題
コマンドラインから Flink ジョブを実行する場合、ジョブパラメーターを Flink ジョブの JAR パッケージの後に配置してください。例:flink run -d -t yarn-per-job test.jar arg1 arg2。
「Multiple factories...」エラーの解決
-
原因
このエラーは、クラスパスにコネクタの複数の実装が含まれていることを示します。これは通常、ジョブの JAR パッケージにコネクタの依存関係を追加し、同時に同じコネクタの依存関係を
$FLINK_HOME/libディレクトリに手動で配置した場合に発生し、依存関係の競合を引き起こします。 -
解決策
解決策は、重複する依存関係を削除することです。詳細なトラブルシューティング手順については、「ジョブの JAR パッケージがクラスターの Flink JAR パッケージと競合した場合はどうすればよいですか?」をご参照ください。
JobManager HA の有効化
DataFlow クラスターは、YARN モードで Flink ジョブをデプロイして実行します。コミュニティの設定ガイドに従って、JobManager の高可用性 (HA) を有効にすることで、より安定した Flink ジョブの実行が可能になります。以下は設定例です。
high-availability: zookeeper
high-availability.zookeeper.quorum: 192.168.**.**:2181,192.168.**.**:2181,192.168.**.**:2181
high-availability.zookeeper.path.root: /flink
high-availability.storageDir: hdfs:///flink/recovery
高可用性を有効にすると、デフォルトでは JobManager は障害時に最大 1 回再起動します。JobManager を複数回再起動させたい場合は、YARN の yarn.resourcemanager.am.max-attempts パラメーターと Flink の yarn.application-attempts パラメーターも設定する必要があります。詳細については、「Apache Flink の公式ドキュメント」をご参照ください。経験上、JobManager が継続的に再起動するのを防ぐために、yarn.application-attempt-failures-validity-interval パラメーターの値をデフォルトの 10,000 ミリ秒 (10 秒) から 300,000 ミリ秒 (5 分) などのより大きな値に増やすことを推奨します。
Flink ジョブのメトリクスの表示
-
EMR コンソールで、ターゲットクラスターの Monitoring ページに移動して、Metric Monitoring をクリックしてください。
-
[Dashboard] ドロップダウンリストから [FLINK] を選択してください。
-
表示したいジョブのアプリケーション ID とジョブ ID を選択してください。すると、ジョブのモニタリングメトリクスが表示されます。
説明-
アプリケーション ID とジョブ ID のオプションは、クラスターで Flink ジョブが実行されている場合にのみ利用可能です。
-
sourceIdleTimeのような一部のメトリクスは、対応するソースとシンクが設定されている場合にのみ生成されます。
-
コネクタの問題のトラブルシューティング
アップストリームおよびダウンストリームストレージに関する一般的な質問については、「コネクタ」をご参照ください。
パスワードなしの OSS アクセスでのエラーの解決
特定のエラーメッセージに基づいて問題を処理してください:
-
エラーメッセージ:
java.lang.UnsupportedOperationException: Recoverable writers on Hadoop are only supported for HDFS-
原因:DataFlow クラスターは、組み込みの JindoSDK を使用して、OSS へのパスワードなしのアクセスと StreamingFileSink などの API をサポートします。コミュニティドキュメントに記載されているような追加の設定を行う必要はありません。これを行うと、依存関係の競合が発生し、このエラーが発生する可能性があります。
-
解決策:クラスターのジョブ送信マシンで、
$FLINK_HOME/pluginsディレクトリにoss-fs-hadoopディレクトリがあるかどうかを確認します。存在する場合は、そのディレクトリを削除してジョブを再送信してください。
-
-
エラーメッセージ:
Could not find a file system implementation for scheme 'oss'. The scheme is directly supported by Flink through the following plugin: flink-oss-fs-hadoop. ....-
原因:バージョン 3.40 以前の EMR クラスターでは、
master-1-1以外のマスターサーバーグループのマシンに Jindo 関連の JAR パッケージがない場合があります。 -
解決策:
-
EMR 3.40 以前の場合:ジョブ送信マシンの
$FLINK_HOME/libディレクトリに jindo-flink-4.0.0-full.jar などの Jindo 関連の JAR パッケージが存在するかどうかを確認します。存在しない場合は、次のコマンドを実行して必要な JAR パッケージを$FLINK_HOME/libディレクトリにコピーして、ジョブを再送信してください。cp /opt/apps/extra-jars/flink/jindo-flink-*-full.jar $FLINK_HOME/lib -
EMR 3.40 より後のバージョンの場合:
-
Flink on YARN モードの場合:新しいバージョンでは OSS サポートのメカニズムが最適化されています。OSS の読み書きを行うジョブは、
$FLINK_HOME/libディレクトリに Jindo 関連の JAR パッケージが存在しなくても正常に実行できます。 -
その他のデプロイメントモードの場合:ジョブ送信マシンの
$FLINK_HOME/libディレクトリに jindo-flink-4.0.0-full.jar などの Jindo 関連の JAR パッケージが存在するかどうかを確認します。存在しない場合は、次のコマンドを実行して$FLINK_HOME/libディレクトリにコピーして、ジョブを再送信してください。cp /opt/apps/extra-jars/flink/jindo-flink-*-full.jar $FLINK_HOME/lib
-
-
-
「TaskManager heartbeat timed out」エラーの解決
-
原因
直接的な原因は TaskManager のハートビートのタイムアウトです。TaskManager のログで特定のエラーメッセージを確認することで、正確な原因を特定できます。その他の潜在的な原因には、TaskManager のヒープメモリ不足や、ジョブコードのメモリリークによるメモリ不足 (OOM) エラーなどがあります。詳細については、「「java.lang.OutOfMemoryError: GC overhead limit exceeded」エラーを解決するにはどうすればよいですか?」をご参照ください。
-
解決策
このエラーが発生した場合は、メモリ割り当てを増やすか、ジョブのメモリ使用量を分析して問題をさらに診断してください。
「GC overhead limit exceeded」エラーの解決
-
原因
このエラーは、ジョブに割り当てられたメモリが不足しているために、ガベージコレクター (GC) に時間がかかりすぎていることを示します。一般的な原因には、コード (UDF など) のメモリリークや、ジョブの要件に対して設定されたメモリが不足していることなどがあります。
-
解決策
-
ジョブを再実行する前に、-D フラグを使用して次の JVM パラメーターを指定して、OutOfMemoryError が発生したときにヒープダンプが保存されるようにしてください:
-D env.java.opts="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/dump.hprof"。 -
flink-conf.yamlファイルにパラメーターenv.java.opts: -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/dump.hprofを追加して、OutOfMemoryError 時にヒープダンプを構成してください。
エラーが再度発生した後、MAT や jvisualvm などのツールを使用して
HeapDumpPathで指定されたヒープダンプファイルを分析し、根本原因を特定できます。 -
単一オペレーターのジョブで「Records Received」がゼロになる問題
これは正常な動作です。Flink の Records Received メトリクスは、異なるオペレーター間のデータ通信を表します。ジョブが単一のオペレーターに最適化されると、このメトリクスは常に 0 になります。
Flink ジョブのフレームグラフの有効化
フレームグラフは、プロセス内のさまざまなメソッドの CPU 消費量を可視化し、パフォーマンスのボトルネックを特定して解決するのに役立ちます。Flink はバージョン 1.13 以降でフレームグラフをサポートしていますが、本番ジョブへの影響を避けるために、この機能はデフォルトで無効になっています。フレームグラフを使用してジョブのパフォーマンスを分析する必要がある場合は、EMR コンソールの Flink サービスの Configure タブに移動してください。[flink-conf.yaml] ファイルで、パラメーター rest.flamegraph.enabled を持つ新しい設定項目を追加して、その値を true に設定してください。設定項目の追加手順については、「設定項目の管理」をご参照ください。
フレームグラフの詳細については、「フレームグラフ」をご参照ください。
「NoSuchFieldError: DEPLOYMENT_MODE」エラーの解決
-
原因
ジョブの JAR パッケージに、クラスター内の Flink バージョンと互換性のない
flink-core依存関係が直接的または間接的に含まれており、依存関係の競合を引き起こしています。 -
解決策
pom.xmlファイルに次の設定を追加して、flink-core依存関係のscopeをprovidedに設定してください。これにより問題が解決します。<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-core</artifactId> <!-- 実際の Flink バージョンに変更してください --> <version>1.16.1</version> <scope>provided</scope> </dependency>説明versionをご自身の Flink バージョンに変更する必要があります。この依存関係のソースをさらに特定するには、「ジョブの JAR パッケージがクラスターの Flink JAR パッケージと競合した場合はどうすればよいですか?」をご参照ください。