0

私は Definitive Guide book から Hadoop を勉強していて、このコードを実行しようとしたところ、エラーが発生しました。
第 5 章の例。Github コードへのリンク:
ソース: https://github.com/tomwhite/hadoop-book/blob/master/ch05/src/main/java/v1/MaxTemperatureMapper.java

public class MaxTemperatureMapper
    extends Mapper<LongWritable, Text, Text, IntWritable> {
@Override
public void map(LongWritable key, Text value, Context context)
        throws IOException, InterruptedException {
    String line = value.toString();
    String year = line.substring(15, 19);
    int airTemperature = Integer.parseInt(line.substring(87, 92));
    context.write(new Text(year), new IntWritable(airTemperature));
}

}

テスト: https://github.com/tomwhite/hadoop-book/blob/master/ch05/src/test/java/v1/MaxTemperatureMapperTest.java

public class MaxTemperatureMapperTest {
@Test
public void processesValidRecord() throws IOException, InterruptedException {
    Text value = new Text("0043011990999991950051518004+68750+023550FM-12+0382" +
            "99999V0203201N00261220001CN9999999N9-00111+99999999999");
    new MapDriver<LongWritable, Text, Text, IntWritable>()
            .withMapper(new MaxTemperatureMapper())
            .withInputValue(value)
            .withOutput(new Text("1950"), new IntWritable(-11))
            .runTest();
}

私が得ているエラーは次のとおりです。

java.lang.IllegalStateException: No input was provided
at org.apache.hadoop.mrunit.MapDriverBase.preRunChecks(MapDriverBase.java:286)
at org.apache.hadoop.mrunit.mapreduce.MapDriver.run(MapDriver.java:142)
at org.apache.hadoop.mrunit.TestDriver.runTest(TestDriver.java:640)
at org.apache.hadoop.mrunit.TestDriver.runTest(TestDriver.java:627)
at book.hadoopdefinitiveguide.chap5.examples.MaxTemperatureMapperTest.processesValidRecord(MaxTemperatureMapperTest.java:12)

これはたまたま Hadoop で実行している最初のコードであり、このエラーがスローされています。どんな助けでも大歓迎です。前もって感謝します

4

1 に答える 1

2

@Thomas Junblut が指摘したように、値とともにキーを指定する必要があります。

ただし (mrunit 1.0 以降を使用していると仮定して)、withInputKey|Valuedeprecated ですwithInput(K1 key, V1 val)の代わりに、1 つのメソッドでキーと値をボットに指定するを使用する必要がありますwithInputValue(..).withInputKey(..)。だからあなたはこのようなものを持っているでしょう

new MapDriver<LongWritable, Text, Text, IntWritable>()
        .withMapper(new MaxTemperatureMapper())
        .withInput(new LongWritable(), value)
        .withOutput(new Text("1950"), new IntWritable(-11))
        .runTest();

new LongWritable()単なる任意のキーです。


編集

したがって、さらにテストした後、コードの問題ではありません (非推奨を除いて、それが原因ではありません)。

投稿したコードを使用して同じテストを実行したところ、まったく同じエラーが発生しました。私が持っていたいくつかの古い練習プロジェクトでテストしました。クラスが正しく構築されていないことが問題のようでした。まったく新しいプロジェクトを作成し、マッパー クラスを書き直して (コピーして貼り付け)、新しいテスト ケースを作成し、すべてを保存して実行したところ、問題なく動作しました。これをやってみてください。ところで、私は Eclipse Hadoop プラグインを使用して MR プロジェクトを作成する eclipse を使用しています。

于 2014-09-07T15:27:54.240 に答える