如何收集mapreduce作业的输出?

p5cysglq  于 2021-06-03  发布在  Hadoop
关注(0)|答案(4)|浏览(313)

我试着用mapreduce编写一个简单的字数计算程序。我的mapreduce程序只将输出写入文件。但我不希望我的输出被写入文件。我想收集这些信息或输出(如java收集),以便在程序区域的其余部分使用。
例如,如果我在hive上提交任何查询,它将返回一个结果集对象,但在内部,我的查询将转换为mapreduce程序,并在完成作业后返回结果集对象。与其他mapreduce程序不同,它不会将结果写入文件系统。
那么,我该如何收集输出,或者如何在reducer或mapper中准备自己的对象,并在java程序的其他区域中收集该对象呢?我不希望输出被写入文件。

wvyml7n5

wvyml7n51#

mapreduce作业往往消耗/产生大量数据。它们也往往是独立的应用程序,而不是某些大型工作流的一部分。这两种说法在本案中似乎都不成立。可以将输出格式设置为nulloutputformat以防止创建任何文件。然后,您可以将结果作为字符串添加到job conf中,这将使任何可以读取conf的人都可以使用这些结果。

vql8enpb

vql8enpb2#

据我了解,您的问题是,您正在使用HiveforMapReduce来处理hdfs数据,并且希望最终使用HiveOutput,而不是将输出保存到hdfs。您可以在配置单元中使用以下命令将o/p写入hdfs或本地文件系统:
以下命令将表输出到本地目录insert overwrite local directory“”selectfrom table\ u name;
下面的命令将表输出到hdfs文件insert overwrite目录'/tmp/hdfs\u out'选择一个
from table\u name;
稍后,如果您想使用这个o/p,请使用hdfs中的另一个javamro/p。
为了实现这一点,您需要先将配置单元输出写入hdfs,然后使用下面的解决方案来处理两个不同的o/p。
解决方案1:在java语言中使用map-side或reduce-side连接。
[或]
soultion2:使用jobconfig对象或hadoop分布式缓存的并行技术。

5tmbdcev

5tmbdcev3#

有许多方法可以处理hadoop m-r框架的输出。用户描述m-r作业的主要接口是jobconf类

getOutputFormat()

以及

setOutputFormat()

方法,其中可以/可以描述不同的结果集合,例如db(hbase)存储。需要记住的是,m-r作业处理大量的数据,除非您有一个良好的分布式对象体系结构,否则在java内存中将这些数据作为对象进行管理会很麻烦。
或者你可以提供你的实际需求。
希望这有帮助,帕特

cl25kdpy

cl25kdpy4#

mapreduce任务通常从hdfs或hbase获取文件。
首先获取hdfs文件系统中目录的绝对路径
现在,在map reduce任务的main方法或批处理中,使用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-目录{path\u to\u outfile\u inhdfs}

相关问题