如何收集mapreduce作业的输出?

时间:2014-04-01 16:04:19

标签: hadoop mapreduce bigdata

我试着在mapreduce中编写一个简单的字数统计程序。我的mapreduce程序只将输出写入文件。但我不希望我的输出写在文件中。我想收集在我的其余程序区域中使用的信息或输出(如java集合)。

就像例如,如果我在hive上提交任何查询,它返回一个结果集对象,但在内部我的查询将转换为mapreduce程序,并在完成作业后返回结果集对象。与其他mapreduce程序不同,它不会将结果写入文件系统。

那么如何收集输出或如何在reducer或mapper中准备我自己的对象并在java程序的其他区域中收集该对象?我不希望将输出写入文件中。

4 个答案:

答案 0 :(得分:2)

有许多方法可以处理Hadoop M-R Framework的输出。用户描述M-R作业的主界面是JobConf类 你会发现

getOutputFormat()

setOutputFormat()

您可以/可以描述不同结果集合的方法,例如DB(HBase)存储。需要记住的是,M-R作业处理大量数据,除非您拥有完善的分布式对象架构,否则在Java内存中作为对象管理将非常麻烦。

Alternativley你可以提供你的实际要求。

希望这有帮助, 专利

答案 1 :(得分:0)

MapReduce作业倾向于消耗/产生大量数据。它们也往往是独立的应用程序,而不是一些更大的工作流程的一部分。在这种情况下,这两个陈述似乎都不成立。您可以将输出格式设置为NullOutputFormat以防止创建任何文件。然后,您可以将结果作为字符串添加到作业conf中,这将使它们可用于任何可以读取conf的内容。

答案 2 :(得分:0)

MapReduce任务通常从HDFS或HBase获取文件。

首先获取HDFS文件系统中目录的绝对路径

现在在map-reduce任务的主要方法或批处理中,使用Job类的setOutputFormat()来设置输出格式

文本输出示例

    Configuration conf = new Configuration();
    Job job = new Job(conf, "app");
    job.setJarByClass(Application.class); // batch/main method's class name
    job.setMapperClass(Mapper.class);
    job.setReducerClass(Reducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);
    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(Text.class);
    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));

现在在运行hadoop任务时,第二个参数是输出路径,它是HDFS子目录的路径。

现在由于文件在HDFS中,我们无法使用普通的unix命令访问它,首先将文件从HDFS转换为ext3 / 4文件格式,然后使用nano / vi读取它

dfs -cat {path_to_outfile_inHDFS}

答案 3 :(得分:0)

根据我对您的问题的理解,您正在使用Hive for mapreduce来处理HDFS数据,并且您希望最终使用Hive输出,而不是将输出保存到HDFS。您可以使用HIVE中的以下命令将o / p写入HDFS或本地文件系统:

以下命令将表输出到本地目录 INSERT OVERWRITE LOCAL DIRECTORY'' SELECT * FROM table_name;

以下命令将表输出到HDFS文件 INSERT OVERWRITE DIRECTORY' / tmp / hdfs_out' SELECT a。* FROM table_name;

稍后,如果你想使用这个o / p,使用HDFS中的其他java MR o / p。

为了实现这一目标,您需要先将Hive输出写入HDFS并使用以下解决方案来处理两个不同的o / p。

解决方案1:使用JAVA语言中的Map side或Reduce side join。

[OR]

Soultion2:使用Jobconfig对象或Hadoop分布式缓存的并排技术。