1

Clouderahadoopdistrubutionを使用してmr-jobを開発しようとしています。apiバージョン2を使用しています。mr-unitで問題が発生します。何をすべきかアドバイスしてください。私は標準のアーキタイプを使用しましたが、完全に失われました。問題の腐敗がどこにあるのかわかりません。これが私の依存関係です:

<dependency>
            <groupId>com.cloudera.hadoop</groupId>
            <artifactId>hadoop-core</artifactId>
            <version>0.20.2-320</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.cloudera.hadoop</groupId>
            <artifactId>hadoop-mrunit</artifactId>
            <version>0.20.2-320</version>
            <scope>test</scope>
        </dependency>

これが私のテストコードです:

@Test
    public void testEmptyOutput() throws Exception{
        for(String line : linesFromFlatFile){
            //List<Pair<GetReq, IntWritable>> output = 
                    driver.withInput(UNUSED_LONG_KEY, new Text(line) )
                 // .withOutput(null, null )
                  .run();
            //assertTrue("", output.isEmpty());
        }
    }

そしてここに例外があります:

> Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.283
> sec <<< FAILURE!
> testEmptyOutput(MapperTest)
> Time elapsed: 0.258 sec  <<< ERROR! java.lang.NoSuchMethodError:
> org.apache.hadoop.mapreduce.TaskAttemptID.<init>(Ljava/lang/String;IZII)V
>   at
> org.apache.hadoop.mrunit.mapreduce.mock.MockMapContextWrapper$MockMapContext.<init>(MockMapContextWrapper.java:71)
>   at
> org.apache.hadoop.mrunit.mapreduce.mock.MockMapContextWrapper.getMockContext(MockMapContextWrapper.java:144)
>   at
> org.apache.hadoop.mrunit.mapreduce.MapDriver.run(MapDriver.java:197)
>   at
MapperTest.testEmptyOutput(ScoringCounterMapperTest.java:42)

package mypackage;

import java.util.Date;
import java.util.List;

import junit.framework.TestCase;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mrunit.mapreduce.MapDriver;
import org.apache.hadoop.mrunit.types.Pair;
import org.junit.Before;
import org.junit.Test;

import Sample;
import GetReq;



public class MapperTest extends TestCase {
    private static final IntWritable ONE_OCCURANCE = new IntWritable(1);
    private static final LongWritable UNUSED_LONG_KEY = new LongWritable(new Date().getTime());

    private Mapper<LongWritable, Text, GetReq, IntWritable> mapper;
    private MapDriver<LongWritable, Text, GetReq, IntWritable> driver;

    List<String> linesFromFlatFileNoOutput = null;
    List<String> linesFromFlatFileWithOutput = null;
    @Before 
    public void setUp() {
        mapper = newMapper();
        driver = new MapDriver<LongWritable, Text, GetReq, IntWritable>(mapper);
        Mapper.METADATA_CSV ="../../data/metadata.csv"; //ugly hook
        linesFromFlatFileNoOutput = Sample.instance.getLinesFromFlatFileNoOutput();  
        linesFromFlatFileWithOutput = Sample.instance.getLinesFromFlatFileWithOutput(); 
    }

    @Test
    public void testEmptyOutput() throws Exception{
        for(String line : linesFromFlatFileNoOutput){
            //List<Pair<GetReq, IntWritable>> output = 
                    driver.withInput(UNUSED_LONG_KEY, new Text(line) )
                  .withOutput(null, null )
                  .runTest();
            //assertTrue("", output.isEmpty());
        }
    }

    @Test
    public void testResultOutput() throws Exception{
        for(String line : linesFromFlatFileWithOutput){
            driver.withInput(UNUSED_LONG_KEY, new Text(line) )
                //.withOutput(null, null )
                .runTest();
        }
    }
}

うーん...pom.xmlでは何も変更していません。出力と同じ例外が表示されます。マッパーが1回実行されるように見えます。または実行するrties。マッパー本体からデバッグ出力を取得します。

UPD:分類子を追加し、依存関係を変更しました:

<dependency>
                <groupId>org.apache.mrunit</groupId>
                <artifactId>mrunit</artifactId>
                <version>0.9.0-incubating</version>
                <classifier>hadoop2</classifier>
                <scope>test</scope>
            </dependency>

今、私は別の問題を抱えています:

インターフェイスorg.apache.hadoop.mapreduce.Counterが見つかりましたが、クラスが必要でした

オンライン:

context.getCounter(EnumCounter.MATCHED_RECORDS).increment(1);

私は再び何を間違えますか?

4

2 に答える 2

1

私は解決策を見つけました:mr-unitの分類子タグを追加する必要があります。そして、次のようになります。

<dependency> 
<groupId>org.apache.mrunit</groupId> 
<artifactId>mrunit</artifactId> 
<version>0.9.0-incubating</version> 
<classifier>hadoop2</classifier> 
<scope>test</scope> 
</dependency> 

今、別の問題があります:インターフェイス org.apache.hadoop.mapreduce.Counter が見つかりましたが、カウンターのインクリメントでクラスが予期されていました。この問題は、いくつかのバグに関連しています。

于 2012-11-05T15:23:05.803 に答える
0

以前、間違ったバージョンの依存関係がランタイムに取り込まれたときに、この種の問題を見たことがあります。以前にこの種の問題を解決したことが2つあります。

  1. hadoop-core 依存関係で「provided」を「compile」に変更します。これは、実行時に正しいバージョンの使用を強制するだけです。いずれかの方法で「provided」に戻ります。
  2. Eclipse で、pom エディターの依存関係階層タブに移動します。ここで、選択した依存関係をまとめて、間接的な依存関係の 1 つの複数のバージョンを参照しているかどうかを確認できます。そのようなバージョンが見つかった場合は、Maven の除外と明示的な依存関係ブロックを使用して、使用するバージョンを選択します。
于 2012-10-30T19:27:16.247 に答える