Hadoop distcp hftphdfsクロスクラスターコピーの一般的な問題が要約されています



Hadoop Distcp Hftp Hdfs Cross Cluster Copy Common Problems Are Summarized



部門間のデータ協力を行うプロセスでは、クラスターの異なるバージョン間でデータをコピーし、hadoop2.6.0-cdh5.7.0からhadoop2.7.1にデータをコピーし、発生した問題と解決策を記録する必要があります。 。

distcpの基本的な使用法

たとえば、Aクラスター(srcクラスター)のA1ディレクトリをBクラスター(宛先クラスター)のB1ディレクトリにコピーします。



1.同じバージョンのクラスターコピー(hdfsプロトコル)

destクラスター(ターゲットクラスター)でコマンドを実行します。



hadoop distcp hdfs :/10.190.11.303:3333 / user / common / liming / A1 / hdfs://10.120.20.22/user/zhangsan/B1/

ここで、10.190.11.303はsrcクラスターのnamenodeアドレスであり、3333はsrcクラスターのrpcポート(hdfs-site.xmlで表示可能)です。10.120.20.22はdestクラスターのnamenodeIPアドレスです。

2.クロスクラスターバージョンコピー(hftpプロトコル)



また、destクラスター(ターゲットクラスター)でコマンドを実行します。

hadoop distcp hftp ://10.190.11.303: 50070 / user / common / liming / A1 / hdfs://10.120.20.22/user/zhangsan/B1/

hdfsに似ていますが、ターゲットクラスターの先頭が使用されます hftp 、およびポートをhttpポートに変更する必要があります(hdfs-site.xmlで表示できます。構成されていない場合は、構成する必要があります)。

注:hadoop 2.6.0やhadoop2.7.0のように、クラスター間のバージョンスパンが大きくない場合は、hdfsプロトコルも使用できます。

質問1:Java.net.SocketTimeoutException:接続がタイムアウトしました

理由分析:ログは、接続がタイムアウトしたことを示しています。 hftpプロトコルコピーを使用し、srcクラスターの10.190.11.303の50070ポートに接続する必要があります。このとき、接続がタイムアウトし、関連する機関が開かれていないことを示しています。

解決策:O&Mに連絡して、destクラスター内のすべてのnamenodeのポート50070のファイアウォールをsrcクラスターに開きます。ファイアウォールがオンになっていてもこの問題が引き続き発生する場合は、srcクラスターのiptablesを変更し、destクラスターのすべてのマシンをiptablesに追加できます。

問題2:org.apache.hadoop.ipc.StandbyException://s.apache.org/sbnn-error

理由分析:「s.apache.org/sbnn-error」を検索して、それがWebサイトであることを確認します。ちなみに、「http://s.apache.org/sbnn-error」にアクセスすると、自動的ににジャンプします。 Apacheのwikiページ、表示:

3.17。 「操作カテゴリREAD / WRITEはステートスタンバイではサポートされていません」というメッセージはどういう意味ですか?

HA対応クラスターでは、DFSクライアントは、特定の時間にどのネームノードがアクティブであるかを事前に知ることができません。したがって、クライアントがネームノードに接続し、それがたまたまスタンバイである場合、READまたはWRITE操作は拒否され、このメッセージはログに記録されます。その後、クライアントは自動的に他のネームノードに接続し、操作を再試行します。クラスタ内にアクティブなネームノードとスタンバイのネームノードが1つある限り、このメッセージは無視しても問題ありません。

一般的な考え方では、DFSクライアントはアクティブなネームノードを認識しないため、クライアントがスタンバイネームノードに接続すると、読み取りまたは書き込み操作が拒否され、このログが出力されます。クライアントは自動的に別のネームノードに接続し、操作を再開します。

しかし実際には、別のネームノードを自動的に接続していないので、その理由はわかりません。

解決策:ネームノードを変更して、新しいネームノードがアクティブであることを確認します。 hadoop distcp hftpを使用する準備ができました:// 積極的な目的 :50070 /パス...。

質問3:java.net.UnknowHostException

理由分析:distcpジョブが開始され、マップ0%であることがわかりますが、UnknowHostException:pslaves55が報告されています。考えられる理由は、データノードからデータをフェッチするときにホストpslave55が使用され、このホストがsrcクラスターに固有であるためです。はい、destクラスターは認識されないため、UnknowHostExceptionが報告されます。

解決策:destクラスター内のhostsファイルを構成し、srcクラスター内のすべてのホストとIP間の対応をdestクラスター内のhostsファイルに追加して、ホスト名にアクセスするときにdestクラスターが自動的にipにマップできるようにします( pslave55として)。

質問4:マップ後に接続が100%タイムアウトします Java.net.SocketTimeoutException:接続がタイムアウトしました

エラー分析:マップが100%完了しました。これは、データの読み取りが完了したが、ターゲットクラスターに書き込まれていないことを示し、ターゲットクラスターに問題があることを示しています。

正しい分析:インターネット上で関連情報が見つからなかったため、hadoopソースコードをダウンロードし、RetriableFileCopyCommand.javaのソースコードを確認しました。以下に示すように、エラーの場所は行302です。

コードを引き続き見てください。getInputStreamメソッドの接続タイムアウトがfs.open(パス)の行であると報告することができます。関連するソースコードの調査を続け、デバッグ情報をソースコードに追加します。ファイルシステムfsが初期化されていることがわかります。これはHftpFileSystemであり、パスなどの他の変数は正しいです。したがって、これはファイルシステムのopen srcクラスターファイル接続のタイムアウトであり、関連するポートは開いていません。

distcpを実行するときは、tcpdumpを使用して、実際にマップを実行しているマシンとsrcクラスターホストの間のtcp接続を取得します。次の図に示すように、データ長= 0であり、実際のコピーデータがないこともわかります。

解決策:destクラスター内のすべてのデータノードのhttp関連のポートをsrcクラスターに開きます(デフォルトは50075です)。

(このプロジェクトでは、destクラスター内のすべてのデータノードの制御ポート50010を誤ってsrcクラスターに開いてから、hdfsプロトコルを実行してクラスターバージョン間でデータをコピーしたため、50075ポートを開くことはありません。)

質問5:java.io.IOException:チェックサムの不一致

分析:この問題は非常に一般的であり、Hadoopの異なるバージョンのチェックサムバージョンが異なるため、オンラインで見つけることができます。古いバージョンはcrc32を使用し、新しいバージョンはcrc32cを使用します。

異なるバージョンのソースクラスターと宛先クラスターの間でdistcpを実行すると、以下の例外が発生する場合があります。これは、古いバージョンから新しいバージョンへのMRV2(YARN)を使用するdistcpが、これらのチェックサムエラーメッセージで失敗する可能性があるためです。各Hadoopバージョンは、異なるチェックサムバージョンを使用します。古いバージョンはCRC32を使用し、新しいバージョンはCRC32Cを使用します。

差出人:http://www.catchdba.com/2014/03/18/distcp-between-two-different-versions-of-hadoop/

解決策:distcp中に2つのパラメーター(-skipcrccheck -update)を追加し、crcチェックを無視します。有効にするには、-skipcrccheckパラメーターを-updateと一緒に使用する必要があることに注意してください。

総括する

srcクラスターのデータをdestクラスターにコピーするなど、クラスター間のコピーを実行するには、次のことを確認する必要があります。

(1)destクラスターマシンがsrcクラスター内のすべてのIPにpingできることを確認します。

(2)必要に応じて、以下のポートのファイアウォールを開きます。 hdfsプロトコルを使用する場合は1、2アイテムを開く必要があり、hftpプロトコルを使用する場合は少なくとも1、3、4アイテムを開く必要があります。

(3)部門間のポートファイアウォールが開いているが、telnetが異なる場合は、srcクラスターのiptablesがdestクラスターipに追加されていることを確認してください。

(4)destクラスターにUnknowHostExceptionがある場合は、srcクラスターのホストとIP間のマッピング関係をdestクラスターのhostsファイルに追加する必要があります。

(5)org.apache.hadoop.ipc.StandbyExceptionが発生した場合は、別のアクティブなネームノードを試してください。

終了します。

添付: 一般的なHDFSポート構成

参照Webページ:

distcp公式ドキュメント:https://hadoop.apache.org/docs/r1.0.4/cn/distcp.html、https://hadoop.apache.org/docs/r1.2.1/distcp.html

hdfsポート構成:http://www.cnblogs.com/ggjucheng/archive/2012/04/17/2454590.html