Sqoop エクスポート マップ 100% 削減 0% さまざまな理由と解決策でスタック

Sqoop エクスポート マップ 100% 削減 0% さまざまな理由と解決策でスタック

私はこのようなバグを典型的な「ハムレット」バグと呼んでいます。これは、「エラーメッセージは同じだが、インターネット上にはさまざまな解決策があり、どれが問題の核心なのか疑問に思うようなバグ」を意味します。

まず、インポート コマンドを見てみましょう。

[root@host25 ~]# 
sqoop エクスポート --connect "jdbc:mysql://172.16.xxx.xxx:3306/dbname?useUnicode=true&characterEncoding=utf-8" 
--username=root --password=xxxxx --table ルールタグ --update-key ルールコード 
--update-mode 挿入を許可する 
--export-dir /user/hive/warehouse/lmj_test.db/rule_tag --input-fields-terminated-by '\t' 
--input-null-string '\\N' --input-null-non-string '\\N' -m1

このインポート コマンドは構文的に正しいです。

次のエラーは次のとおりです:

# 部分を抽出 19/06/11 09:39:57 INFO mapreduce.Job: ジョブを追跡するための URL: http://dthost25:8088/proxy/application_1554176896418_0537/
19/06/11 09:39:57 INFO mapreduce.Job: 実行中のジョブ: job_1554176896418_0537
19/06/11 09:40:05 INFO mapreduce.Job: ジョブ job_1554176896418_0537 が uber モードで実行中: false
19/06/11 09:40:05 INFO mapreduce.Job: map 0% Reduce 0%
19/06/11 09:40:19 INFO mapreduce.Job: map 100%、reduce 0%
19/06/11 09:45:34 INFO mapreduce.Job: タスク ID: attempt_1554176896418_0537_m_000000_0、ステータス: 失敗
試行ID: 試行_1554176896418_0537_m_000000_0 300秒後にタイムアウトしました
19/06/11 09:45:36 INFO mapreduce.Job: map 0% Reduce 0%
19/06/11 09:45:48 INFO mapreduce.Job: map 100%、reduce 0%
19/06/11 09:51:04 INFO mapreduce.Job: タスク ID: attempt_1554176896418_0537_m_000000_1、ステータス: 失敗
試行ID: 試行_1554176896418_0537_m_000000_1 300秒後にタイムアウトしました
19/06/11 09:51:05 INFO mapreduce.Job: map 0% Reduce 0%
19/06/11 09:51:17 INFO mapreduce.Job: map 100%、reduce 0%
19/06/11 09:56:34 INFO mapreduce.Job: タスク ID: attempt_1554176896418_0537_m_000000_2、ステータス: 失敗
試行ID: 試行_1554176896418_0537_m_000000_2 300秒後にタイムアウトしました
19/06/11 09:56:35 INFO mapreduce.Job: map 0% Reduce 0%
19/06/11 09:56:48 INFO mapreduce.Job: map 100%、reduce 0%
19/06/11 10:02:05 INFO mapreduce.Job: ジョブ job_1554176896418_0537 が失敗しました。原因: タスクが失敗しました task_1554176896418_0537_m_000000
タスクが失敗したためジョブが失敗しました。failedMaps:1 failedReduces:0
19/06/11 10:02:05 INFO mapreduce.Job: カウンター: 9
 ジョブカウンター 
 失敗したマップタスク = 4
 開始されたマップタスク = 4
 その他のローカルマップタスク=3
 データローカルマップタスク=1
 すべてのマップが占有スロットに費やした合計時間 (ミリ秒) = 2624852
 占有スロットですべての削減に費やされた合計時間 (ミリ秒) = 0
 すべてのマップタスクに費やされた合計時間 (ミリ秒) = 1312426
 すべてのマップ タスクで使用された合計 vcore 秒数 = 1312426
 すべてのマップタスクにかかった合計メガバイト秒数 = 2687848448
19/06/11 10:02:05 警告 mapreduce.Counters: グループ FileSystemCounters は非推奨です。代わりに org.apache.hadoop.mapreduce.FileSystemCounter を使用してください
19/06/11 10:02:05 INFO mapreduce.ExportJobBase: 1,333.3153 秒で 0 バイト転送されました (0 バイト/秒)
19/06/11 10:02:05 警告 mapreduce.Counters: グループ org.apache.hadoop.mapred.Task$Counter は非推奨です。代わりに org.apache.hadoop.mapreduce.TaskCounter を使用してください
19/06/11 10:02:05 INFO mapreduce.ExportJobBase: 0 件のレコードがエクスポートされました。
19/06/11 10:02:05 ERROR tool.ExportTool: エクスポート中にエラーが発生しました: エクスポート ジョブが失敗しました。
所要時間: 1340秒 
タスク IDE_TASK_ADE56470-B5A3-4303-EA75-44312FF8AA0C_20190611093945147 が完了しました。

インポート タスクが INFO mapreduce.Job: map 100% Reduce 0% で停止し、5 分間停止していることがわかります。その後、タスクは自動的に再起動され、さらに 5 分間停止しました。最後に、タスクはタイムアウト エラーを報告しました。

タスク失敗の直接的な原因は明らかにタイムアウトですが、タイムアウトの理由はインポート プロセスの MapReduce タスクがスタックしていることです。なぜ MapReduce がスタックするのでしょうか?これはエラーログには記載されておらず、原因を確認する際に最も面倒な部分です。

まず結果をお伝えします。長い間調べた結果、1行のデータ長がMySQLで設定されているフィールド長を超えたことが原因であることがわかりました。つまり、「文字列は非常に長い、非常に長い、非常に長い、非常に長い、非常に長い、非常に長い、非常に長い」という文字列をvarchar(50)フィールドにインポートすると、タスクがブロックされます。

ここではネット上に溢れている様々な理由をまとめてみました。一つずつ確認してみてください。

マップ 100% 削減 0% で停止する考えられる理由: (MySQL エクスポートを例に挙げます)

1. 長さのオーバーフロー。インポートされたデータがMySQLテーブルに設定されたフィールド長を超えています

解決策: フィールドの長さをリセットする

2. コーディングエラー。インポートされたデータはMySQLのエンコード文字セットではありません

解決策: 実際、MySQL データベースの UTF-8 文字セットに対応するエンコーディングは utf8 ではなく、utf8mb4 です。したがって、インポートしたデータに絵文字表現や珍しい中国語の文字が含まれている場合、そのデータはインポートされずにブロックされます。したがって、次の 2 つの点に注意する必要があります。

(1)インポート文でUseUnicode=true&characterEncoding=utf-8が指定されており、エクスポートがUTF-8形式であることを示しています。

(2)MySQLテーブル作成文ではENGINE=InnoDB DEFAULT CHARSET=utf8mb4が設定されている。

3. メモリ不足。インポートするデータの量が大きすぎるか、割り当てられたメモリが小さすぎる可能性があります。

解決策: バッチでインポートするか、タスクにさらにメモリを割り当てます

4. ホスト名が間違っています。

解決策: これはホスト名の設定に問題があるようです

5. 主キーが繰り返されます。

解決策: これは、インポートしたデータに重複した主キー値があるためです。それに応じてデータを処理する必要があります。

補足: Sqoop がデータベースから HDFS にデータをエクスポートするときに MapReduce が停止する問題の解決方法

sqoop 中にデータベースからデータをエクスポートすると、mapreduce が停止します

Baidu で検索したところ、yarn でメモリと仮想メモリに関する設定項目を設定する必要があるようです。以前はこれらの項目を設定していなかったのですが、問題なく動作しました。しかし今回は規模が大きくなりそうです。この障害は、各 Docker に割り当てられたメモリと CPU リソースが小さすぎて、Hadoop と Hive を実行するためのデフォルトのリソース要件を満たさないために発生する可能性があります。

解決策は次のとおりです。

yarn-site.xml に次の構成を追加します。

<プロパティ> 
 <name>yarn.nodemanager.resource.memory-mb</name> 
 <値>20480</値> 
</プロパティ> 
<プロパティ> 
 <name>yarn.scheduler.最小割り当て MB</name> 
 <値>2048</値> 
</プロパティ> 
<プロパティ> 
 <name>yarn.nodemanager.vmem-pmem-ratio</name> 
 <値>2.1</値> 
</プロパティ> 

yarn をシャットダウンして再起動するだけです。 ! !

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • Hadoop クラスタ環境での MySQL 用 Sqoop のインストールと設定に関するチュートリアル
  • sqoop が postgresql からデータを取得し、TCP/IP 接続エラーを報告する問題を解決する
  • PostgreSQL データベース テーブルを読み取り、それを HDF にインポートする sqoop の実装
  • Sqoop を Hive にインポートした後にデータ量が増加する問題を解決する
  • Sqoop は PostgreSQL テーブルを Hive テーブルにインポートする実装です。
  • シェル スクリプトを使用して hive および sqoop コマンドを実行する方法
  • Sqoopのインストールと使用に関する詳細なチュートリアル

<<:  Vue3 (パート 2) Ant Design Vue の統合

>>:  HTML テーブルタグチュートリアル (35): 列間属性 COLSPAN

推薦する

Tomcat をアンインストールして再インストールする方法 (画像とテキスト付き)

tomcat9をアンインストールする1. Tomcatのインストールはディレクトリに解凍するだけで...

js 正規表現の先読みと後読み、および非キャプチャグループ化

目次先読みと後読みをキャプチャグループと組み合わせる捕獲グループと非捕獲グループ前を向いて、後ろを振...

MySQLはトリガーを使用してデータベース内のテーブルの行制限を解決します。詳細な説明と例

MySQLはトリガーを使用してデータベース内のテーブルの行制限を解決します。詳細な説明と例最近のプロ...

ウェブマスターが注目すべき、ウェブサイトのユーザビリティを向上させる 9 つのコード最適化のヒント

1. ロゴに代替テキストを追加するこれには 2 つの利点があります。スクリーン リーダーがロゴ画像の...

WeChatミニプログラムマップの使い方を詳しく解説

この記事の例では、WeChatアプレットマップで使用される具体的な実装コードを参考までに共有していま...

既存のDockerコンテナの内容を変更する方法

1. Docker psはコンテナをリストします 2. Docker cpはコンテナにファイルをコピ...

CSS で画像アダプティブ コンテナを実装するためのサンプル コード

多くの場合、画像をコンテナのサイズに合わせて調整する必要があります。 1. imgタグ方式幅と高さを...

HTMLはマーキーを使用してテキストを左右にスクロールします

コードをコピーコードは次のとおりです。 <本文> //マーキーの助けを借りて<MA...

Linux システムで Tomcat のポート 80 を使用する方法

アプリケーションシナリオ多くの場合、Linux サーバーに tomcat や nginx などのソフ...

Linux に ASPNET.Core3.0 ランタイムをインストールするためのサンプル コード

# 以下の例は x64 ビット ランタイム v3.0.0 用です mkdir /runtimes ...

MySQL 5.7.20 の解凍バージョンをインストールするための詳細な手順 (2 つの方法)

Windows 64ビットでのMySQLのインストールについて説明します。5.7以降、MySQLの...

nginx で HSTS を有効にしてブラウザを HTTPS アクセスにリダイレクトする方法の詳細な説明

前回の記事では、https を使用したローカルノードサービスアクセスを実装しました。前回の記事の効果...

div ボックス モデルの使用経験の概要

ボックスモデルの計算<br />マージン + ボーダー + パディング + コンテンツC...

圧縮パッケージを使用して Linux 環境に JDK 13 をインストールする方法

JDK とは何ですか?まあ、この質問がわからないのであれば、なぜこれをインストールするのか本当にわか...

MySQL マスタースレーブレプリケーションスレッドの状態遷移に関する詳細な理解

序文MySQL マスター スレーブ レプリケーションの基本原理は、スレーブ データベースがマスター ...