4

入力ファイルを指定せずに Hadoop クラスターで map/reduce ジョブを実行しようとすると、次の例外が発生します。

 java.io.IOException: No input paths specified in job

まあ、入力ファイルなしでジョブを実行するのが理にかなっているケースは想像できます。テストファイルの生成が該当します。Hadoopでそれを行うことは可能ですか? そうでない場合、ファイルの生成に関する経験はありますか? 生成ジョブの入力ファイルとして使用するクラスターに 1 つのレコードを持つダミー ファイルを保持するよりも良い方法はありますか?

4

5 に答える 5

1

ファイル パスは、SequenceInputFormat などの FileInputFormat ベースの入力に関連します。ただし、hbase やデータベースから読み取る入力形式はファイルから読み取らないため、InputFormat の独自の実装を作成し、getSplits、RecordReader、createRecordReader で独自の動作を定義できます。確認するには、TextInputFormat クラスのソース コードを調べてください。

于 2012-11-12T11:33:53.670 に答える
0

テスト ファイルを生成したい場合、そもそもなぜ Hadoop を使用する必要があるのでしょうか。mapreduce ステップへの入力として使用するあらゆる種類のファイルは、HDFS ファイルであっても、mapreduce ステップの外部でタイプ固有の API を使用して作成できます。

于 2012-11-12T12:29:49.390 に答える
0

古いスレッドを復活させていることは知っていますが、ベストアンサーが選ばれなかったので、これを捨てようと思いました。MRUnit は多くの点で優れていることに同意しますが、実際のデータをいじりたい場合もあります (特に、MRUnit で動作させるためにモックを作成する必要があるテストの場合)。それが私の目標である場合、別の小さなジョブを作成して自分のアイデアをテストし、SleepInputFormat を使用して基本的に Hadoop に嘘をつき、実際には入力がないのに入力があると言います。古い API は、次の例を提供しました: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.22/mapreduce/src/test/mapred/org/apache/hadoop/mapreduce/ SleepJob.javaで入力形式を新しい API に変換しました: https://gist.github.com/keeganwitt/6053872

于 2013-12-06T19:39:08.280 に答える
0

私はあなたがsamllのデータセットでmap-reduceをテストしようとしていると思うので、その場合は次のことをお勧めします

Map-Reduceの単体テストはあなたの問題を解決します

file からの linput の 1 行について mapper/combiner/reducer をテストする場合、最善の方法は、それぞれに対して UnitTest を使用することです。

サンプル コード:-
Mocking Frame を Java で使用すると、IDE でこれらのテスト ケースを実行できます。

ここでは、Mockitoまたは MRunit を使用しましたが、これも Mockito(Java Mocking Framework) に依存しています。



public class BoxPlotMapperTest {
@Test
public void validOutputTextMapper() throws IOException, InterruptedException
{
    Mapper mapper=new Mapper();//Your Mapper Object 
    Text line=new Text("single line from input-file"); // single line input from file 
    Mapper.Context context=Mockito.mock(Mapper.Context.class);
    mapper.map(null, line, context);//(key=null,value=line,context)//key was not used in my code so its null 
    Mockito.verify(context).write(new Text("your expected key-output"), new Text("your expected value-output")); // 

}

@Test
public void validOutputTextReducer() throws IOException, InterruptedException
{
    Reducer reduer=new Reducer();
    final List<Text> values=new ArrayList<Text>();
    values.add(new Text("value1"));
    values.add(new Text("value2"));
    values.add(new Text("value3"));
    values.add(new Text("value4"));
    Iterable<Text> iterable=new Iterable<Text>() {

        @Override
        public Iterator<Text> iterator() {
            // TODO Auto-generated method stub
            return values.iterator();
        }
    };
    Reducer.Context context=Mockito.mock(Reducer.Context.class);
    reduer.reduce(new Text("key"),iterable, context);
    Mockito.verify(context).write(new Text("your expected key-output"), new Text("your expected value-output"));

}

}



于 2012-11-12T07:28:23.040 に答える
0

MR ジョブの単体テストでは、 MRUnitも使用できます。Hadoop でテスト データを生成する場合は、Teragenのソース コードを参照することをお勧めします。

于 2012-11-12T11:09:35.120 に答える