0

たとえば、500 などの多数の出力ファイルを作成しています。以下の Shoen のように、既に作成されているという例外が発生しています。出力ファイルの数が少ない場合、プログラムは自動的に回復します。たとえば。50 個のファイルがある場合、この例外は発生しますが、この例外を数回出力した後、プログラムは正常に実行を開始します。

しかし、多くのファイルでは、最終的にIOException.

エラーを貼り付けてから、以下のコードを貼り付けました。

 12/10/29 15:47:27 INFO mapred.JobClient: Task Id : attempt_201210231820_0235_r_000004_3, Status : FAILED
    org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.protocol.AlreadyBeingCreatedException: failed to create file /home/users/mlakshm/preopa406/data-r-00004 for DFSClient_attempt_201210231820_0235_r_000004_3 on client 10.0.1.100, because this file is already being created by DFSClient_attempt_201210231820_0235_r_000004_2 on 10.0.1.130
            at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.recoverLeaseInternal(FSNamesystem.java:1406)

コードを貼り付けました:

Reduce メソッドには、出力を生成するための以下のロジックがあります。

                      int data_hash = (int)data_str.hashCode();
                      int data_int1 = 0;
                      int k = 500;
                      int check1 = 0;
                      for (int l = 10; l>0; l++)
                      {

                       if((data_hash%l==0)&&(check1 == 0))
                       {
                       check1 = 1;
                       int range = (int) k/10;

                       String check = "true";


                      while(range > 0 && check.equals("true"))
                                        {

                                     if(data_hash % range-1 == 0)
                                        {                                                        
                                                check = "false";
                                        data_int1 = range*10;

                                     }
                                        }


                            }

                            }

                               mos.getCollector("/home/users/mlakshm/preopa407/cdata"+data_int1, reporter).collect(new Text(t+" "+alsort.get(0)+" "+alsort.get(1)), new Text(intersection));

                        PLs help!
4

1 に答える 1

0

問題は、すべてのレデューサーが同じ命名スキームでファイルを書き込もうとしていることです。これを行う理由は

mos.getCollector("/home/users/mlakshm/preopa407/cdata"+data_int1, reporter).collect(new Text(t+" "+alsort.get(0)+" "+alsort.get(1)), new Text(intersection));

セットは、レデューサーのIDではなく、データの特性に基づいたファイル名です。

いくつかの選択肢があります:

  1. 放出されるキーがこのジョブで計算するハッシュと一致するように、マップジョブを作り直します。これにより、各レデューサーが値のスパンを取得するようになります。

    1. ファイル名に、各マッパーに固有の識別子を含めます。これにより、各レデューサーのパーツファイルのセットが残ります。

ここで複数の出力を使用する理由を説明していただけますか?私はあなたがする必要はないと思います。

于 2012-10-30T02:52:57.243 に答える