是否可以在没有输入文件的情况下在 Hadoop 集群上运行 map/reduce 作业



当我尝试在Hadoop集群上运行map/reduce作业而不指定任何输入文件时,出现以下异常:

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

好吧,我可以想象在没有输入文件的情况下运行作业确实有意义。生成测试文件就是这种情况。是否有可能用Hadoop做到这一点?如果没有,您在生成文件方面有一些经验吗?有没有更好的方法将虚拟文件与一条记录保留在集群上以用作生成作业的输入文件?

文件路径与基于 FileInputFormat 的输入相关,如 SequenceInputFormat 等。但是从 hbase 数据库读取的输入格式不会从文件中读取,因此您可以自己实现 InputFormat,并在 getSplits、RecordReader、createRecordReader 中定义自己的行为。对于说明,请查看 TextInputFormat 类的源代码。

对于 MR 作业单元测试,您也可以使用 MRUnit 。如果你想用Hadoop生成测试数据,那么我建议你看看Teragen的源代码。

我想你正在寻找在 samll 数据集上测试你的 map-reduce,所以在这种情况下,我将重新命令以下

Map-Reduce的单元测试将解决您的问题

如果你想测试你的映射器/组合器/化简器从你的文件中的单行输入,最好的办法是使用单元测试对每个.

示例代码:-
在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"));
}

}



如果你想生成一个测试文件,为什么首先需要使用Hadoop? 任何一种你使用输入到mapreduce步骤的文件都可以在mapreduce步骤之外使用特定于类型的API创建,甚至是HDFS文件。

我知道我正在复活一个旧线程,但没有选择最佳答案,所以我想我会把它扔在那里。 我认为 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。

最新更新