Java 是否可以在Hadoop集群上运行map/reduce作业而不使用输入文件?

Java 是否可以在Hadoop集群上运行map/reduce作业而不使用输入文件?,java,testing,hadoop,mapreduce,Java,Testing,Hadoop,Mapreduce,当我尝试在Hadoop集群上运行map/reduce作业而不指定任何输入文件时,会出现以下异常: java.io.IOException: No input paths specified in job 我可以想象,在没有输入文件的情况下运行作业是有意义的。测试文件的生成就是这种情况。用Hadoop可以做到这一点吗?如果没有,您是否有生成文件的经验?有没有更好的方法,然后在集群上保留一条记录的虚拟文件,作为生成作业的输入文件 我猜您希望在samll数据集上测试map reduce,所以在这种

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

 java.io.IOException: No input paths specified in job
我可以想象,在没有输入文件的情况下运行作业是有意义的。测试文件的生成就是这种情况。用Hadoop可以做到这一点吗?如果没有,您是否有生成文件的经验?有没有更好的方法,然后在集群上保留一条记录的虚拟文件,作为生成作业的输入文件

我猜您希望在samll数据集上测试map reduce,所以在这种情况下,我建议您 Map Reduce的单元测试将解决您的问题 如果您想从文件中测试映射器/组合器/减速机的一行linput,最好的方法是对每行使用UnitTest

示例代码:-
在java使用中使用模拟框架可以在IDE中运行这些测试用例

在这里,我使用了Mockito或MRunit,这也依赖于Mockito(Java Mocking框架)



公共类BoxPlotMapperTest{
@试验
public void validOuttextMapper()引发IOException、InterruptedException
{
映射器映射器=新映射器();//映射器对象
Text line=新文本(“输入文件中的单行”);//文件中的单行输入
Mapper.Context Context=Mockito.mock(Mapper.Context.class);
map(null,line,context);//(key=null,value=line,context)//我的代码中没有使用key,所以它是null
Mockito.verify(context).write(新文本(“预期的键输出”)、新文本(“预期的值输出”);//
}
@试验
public void validOutputExtreducer()引发IOException、InterruptedException
{
减速器reduer=新减速器();
最终列表值=新的ArrayList();
添加(新文本(“值1”);
添加(新文本(“value2”);
添加(新文本(“value3”);
添加(新文本(“value4”);
Iterable Iterable=新的Iterable(){
@凌驾
公共迭代器迭代器(){
//TODO自动生成的方法存根
返回值。迭代器();
}
};
Reducer.Context=Mockito.mock(Reducer.Context.class);
reduer.reduce(新文本(“键”)、可编辑、上下文);
验证(上下文)。编写(新文本(“预期的键输出”)、新文本(“预期的值输出”);
}
}




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

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

如果要生成测试文件,为什么首先需要使用hadoop?您可以使用mapreduce步骤的输入创建任何类型的文件,甚至可以使用mapreduce步骤外部的特定于类型的API创建HDFS文件。

我知道我正在恢复一个旧线程,但没有选择最佳答案,所以我想我会把它扔到一边。I agre MRUnit在很多方面都很好,但有时我只是想处理一些真实的数据(特别是在测试中,我需要模拟它以使其在MRUnit中工作)。
当这是我的目标时,我创建了一个单独的小任务来测试我的想法,并使用SleepInputFormat对Hadoop撒谎,说有输入,而实际上没有。旧API在这里提供了一个例子:,我在这里将输入格式转换为新API:。

@ChrisGerken使用map/reduce和HDFS生成测试数据的唯一原因是数据确实非常大。太大,无法装入客户机文件系统,或者需要很长时间才能生成。@ChrisGerken请看Sqoop。它从数据库读取数据时可能会生成大量数据,但可能不会。通过调整视图,您可以将Mapper用作分布式应用程序。两台不同机器上的两个映射器可以比一台机器上的两个线程更快地从源X提取数据,因为它们不共享NIC带宽。查看Hadoop专家对类似查询的响应。还有,看看和。
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"));

}