Hadoop使用MultipleOutputs输出多文件或者指定命名

@(HADOOP)[hadoop]

(一)输出多文件(未测试)

比如将不同国家的信息分别输出到一份对应的文件中。

1、在reduce或map类中创建MultipleOutputs对象,将结果输出

class reduceStatistics extends Reducer<Text, IntWritable, Text, IntWritable>{  //将结果输出到多个文件或多个文件夹  private MultipleOutputs<Text,IntWritable> mos;  //创建对象  protected void setup(Context context) throws IOException,InterruptedException {  mos = new MultipleOutputs<Text, IntWritable>(context);  }  //关闭对象  protected void cleanup(Context context) throws IOException,InterruptedException {  mos.close();  }
}

2、在map或reduce方法中使用MultipleOutputs对象输出数据,代替congtext.write()
Java代码 收藏代码

protected void reduce(Text key, Iterable<IntWritable> values, Context context)  throws IOException, InterruptedException {  IntWritable V = new IntWritable();  int sum = 0;  for(IntWritable value : values){  sum = sum + value.get();  }  System.out.println("word:" + key.toString() + "     sum = " + sum);  V.set(sum);  //使用MultipleOutputs对象输出数据  if(key.toString().equals("hello")){  mos.write("hello", key, V);  }else if(key.toString().equals("world")){  mos.write("world", key, V);  }else if(key.toString().equals("hadoop")){  //输出到hadoop/hadoopfile-r-00000文件  mos.write("hadoopfile", key, V, "hadoop/");  }  }

3、在创建job时,定义附加的输出文件,这里的文件名称与第二步设置的文件名相同
Java代码 收藏代码

//定义附加的输出文件  MultipleOutputs.addNamedOutput(job,"hello",TextOutputFormat.class,Text.class,IntWritable.class);  MultipleOutputs.addNamedOutput(job,"world",TextOutputFormat.class,Text.class,IntWritable.class);  MultipleOutputs.addNamedOutput(job,"hadoopfile",TextOutputFormat.class,Text.class,IntWritable.class);

(二)指定输出命名

1、创建变量

private static MultipleOutputs<Text, Text> mos;

2、初始化变量

在map或者reduce的setup()方法中初始化变量

mos = new MultipleOutputs<Text, Text>(context);

3、使用变量代替context来write

在map()或者reduce()方法中使用mos作输出:

mos.write("outputname", key, new Text(""));

4、关于变量传递

在主类中定义的变量,如定义了一个outputname,需要将其写入conf分发至其它nodemanager:

    Configuration conf = new Configuration();//需要将变量分发至所有的nodemanagerconf.set("outputname", outputName);

然后在map/reduce中从context获取这个变量:

    context.getConfiguration().get("outputname")

5、关于part-**的输出

使用multioutput改变了默认的输出名称后,原有的part-**也会输出的,此时需要加上:

import org.apache.hadoop.mapreduce.lib.output.LazyOutputFormat;
LazyOutputFormat.setOutputFormatClass(job, TextOutputFormat.class);

这将在有内容写入文件时才创建文件,详细可看:http://stackoverflow.com/questions/14555313/renaming-part-files-in-hadoop-map-reduce
另外,即使不使用multiOutput,如果任务输出中有大量的空文件,也应加上这代码。x

Hadoop使用MultipleOutputs输出多文件或者指定命名相关推荐

  1. (转载)输出文件的指定行

    Preface 最近我不是开始学Linux系统了吗= =,说真的,感觉自己有点蠢= =最近新弄了个QQ号,用来应对闲杂事情,然后突然就想加个Linux相关的群,来谈谈人生,结果问的第一个问题就把我难到 ...

  2. 遍历指定jar包中class文件名并输出到文件中

    import java.io.*; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; i ...

  3. linux将屏幕输出到文件,Linux命令执行的屏幕输出内容重定向到日志文件

    摘要: 作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 快速mark一下这个命令细节,免得以后使用又忘记了 大家都知道可以用echo来输出内容到 ...

  4. Hadoop的log4j审计日志文件

    自定义修改hadoop/conf/log4j.properties hdfs审计日志(Auditlog)记录了用户针对hdfs的所有操作,详细信息包括操作成功与否.用户名称.客户机地址.操作命令.操作 ...

  5. python3查找文件中指定字符串_Python3在指定路径下递归定位文件中出现的字符串...

    [本文出自天外归云的博客园] 脚本功能:在指定的路径下递归搜索,找出指定字符串在文件中出现的位置(行信息). 用到的python特性: 代码如下: import os import sys __all ...

  6. python下载文件到指定文件夹-python实现指定文件夹下的指定文件移动到指定位置...

    # coding:utf-8 import os import shutil import sys reload(sys) sys.setdefaultencoding('utf8') # print ...

  7. 学python看什么书好1002无标题-如何使用pandas读取txt文件中指定的列(有无标题)

    最近在倒腾一个txt文件,因为文件太大,所以给切割成了好几个小的文件,只有第一个文件有标题,从第二个开始就没有标题了. 我的需求是取出指定的列的数据,踩了些坑给研究出来了. import pandas ...

  8. BAT 批处理命令 - 实现输出当前文件夹下的所有文件夹名的功能实例演示

    如下功能为输出当前文件夹下的所有文件夹名并用逗号连接. 需要把 bat 文件放到指定文件夹下执行即可. @echo off for /D %%i in (*) do set /p=%%i,<nu ...

  9. 成功解决cv2.imwrite(filename, img)代码输出中文文件乱码的问题(cv2.imencode方法解决)

    成功解决cv2.imwrite(filename, img)代码输出中文文件乱码的问题(cv2.imencode方法解决) 目录 解决问题 解决思路 1.从网络读取图像数据并转换成图片格式 2.将图片 ...

最新文章

  1. 吴恩达老师深度学习视频课笔记:构建机器学习项目(机器学习策略)(1)
  2. mysql通过订单量排序_mysql8 参考手册--通过排序优化
  3. rails 常用方法
  4. python实现排序算法_python实现各种排序算法
  5. python字典的常见操作_Python 字典(Dictionary) 基本操作
  6. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 13丨每日新用户统计【难度中等】
  7. hibernate mysql autocommit_Hibernate4 中为什么我没有用commit()方法直接用save就存到数据库了?...
  8. GirlsInAI 近期计划,求扩散,欢迎大家转起来!
  9. 基于块的linux驱动程序,基于块的Linux驱动程序 块设备驱动 centos内核编译过程 操作系统课程设计...
  10. apt get 安装mysql5.7_ubuntu16.04下apt-get安装mysql5.7,文件目录结构
  11. python从键盘获取列表,python – 从5行中的列表列表中获取所有元素
  12. httpUtils 工具类
  13. linux的桌面分辨率设置,linux xorg屏幕分辨率设置
  14. 海康威视Linux下SDK开发(Ubuntu16.04 QT5.10)
  15. c语言d是什么意思,c d是什么意思
  16. 使用cfssl签发证书
  17. 【维修】如何成功做网线?
  18. linux mv移动文件到指定目录,Linux mv命令使用示例-移动或重命令文件/目录
  19. java实现筛选_java实现简单的文件筛选
  20. golang中的rune类型

热门文章

  1. 【双100%提交】剑指 Offer 09. 用两个栈实现队列
  2. HashMap方法源码
  3. 传统公司部署OpenStack(t版)简易介绍(七)——cinder模块部署
  4. 人生需要往前看,一直回味过去只会迷失,如果已经开始迷失,请回想初心
  5. python做数据库管理系统_python+Django+mysql+bootstrap前端,数据库一次搞定)从头教你毕设实现一个简易好看的仓储物资管理之类系统...
  6. 80核处理器_标压版锐龙处理器更香!联想小新Pro 13轻薄笔记本评测
  7. java序列化Serializable
  8. java的int、char、long、float、double对byte的转换,在通信的时候会用到
  9. 请列举你了解的分布式锁_终于搞懂分布式锁是什么了!
  10. 沃舍尔算法_[数据结构拾遗]图的最短路径算法