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

推薦する

枠線や境界線のない iframe を使用するための完全ガイド (実践経験のまとめ)

<iframe src=”ページのURL” width=”100″ height=”30″ f...

サラウンドリフレクションロード効果を実現するHTML+CSS

この記事では、主に html + css を使用してサラウンド リフレクション ローディング エフェ...

JS 面接の質問: forEach はループから抜け出すことができますか?

この質問をされたとき、私は無知で頭が真っ白になりました。もちろん、正しく答えられませんでした。私はず...

CSS はスクロールバーを非表示にしてコンテンツをスクロールする効果を実現します (3 つの方法)

フロントエンド開発では、スクロールバーを非表示にしながらスクロールをサポートしなければならないという...

Vue におけるキープアライブ マルチレベル ルーティング キャッシュの問題

目次1. 問題の説明2. 原因分析3. 解決策4. 処理1. 問題の説明調整センターでは、最後の 2...

ウェブ計算機を実装するためのjs

HTML、CSS、JS を使用してシンプルな Web 計算機を作成する方法は?コンピュータには次の...

CentOS 8 に Postfix メール サーバーをインストールして設定する方法

Postfix は、Linux システム上で電子メールをルーティングまたは配信するために使用される無...

ROS2のインストールとdocker環境の使い方について

目次Docker を使用する理由は何ですか? DockerのインストールROSイメージを取得するRO...

Vue3 の使用 (パート 1) Vue CLI プロジェクトの作成

目次1. 公式ドキュメント2. Vue CLIプロジェクトを作成する1. Vue CLIをインストー...

docker-compsoe を使用してフロントエンドとバックエンドを分離したプロジェクトをデプロイする方法

事前に言っておくDocker を使用すると非常にシンプルなデプロイメント環境を実現できることは誰もが...

vue 要素 el-transfer にドラッグ機能を追加

コア資産管理プロジェクトでは、el-transfer にドラッグ アンド ドロップによる並べ替えと、...

CSS3は光る境界線効果を実現します

操作効果: html <!-- この要素は表示されません。DOM は JavaScript に...

Docker で SVN サーバーを構築するチュートリアル

SVN は Subversion の略称で、ブランチ管理システムを使用して効率的に管理するオープンソ...

MySql 5.6.36 64 ビット グリーン バージョンのインストール グラフィック チュートリアル

MySQL のインストールについてはインターネット上に多くの記事がありますが、今日ノート PC にイ...