【问题标题】:Is it possible to run map/reduce job on Hadoop cluster with no input file?是否可以在没有输入文件的 Hadoop 集群上运行 map/reduce 作业?
【发布时间】:2012-11-12 04:36:46
【问题描述】:

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

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

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

【问题讨论】:

标签: java testing hadoop mapreduce


【解决方案1】:

文件路径与基于 FileInputFormat 的输入(如 SequenceInputFormat 等)相关。但从 hbase、数据库读取的输入格式不会从文件中读取,因此您可以自己实现 InputFormat 并在 getSplits、RecordReader、创建记录读取器。为了检查,请查看 TextInputFormat 类的源代码。

【讨论】:

  • @ChrisGerken 在 HDFS 上使用 map/reduce 生成测试数据的唯一原因是数据确实会非常很大。太大以至于不适合客户端文件系统,或者生成它们需要很长时间。
  • @ChrisGerken 看看 Sqoop。从数据库读取时它可能会生成大量数据,但可能不会。您可以通过调整视图将映射器用作分布式应用程序。两台不同机器上的两个映射器可以比一台机器上的 2 个线程更快地从源 X 提取数据,因为它们不共享 NIC 带宽。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我猜你正在寻找在 samll 数据集上测试你的 map-reduce,所以在这种情况下我会推荐以下

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

    如果您想针对文件中的单行 linput 测试映射器/组合器/缩减器,最好的方法是对每个使用 UnitTest。

    示例代码:-
    在 java 中使用 Mocking Frame 工作可以在您的 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"));
    
    }
    

    }



    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-10
          • 1970-01-01
          • 2011-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多