如何收集mapreduce作业的输出



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

就像例如,

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

那么我怎样才能收集该输出,或者如何在化简器或映射器中准备自己的对象,并在Java程序的其他区域中收集该对象呢?我不希望该输出写入文件。

有很多

方法可以处理Hadoop M-R框架的输出。用户描述 M-R 作业的主要接口是 JobConf 类你会发现

getOutputFormat()

setOutputFormat()
方法,其中您可以

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

或者,您可以提供您的实际要求。

希望这有帮助,帕特

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

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}

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

以下命令将表输出到本地目录插入覆盖本地目录 '' 从table_name中选择 *;

以下命令将表输出到 HDFS 文件插入覆盖目录"/tmp/hdfs_out"从table_name中选择 A.*;

稍后,如果你想使用这个 o/p,可以使用 HDFS 中的另一个 java MR o/p。

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

解决方案 1:在 JAVA 语言中使用映射端或减少端连接。

[或]

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

相关内容

  • 没有找到相关文章

最新更新