mapreduce程序中避免reduce输出空文件

在mapreduce里,如果某个reduce输出为空,默认也会生成一个大小为0的文件。原因是reduce写的时候,不知道会不会有输出数据,所以默认初始化了一个文件。如果没有输出,close文件最终会生成一个空文件。如下。有几个缺点:
1)生成的很多小文件,对namenode形成一定压力
2)生成的数据下个阶段处理的时候,这些空的文件会浪费掉一些计算资源。
3)看着不爽

-rw-r--r--   3 hadoop supergroup          0 2018-05-09 10:38 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/_SUCCESS
drwxr-xr-x   - hadoop supergroup          0 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/_temporary
-rw-r--r--   3 hadoop supergroup     290779 2018-05-09 10:37 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00000
-rw-r--r--   3 hadoop supergroup     102365 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00001
-rw-r--r--   3 hadoop supergroup     210493 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00002
-rw-r--r--   3 hadoop supergroup     194585 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00003
-rw-r--r--   3 hadoop supergroup      97649 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00004
-rw-r--r--   3 hadoop supergroup          0 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00005
-rw-r--r--   3 hadoop supergroup      74188 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00006
-rw-r--r--   3 hadoop supergroup      61837 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00007
-rw-r--r--   3 hadoop supergroup     254879 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00008
-rw-r--r--   3 hadoop supergroup       6061 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00009
-rw-r--r--   3 hadoop supergroup          0 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00010
-rw-r--r--   3 hadoop supergroup     126900 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00011
-rw-r--r--   3 hadoop supergroup       3623 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00012
-rw-r--r--   3 hadoop supergroup      75816 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00013
-rw-r--r--   3 hadoop supergroup     358310 2018-05-09 10:38 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00014
-rw-r--r--   3 hadoop supergroup     115713 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00015
-rw-r--r--   3 hadoop supergroup      90556 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00016
-rw-r--r--   3 hadoop supergroup     150605 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00017
-rw-r--r--   3 hadoop supergroup          0 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00018
-rw-r--r--   3 hadoop supergroup      54610 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00019
-rw-r--r--   3 hadoop supergroup     163868 2018-05-09 10:36 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00020

解决办法很简单,使用LazyOutputFormat,从名字能看出,这个是lazy的outputformat。只有真正有数据要输出的时候,才会初始化一个hdfs上的文件,避免了形成空文件。
使用方式如下

//导入jar包
import org.apache.hadoop.mapreduce.lib.output.LazyOutputFormat;
//使用LazyOutputFormat
LazyOutputFormat.setOutputFormatClass(job, TextOutputFormat.class);

重跑下数据,现在ok了,空文件都没有了,如下

-rw-r--r--   3 hadoop supergroup          0 2018-05-09 11:04 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/_SUCCESS
drwxr-xr-x   - hadoop supergroup          0 2018-05-09 11:03 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/_temporary
-rw-r--r--   3 hadoop supergroup     307566 2018-05-09 11:03 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00000
-rw-r--r--   3 hadoop supergroup     101794 2018-05-09 11:02 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00001
-rw-r--r--   3 hadoop supergroup     219026 2018-05-09 11:03 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00002
-rw-r--r--   3 hadoop supergroup     195994 2018-05-09 11:02 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00003
-rw-r--r--   3 hadoop supergroup     101289 2018-05-09 11:02 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00004
-rw-r--r--   3 hadoop supergroup      73074 2018-05-09 11:02 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00006
-rw-r--r--   3 hadoop supergroup      60595 2018-05-09 11:02 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00007
-rw-r--r--   3 hadoop supergroup     258069 2018-05-09 11:02 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00008
-rw-r--r--   3 hadoop supergroup       6061 2018-05-09 11:02 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00009
-rw-r--r--   3 hadoop supergroup     127131 2018-05-09 11:02 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00011
-rw-r--r--   3 hadoop supergroup       3623 2018-05-09 11:02 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00012
-rw-r--r--   3 hadoop supergroup      75725 2018-05-09 11:02 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00013
-rw-r--r--   3 hadoop supergroup     366958 2018-05-09 11:04 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00014
-rw-r--r--   3 hadoop supergroup     113457 2018-05-09 11:02 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00015
-rw-r--r--   3 hadoop supergroup      87421 2018-05-09 11:02 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00016
-rw-r--r--   3 hadoop supergroup     148302 2018-05-09 11:03 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00017
-rw-r--r--   3 hadoop supergroup      54856 2018-05-09 11:02 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00019
-rw-r--r--   3 hadoop supergroup     162752 2018-05-09 11:02 /home/hadoop/offline/js_ad/daily_ad_url/2018-05-08/part-r-00020
测试数据: 067017    DA2821EA174C4CD6F4E0914C14E740BC    尊敬的周斌颉,您编号为14060800112的项目收款逾期,担保公司将对借款人进行催收,借款人将支付您一定的逾期罚息,详情请至陆金所网站查询。    2014-11-26     008080    B96D6244E733E1F97259927CF79B9B04    您的一笔借款已逾期!将每日产生罚息并影响您的信用记录,请您尽快还款。如您不再需要收到此类短信,请登录网站设置或致电400-090-6600    2014-11-26 420894    66AEE4A81D0DC3F7597CF14304DF8A37    马鹏云先生:您的借款第二次借款绝不逾期希望支持    第1期将于2014-12-03到期,为保证您的信誉良好,介时请及时还款,谢谢!    2014-11-26 067017    98717067FE78A6E71213A3F02969863C    尊敬的陈慧丽,您编号为14082000739的项目收款逾期,担保公司将对借款人进行催收,借款人将支付您一定的逾期罚息,详情请至陆金所网站查询。    2014-11-26 000000    4DCB184986008ADD3AD33E4860745FAA    [2111-9607-5482-7768]F 有效期2014-08-11到2014-10-31;项王故里成人票(停车场负一楼团队售票处报江苏南方旅行社验证取票,有问题联系唐13515299345)-成人票2张  000000    822D3A7BD4B44547D5E71C60D521D694    [2111-9211-4633-7607]U 有效期2014-10-17到2014-12-31;月亮河温泉度假酒店房-双人温泉/桑拿家庭套票1张  000000    4929EDF20844D65ECD4333FBA9D8FD7F    [2111-7081-7365-7431]G 有效期2014-12-15到2015-03-31;南京麦乐迪KTV-团圆桌餐698元/套(8-10人)VIP房(12-3)1张  000000    F64D4901A21600ED51BE0D49DF390F81    [2111-7381-8605-8288]Z 有效期2014-11-18到2015-09-30;顺景温泉酒店-行政豪华房 (含2人温泉)1张  000000    822D3A7BD4B44547D5E71C60D521D694    [2111-7011-4144-0946]F 有效期2014-10-17到2014-12-31月亮河温泉度假酒店房-双人特惠房2张 000000    C4183B38CF4D0141BF23CA1D794B4093    [2111-9677-3783-8938]S 有效期2013-11-01到2015-06-30汽车博物馆-双成人套票2张  000000    BF67C952CDE878AA79D2F6683A464947    [2111-4021-6549-0044]M 有效期2014-10-08到2015-08-31北京青泉赢睿卡丁车-假日票(新)4张 000000    22FD17C8CA607FB179D7FE505748AA61    [2111-4079-9733-2324]F 有效期2015-05-01到2015-08-31大兴野生动物园-自驾区车票1张 使用MapReduce清洗数据,并根据不同的内容分别输出到多个文件 清洗规则:提取第一列,第二列,第三列中括号里面的内容 结果数据: 如果第三列包含逾期则输出到overdue.txt 067017    DA2821EA174C4CD6F4E0914C14E740BC    008080    B96D6244E733E1F97259927CF79B9B04    420894    66AEE4A81D0DC3F7597CF14304DF8A37    067017    98717067FE78A6E71213A3F02969863C    如果第三列包含房则输出到house.txt 000000    4DCB184986008ADD3AD33E4860745FAA    000000    822D3A7BD4B44547D5E71C60D521D694      000000    4929EDF20844D65ECD4333FBA9D8FD7F      000000    F64D4901A21600ED51BE0D49DF390F81      000000    822D3A7BD4B44547D5E71C60D521D694    如果第三列包含车则输出到car.txt 000000    4DCB184986008ADD3AD33E4860745FAA    000000    C4183B38CF4D0141BF23CA1D794B4093      000000    BF67C952CDE878AA79D2F6683A464947    000000    22FD17C8CA607FB179D7FE505748AA61   
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页