我试着在mapreduce中编写一个简单的字数统计程序。我的mapreduce程序只将输出写入文件。但我不希望我的输出写在文件中。我想收集在我的其余程序区域中使用的信息或输出(如java集合)。
就像例如,如果我在hive上提交任何查询,它返回一个结果集对象,但在内部我的查询将转换为mapreduce程序,并在完成作业后返回结果集对象。与其他mapreduce程序不同,它不会将结果写入文件系统。
那么如何收集输出或如何在reducer或mapper中准备我自己的对象并在java程序的其他区域中收集该对象?我不希望将输出写入文件中。
答案 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分布式缓存的并排技术。