java - Hadoop - 如何收集没有值的文本输出

标签 java hadoop dictionary

我正在处理 map 缩减作业,我想知道是否可以向我的输出文件发出自定义字符串。没有计数,没有其他数量,只是一团文本。

这是我的基本想法

public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
        // this map doesn't do very much
        String line = value.toString();
        word.set(line);
        // emit to map output
        output.collect(word,one);

        // but how to i do something like output.collect(word)
        // because in my output file I want to control the text 
        // this is intended to be a map only job
    }
}

这种事情可能吗?这是为了创建一个仅映射作业来转换数据,使用 hadoop 的并行性,但不一定是整个 MR 框架。当我运行此作业时,我会在 hdfs 中为每个映射器获取一个输出文件。

$ hadoop fs -ls /Users/dwilliams/output
2013-09-15 09:54:23.875 java[3902:1703] Unable to load realm info from SCDynamicStore
Found 12 items
-rw-r--r--   1 dwilliams supergroup          0 2013-09-15 09:52 /Users/dwilliams/output/_SUCCESS
drwxr-xr-x   - dwilliams supergroup          0 2013-09-15 09:52 /Users/dwilliams/output/_logs
-rw-r--r--   1 dwilliams supergroup    7223469 2013-09-15 09:52 /Users/dwilliams/output/part-00000
-rw-r--r--   1 dwilliams supergroup    7225393 2013-09-15 09:52 /Users/dwilliams/output/part-00001
-rw-r--r--   1 dwilliams supergroup    7223560 2013-09-15 09:52 /Users/dwilliams/output/part-00002
-rw-r--r--   1 dwilliams supergroup    7222830 2013-09-15 09:52 /Users/dwilliams/output/part-00003
-rw-r--r--   1 dwilliams supergroup    7224602 2013-09-15 09:52 /Users/dwilliams/output/part-00004
-rw-r--r--   1 dwilliams supergroup    7225045 2013-09-15 09:52 /Users/dwilliams/output/part-00005
-rw-r--r--   1 dwilliams supergroup    7222759 2013-09-15 09:52 /Users/dwilliams/output/part-00006
-rw-r--r--   1 dwilliams supergroup    7223617 2013-09-15 09:52 /Users/dwilliams/output/part-00007
-rw-r--r--   1 dwilliams supergroup    7223181 2013-09-15 09:52 /Users/dwilliams/output/part-00008
-rw-r--r--   1 dwilliams supergroup    7223078 2013-09-15 09:52 /Users/dwilliams/output/part-00009

如何在 1 个文件中获取结果?我应该使用身份缩减器吗?

最佳答案

1. 要实现output.collect(word),您可以使用 Class NullWritable 。为此,您必须在映射器中使用 output.collect(word, NullWritable.get()) 。请注意,NullWritable 是单例。

2. 如果您不想拥有多个文件,您可以将化简器的数量设置为 1。但这会产生额外的开销,因为这将涉及网络上的大量数据混洗。原因是,Reducer 必须从运行 Mappers 的不同机器上获取输入。此外,所有负载都将转移到一台机器上。但如果您只想要一个输出文件,您绝对可以使用一个 mReducer。 conf.setNumReduceTasks(1) 应该足以实现这一目标。

一些小建议:

  • 我不建议您使用getmerge,因为它将生成的文件复制到本地文件系统上。因此,您必须将其复制回 HDFS 才能进一步使用。
  • 如果可能,请使用新的 API。

关于java - Hadoop - 如何收集没有值的文本输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18814359/

相关文章:

java - 上下文混淆 - Spring 实例化单例 bean 两次

java - 正则表达式从 URL 中剪切文件名

java - 如何在java中访问动态字符串数组的元素?

java - 每次我重新启动时,我的 PC namenode 都没有启动

hadoop - hive [错误10025]表达式不在GROUP BY中

java - 在 Jersey 中为 REST API 处理完整和部分 View

ruby-on-rails - 词词典的数据库设计

python - 将 dict 应用到 ndarray 的快速(非循环)方法是什么(意味着使用元素作为键并替换为值)

python - 转换pandas.groupby为dict

apache-spark - 解决 NoClassDefFoundError : org/apache/spark/Logging exception