我试图用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分布式缓存的并排技术。