web-dev-qa-db-ja.com

HDFSエラー:1ではなく0ノードにのみ複製できます

EC2でubuntuシングルノードhadoopクラスターを作成しました。

Hdfsへの単純なファイルアップロードのテストは、EC2マシンでは機能しますが、EC2の外部のマシンでは機能しません。

リモートマシンからWebインターフェイスを介してファイルシステムを参照できます。また、サービス中として報告された1つのデータノードが表示されます。セキュリティ内のすべてのtcpポートを0〜60000(!)で開いているので、それだとは思わない。

エラーが表示されます

Java.io.IOException: File /user/ubuntu/pies could only be replicated to 0 nodes, instead of 1
at org.Apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.Java:1448)
at org.Apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.Java:690)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
at Java.lang.reflect.Method.invoke(Method.Java:597)
at org.Apache.hadoop.ipc.WritableRpcEngine$Server.call(WritableRpcEngine.Java:342)
at org.Apache.hadoop.ipc.Server$Handler$1.run(Server.Java:1350)
at org.Apache.hadoop.ipc.Server$Handler$1.run(Server.Java:1346)
at Java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.Java:396)
at org.Apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.Java:742)
at org.Apache.hadoop.ipc.Server$Handler.run(Server.Java:1344)

at org.Apache.hadoop.ipc.Client.call(Client.Java:905)
at org.Apache.hadoop.ipc.WritableRpcEngine$Invoker.invoke(WritableRpcEngine.Java:198)
at $Proxy0.addBlock(Unknown Source)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
at Java.lang.reflect.Method.invoke(Method.Java:597)
at org.Apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.Java:82)
at org.Apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.Java:59)
at $Proxy0.addBlock(Unknown Source)
at org.Apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.Java:928)
at org.Apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.Java:811)
at org.Apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.Java:427)

namenodeログは同じエラーを出力します。他には面白いものがないようです

何か案は?

乾杯

67
Steve

警告:以下はHDFS上のすべてのデータを破壊します。既存のデータの破壊を気にしない限り、この回答のステップを実行しないでください!!

これを行う必要があります:

  1. すべてのhadoopサービスを停止します
  2. dfs/nameおよびdfs/dataディレクトリを削除します
  3. hdfs namenode -format大文字のYで回答
  4. hadoopサービスを開始する

また、システムのディスク領域をチェックし、ログが警告を発していないことを確認してください。

74
buzypi

これはあなたの問題です-クライアントはデータノードと通信できません。クライアントがデータノード用に受信したIPは、パブリックIPではなく内部IPであるためです。これを見てください

http://www.hadoopinrealworld.com/could-only-be-replicated-to-0-nodes/

DFSClient $ DFSOutputStrem(Hadoop 1.2.1)のソースコードを見てください

//
// Connect to first DataNode in the list.
//
success = createBlockOutputStream(nodes, clientName, false);

if (!success) {
  LOG.info("Abandoning " + block);
  namenode.abandonBlock(block, src, clientName);

  if (errorIndex < nodes.length) {
    LOG.info("Excluding datanode " + nodes[errorIndex]);
    excludedNodes.add(nodes[errorIndex]);
  }

  // Connection failed. Let's wait a little bit and retry
  retry = true;
}

ここで理解する鍵は、Namenodeがブロックを保存するDatanodeのリストのみを提供することです。 NamenodeはDatanodesにデータを書き込みません。 DFSOutputStreamを使用してDatanodesにデータを書き込むのはクライアントの仕事です。書き込みを開始する前に上記のコードを実行して、クライアントがデータノードと通信できることを確認してください。データノードへの通信が失敗した場合、データノードはexcludeNodesに追加されます。

12
Jerry Ragland

以下を見てください:

この例外を見ると(1ではなく0ノードにのみ複製できます)、データノードはネームノードで利用できません。

これは、次の場合です。Data Node Name Nodeでは使用できない場合があります

  1. データNodeディスクがいっぱいです

  2. データNodeはブロックレポートとブロックスキャンでビジーです

  3. ブロックサイズが負の値の場合(hdfs-site.xmlのdfs.block.size)

  4. 書き込み中のプライマリデータノードがダウンしている間(任意のn/w変動b/w名前Node and Data Node Machines)

  5. 部分的なチャンクを追加し、後続の部分的なチャンクの追加のためにsyncを呼び出すとき、クライアントは以前のデータをバッファに保存する必要があります。

たとえば、「a」を追加した後、syncを呼び出しましたが、バッファーを追加しようとすると「ab」が必要です

そして、サーバー側は、チャンクが512の倍数でない場合、ブロックファイルに存在するデータとメタファイルに存在するcrcのCrc比較を試みます。しかし、ブロック内に存在するデータのcrcを構築している間、常に最初のOffesetまで比較しています。

リファレンス: http://www.mail-archive.com/[email protected]/msg01374.html

9
Ajay Lulia

単一ノードクラスターのセットアップでも同様の問題が発生しました。データノードを設定していないことに気付きました。ホスト名をconf/slavesに追加すると、うまくいきました。それが役に立てば幸い。

8
michaelliu

私の設定と解決策を説明しよう:私の設定:RHEL 7、hadoop-2.7.3

私は standalone Operation を最初にセットアップし、次に Pseudo-Distributed Operation をセットアップしようとしましたが、後者は同じ問題で失敗しました。

とはいえ、hadoopを起動すると:

sbin/start-dfs.sh

私は次のものを手に入れました:

Starting namenodes on [localhost]
localhost: starting namenode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-namenode-localhost.localdomain.out
localhost: starting datanode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-datanode-localhost.localdomain.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-secondarynamenode-localhost.localdomain.out

これは有望に見えます(データノードを起動します。エラーなしで)-しかし、データノードは実際には存在しませんでした。

別の兆候は、動作中のデータノードがないことを確認することでした(以下のスナップショットは、固定された動作状態を示しています)。

enter image description here

私はこの問題を次のように修正しました:

rm -rf /tmp/hadoop-<user>/dfs/name
rm -rf /tmp/hadoop-<user>/dfs/data

その後、もう一度開始します。

sbin/start-dfs.sh
...
4
ItayB

データノードが起動しないため、MacOS X 10.7(hadoop-0.20.2-cdh3u0)で同じエラーが発生しました。
start-all.shは、次の出力を生成しました。

starting namenode, logging to /Java/hadoop-0.20.2-cdh3u0/logs/...
localhost: ssh: connect to Host localhost port 22: Connection refused
localhost: ssh: connect to Host localhost port 22: Connection refused
starting jobtracker, logging to /Java/hadoop-0.20.2-cdh3u0/logs/...
localhost: ssh: connect to Host localhost port 22: Connection refused

System Preferences -> Sharing -> Remote Loginを介してsshログインを有効にすると、機能し始めました。
start-all.sh出力は次のように変更されました(データノードの開始に注意してください):

starting namenode, logging to /Java/hadoop-0.20.2-cdh3u0/logs/...
Password:
localhost: starting datanode, logging to /Java/hadoop-0.20.2-cdh3u0/logs/...
Password:
localhost: starting secondarynamenode, logging to /Java/hadoop-0.20.2-cdh3u0/logs/...
starting jobtracker, logging to /Java/hadoop-0.20.2-cdh3u0/logs/...
Password:
localhost: starting tasktracker, logging to /Java/hadoop-0.20.2-cdh3u0/logs/...
3
Aleksey Korolev

私の状況の問題を理解するのに一週間かかります。

クライアント(プログラム)がnameNodeにデータ操作を要求すると、nameNodeはdataNodeを取得し、dataNodeのIPをクライアントに提供することにより、クライアントをそのノードにナビゲートします。

ただし、dataNodeホストが複数のipを持つように構成され、nameNodeがクライアントにアクセスできないものを提供する場合、クライアントはdataNodeを追加して除外リストを作成し、nameNodeに新しいリストを要求し、最後にすべてのdataNode除外されると、このエラーが発生します。

すべてを試す前に、ノードのIP設定を確認してください!!!

2
igonejack

そして、dfsにコピーするときは、すべてのデータノードが稼働していることを確認する必要があると思います。場合によっては、時間がかかります。ヘルスステータスのWebページにアクセスして、すべて5セントになるまで待つので、ソリューションが「ヘルスステータスをチェックする」ソリューションが機能する理由だと思います。

2
flinter

すべてのデータノードが実行されている場合は、HDFSにデータ用の十分なスペースがあるかどうかを確認する必要があります。小さなファイルをアップロードできますが、大きなファイル(30GB)をHDFSにアップロードできませんでした。 「bin/hdfs dfsadmin -report」は、各データノードに使用可能なGBが数GBしかないことを示しています。

1
user3282611

私も同じ問題/エラーが発生しました。 hadoop namenode -formatを使用してフォーマットすると、最初に問題が発生しました

したがって、start-all.shを使用してhadoopを再起動した後、データノードは起動または初期化されませんでした。これは、jpsを使用して確認できます。5つのエントリが必要です。データノードが欠落している場合、これを行うことができます:

Hadoopで実行されていないデータノードプロセス

お役に立てれば。

0

名前ノードをすぐにフォーマットしないでください。 stop-all.shを試し、start-all.shを使用して開始します。問題が解決しない場合は、名前ノードのフォーマットに進みます。

0
Aravind Kalyan

私はパーティーに少し遅れていることに気付きましたが、このページの将来の訪問者のためにこれを投稿したかったです。ローカルからhdfsにファイルをコピーしていて、namenodeを再フォーマットしても問題は解決しませんでした。私のnamenodeログには次のエラーメッセージが含まれていることがわかりました:

2012-07-11 03:55:43,479 ERROR org.Apache.hadoop.hdfs.server.datanode.DataNode: DatanodeRegistration(127.0.0.1:50010, storageID=DS-920118459-192.168.3.229-50010-1341506209533, infoPort=50075, ipcPort=50020):DataXceiver Java.io.IOException: Too many open files
        at Java.io.UnixFileSystem.createFileExclusively(Native Method)
        at Java.io.File.createNewFile(File.Java:883)
        at org.Apache.hadoop.hdfs.server.datanode.FSDataset$FSVolume.createTmpFile(FSDataset.Java:491)
        at org.Apache.hadoop.hdfs.server.datanode.FSDataset$FSVolume.createTmpFile(FSDataset.Java:462)
        at org.Apache.hadoop.hdfs.server.datanode.FSDataset.createTmpFile(FSDataset.Java:1628)
        at org.Apache.hadoop.hdfs.server.datanode.FSDataset.writeToBlock(FSDataset.Java:1514)
        at org.Apache.hadoop.hdfs.server.datanode.BlockReceiver.<init>(BlockReceiver.Java:113)
        at org.Apache.hadoop.hdfs.server.datanode.DataXceiver.writeBlock(DataXceiver.Java:381)
        at org.Apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.Java:171)

どうやら、これはhadoopクラスターで比較的一般的な問題であり、 Clouderaが示唆する nofileとepollの制限(カーネル2.6.27の場合)を増やして回避します。難しいのは、nofileとepollの制限を設定することはシステムに大きく依存するということです。私の buntu 10.04サーバーはわずかに異なる設定が必要 これが適切に機能するため、それに応じてアプローチを変更する必要があるかもしれません。

0
dino

ノードの再フォーマットは解決策ではありません。 start-all.shを編集する必要があります。 dfsを起動し、完全に起動するのを待ってからmapredを起動します。スリープを使用してこれを行うことができます。 1秒間待つのがうまくいきました。完全なソリューションはこちらをご覧ください http://sonalgoyal.blogspot.com/2009/06/hadoop-on-ubuntu.html

0
TheHat

Wiki http://wiki.Apache.org/hadoop/HowToSetupYourDevelopmentEnvironment からお勧めを試しましたか?

データをdfsに入れるときにこのエラーが発生していました。解決策は奇妙で、おそらく一貫性がありません。ネームノードとともにすべての一時データを消去し、ネームノードを再フォーマットし、すべてを起動して、「クラスターの」dfsヘルスページ(http:// your_Host:50070/dfshealth.jsp)にアクセスしました。ヘルスページにアクセスする最後の手順は、エラーを回避する唯一の方法です。ページにアクセスすると、dfsのファイルの出し入れがうまくいきます!

0
Joe Stein

以下の手順に従ってください:
1。 dfsおよびyarnを停止します。
2。 core-site.xmlで指定されているdatanodeおよびnamenodeディレクトリを削除します。
3。次のようにdfsおよびyarnを開始します。

start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
0
KayV