亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

Hadoop MapReduce多輸出詳細介紹

2024-09-01 13:49:50
字體:
來源:轉載
供稿:網友

Hadoop MapReduce多輸出

FileOutputFormat及其子類產生的文件放在輸出目錄下。每個reducer一個文件并且文件由分區號命名:part-r-00000,part-r-00001,等等。有時可能要對輸出的文件名進行控制或讓每個reducer輸出多個文件。MapReduce為此提供了MultipleOutputFormat類。

MultipleOutputFormat類可以將數據寫到多個文件,這些文件的名稱源于輸出的鍵和值或者任意字符串。這允許每個reducer(或者只有map作業的mapper)創建多個文件。采用name-r-nnnnn形式的文件名用于map輸出,name-r-nnnnn形式的文件名用于reduce輸出,其中name是由程序設定的任意名字,nnnnn是一個指名塊號的整數(從0開始)。塊號保證從不同塊(mapper或者reducer)寫的輸出在相同名字情況下不會沖突。

1. 重定義輸出文件名

我們可以對輸出的文件名進行控制??紤]這樣一個需求:按男女性別來區分度假訂單數據。這需要運行一個作業,作業的輸出是男女各一個文件,此文件包含男女性別的所有數據記錄。

這個需求可以使用MultipleOutputs來實現:

package com.sjf.open.test;import java.io.IOException;import org.apache.commons.lang3.StringUtils;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.conf.Configured;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.NullWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.io.compress.CompressionCodec;import org.apache.hadoop.io.compress.GzipCodec;import org.apache.hadoop.mapred.JobPriority;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.Mapper;import org.apache.hadoop.mapreduce.Reducer;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.input.FileSplit;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;import org.apache.hadoop.util.Tool;import org.apache.hadoop.util.ToolRunner;import com.sjf.open.utils.ConfigUtil;/** * Created by xiaosi on 16-11-7. */public class VacationOrderBySex extends Configured implements Tool {  public static void main(String[] args) throws Exception {    int status = ToolRunner.run(new VacationOrderBySex(), args);    System.exit(status);  }  public static class VacationOrderBySexMapper extends Mapper<LongWritable, Text, Text, Text> {    public String fInputPath = "";    @Override    protected void setup(Context context) throws IOException, InterruptedException {      super.setup(context);      fInputPath = ((FileSplit) context.getInputSplit()).getPath().toString();    }    @Override    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {      String line = value.toString();      if(fInputPath.contains("vacation_hot_country_order")){        String[] params = line.split("/t");        String sex = params[2];        if(StringUtils.isBlank(sex)){          return;        }        context.write(new Text(sex.toLowerCase()), value);      }    }  }  public static class VacationOrderBySexReducer extends Reducer<Text, Text, NullWritable, Text> {    private MultipleOutputs<NullWritable, Text> multipleOutputs;    @Override    protected void setup(Context context) throws IOException, InterruptedException {      multipleOutputs = new MultipleOutputs<NullWritable, Text>(context);    }    @Override    protected void reduce(Text key, Iterable<Text> values, Context context)        throws IOException, InterruptedException {      for (Text value : values) {        multipleOutputs.write(NullWritable.get(), value, key.toString());      }    }    @Override    protected void cleanup(Context context) throws IOException, InterruptedException {      multipleOutputs.close();    }  }  @Override  public int run(String[] args) throws Exception {    if (args.length != 2) {      System.err.println("./run <input> <output>");      System.exit(1);    }    String inputPath = args[0];    String outputPath = args[1];    int numReduceTasks = 16;    Configuration conf = this.getConf();    conf.setBoolean("mapred.output.compress", true);    conf.setClass("mapred.output.compression.codec", GzipCodec.class, CompressionCodec.class);    Job job = Job.getInstance(conf);    job.setJobName("vacation_order_by_jifeng.si");    job.setJarByClass(VacationOrderBySex.class);    job.setMapperClass(VacationOrderBySexMapper.class);    job.setReducerClass(VacationOrderBySexReducer.class);    job.setMapOutputKeyClass(Text.class);    job.setMapOutputValueClass(Text.class);    job.setOutputKeyClass(NullWritable.class);    job.setOutputValueClass(Text.class);    FileInputFormat.setInputPaths(job, inputPath);    FileOutputFormat.setOutputPath(job, new Path(outputPath));    job.setNumReduceTasks(numReduceTasks);    boolean success = job.waitForCompletion(true);    return success ? 0 : 1;  }}

在生成輸出的reduce中,在setup()方法中構造一個MultipleOutputs的實例并將它賦予一個實例變量。在reduce()方法中使用MultipleOutputs實例來寫輸出,而不是context。write()方法作用于鍵,值和名字。這里使用的是性別作為名字,因此最后產生的輸出名稱的形式為sex-r-nnnnn:

-rw-r--r--  3 wirelessdev wirelessdev     0 2016-12-06 10:41 tmp/data_group/order/vacation_hot_country_order_by_sex/_SUCCESS-rw-r--r--  3 wirelessdev wirelessdev   88574 2016-12-06 10:41 tmp/data_group/order/vacation_hot_country_order_by_sex/f-r-00005.gz-rw-r--r--  3 wirelessdev wirelessdev   60965 2016-12-06 10:41 tmp/data_group/order/vacation_hot_country_order_by_sex/m-r-00012.gz-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 10:41 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00000.gz-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 10:41 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00001.gz-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 10:41 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00002.gz-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 10:41 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00003.gz-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 10:41 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00004.gz-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 10:41 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00005.gz-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 10:41 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00006.gz-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 10:41 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00007.gz-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 10:41 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00008.gz

我們可以看到在輸出文件中不僅有我們想要的輸出文件類型,還有part-r-nnnnn形式的文件,但是文件內沒有信息,這是程序默認的輸出文件。所以我們在指定輸出文件名稱時(name-r-nnnnn),不要指定name為part,因為它已經被使用為默認值了。

2. 多目錄輸出

在MultipleOutputs的write()方法中指定的基本路徑相對于輸出路徑進行解釋,因為它可以包含文件路徑分隔符(/),創建任意深度的子目錄。例如,我們改動上面的需求:按男女性別來區分度假訂單數據,不同性別數據位于不同子目錄(例如:sex=f/part-r-00000)。

 public static class VacationOrderBySexReducer extends Reducer<Text, Text, NullWritable, Text> {    private MultipleOutputs<NullWritable, Text> multipleOutputs;    @Override    protected void setup(Context context) throws IOException, InterruptedException {      multipleOutputs = new MultipleOutputs<NullWritable, Text>(context);    }    @Override    protected void reduce(Text key, Iterable<Text> values, Context context)        throws IOException, InterruptedException {      for (Text value : values) {        String basePath = String.format("sex=%s/part", key.toString());        multipleOutputs.write(NullWritable.get(), value, basePath);      }    }    @Override    protected void cleanup(Context context) throws IOException, InterruptedException {      multipleOutputs.close();    }  }

后產生的輸出名稱的形式為sex=f/part-r-nnnnn或者sex=m/part-r-nnnnn:

-rw-r--r--  3 wirelessdev wirelessdev     0 2016-12-06 12:26 tmp/data_group/order/vacation_hot_country_order_by_sex/_SUCCESS-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 12:26 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00000.gz-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 12:26 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00001.gz-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 12:26 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00002.gz-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 12:26 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00003.gz-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 12:26 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00004.gz-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 12:26 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00005.gz-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 12:26 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00006.gz-rw-r--r--  3 wirelessdev wirelessdev     20 2016-12-06 12:26 tmp/data_group/order/vacation_hot_country_order_by_sex/part-r-00007.gzdrwxr-xr-x  - wirelessdev wirelessdev     0 2016-12-06 12:26 tmp/data_group/order/vacation_hot_country_order_by_sex/sex=fdrwxr-xr-x  - wirelessdev wirelessdev     0 2016-12-06 12:26 tmp/data_group/order/vacation_hot_country_order_by_sex/sex=m

?3. 延遲輸出

FileOutputFormat的子類會產生輸出文件(part-r-nnnnn),即使文件是空的,也會產生。我們有時候不想要這些空的文件,我們可以使用LazyOutputFormat進行處理。它是一個封裝輸出格式,可以指定分區第一條記錄輸出時才真正創建文件。要使用它,用JobConf和相關輸出格式作為參數來調用setOutputFormatClass()方法即可:

Configuration conf = this.getConf();Job job = Job.getInstance(conf);LazyOutputFormat.setOutputFormatClass(job, TextOutputFormat.class);

再次檢查一下我們的輸出文件(第一個例子):

sudo -uwirelessdev hadoop fs -ls tmp/data_group/order/vacation_hot_country_order_by_sex/Found 3 items-rw-r--r--  3 wirelessdev wirelessdev     0 2016-12-06 13:36 tmp/data_group/order/vacation_hot_country_order_by_sex/_SUCCESS-rw-r--r--  3 wirelessdev wirelessdev   88574 2016-12-06 13:36 tmp/data_group/order/vacation_hot_country_order_by_sex/f-r-00005.gz-rw-r--r--  3 wirelessdev wirelessdev   60965 2016-12-06 13:36 tmp/data_group/order/vacation_hot_country_order_by_sex/m-r-00012.gz

?感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩欧美视频| 久久久久久久久久久人体| 国产精品青青在线观看爽香蕉| 一区二区三区回区在观看免费视频| 亚洲国产成人精品女人久久久| 97成人在线视频| 日韩精品福利网站| 亚洲国产一区自拍| 高清一区二区三区日本久| 91精品综合视频| 精品国产视频在线| 午夜精品久久久99热福利| 亚洲精品国产成人| 精品国偷自产在线视频99| 中文字幕日韩高清| 亚洲字幕在线观看| 日韩毛片在线观看| 亚洲自拍偷拍一区| 久久久久久12| 国产精品久久久久7777婷婷| 国产精品va在线播放| 日本不卡高字幕在线2019| 欧美成人h版在线观看| 一区二区日韩精品| 免费av在线一区| 亚洲精品之草原avav久久| 欧美大全免费观看电视剧大泉洋| 国产精品6699| 亚洲一区二区中文字幕| 97超级碰碰碰久久久| 亚洲精品一区二区久| 久久久亚洲天堂| 97在线观看视频国产| 久久久国产视频91| 色无极影院亚洲| 精品国产依人香蕉在线精品| 国产精品视频免费在线观看| 97av在线视频免费播放| 国产精品久久综合av爱欲tv| 国产精品自拍偷拍| 中文精品99久久国产香蕉| 国产精品爱啪在线线免费观看| 色噜噜国产精品视频一区二区| 亚洲性夜色噜噜噜7777| 亚洲欧美日韩在线高清直播| 国产精品久久久久久久app| 亚洲美女又黄又爽在线观看| 亚洲天堂第二页| 91亚洲va在线va天堂va国| 欧美人交a欧美精品| 丝袜美腿亚洲一区二区| 国产精品久久久久77777| 国产精品网红福利| 欧美做受高潮1| 国产一区二区三区四区福利| 色综合色综合网色综合| 中文字幕免费精品一区| 亚洲国产精品va在线观看黑人| 欧美日韩午夜剧场| 久久久久久亚洲| 国产精品入口免费视| 国产精品jizz在线观看麻豆| 色噜噜亚洲精品中文字幕| 日韩欧美国产激情| 色综合视频一区中文字幕| 欧美午夜片在线免费观看| 亚洲自拍偷拍视频| 久色乳综合思思在线视频| 最近2019好看的中文字幕免费| www.亚洲一区| 亚洲直播在线一区| 成人免费视频97| 亚洲伊人久久大香线蕉av| 伊人久久久久久久久久| 91福利视频网| 琪琪亚洲精品午夜在线| 亚洲欧美国产精品专区久久| 国产精品国产三级国产专播精品人| 中文字幕精品一区二区精品| 欧美老女人性视频| 日韩欧亚中文在线| 欧美高清一级大片| 欧美乱大交xxxxx| 亚洲国产成人精品一区二区| 2019国产精品自在线拍国产不卡| 久久精品一偷一偷国产| 国产精品亚洲аv天堂网| 午夜剧场成人观在线视频免费观看| 久久91亚洲精品中文字幕| 成人免费午夜电影| 日韩免费在线视频| 日韩成人av网| 欧美大学生性色视频| 欧美成人午夜激情视频| 中文字幕日韩欧美精品在线观看| 91高清视频免费| 亚洲第一精品福利| 在线观看视频亚洲| 国产精品露脸av在线| 精品久久久久久久久久| 欧美有码在线观看视频| 日韩在线观看精品| 国产精品久久久久秋霞鲁丝| 亚洲美女免费精品视频在线观看| 欧美亚洲成人xxx| 日韩av一区二区在线| 黄网动漫久久久| 国产精品白嫩初高中害羞小美女| 欧美日韩国产精品一区二区不卡中文| 国产欧美日韩中文| 国产精品久久久久久久天堂| 欧美午夜美女看片| 日韩午夜在线视频| 91美女片黄在线观| 久久6精品影院| 国产日韩精品在线播放| 秋霞成人午夜鲁丝一区二区三区| 91极品视频在线| 久久伊人精品一区二区三区| 777午夜精品福利在线观看| 亚洲国产精品成人av| 69国产精品成人在线播放| 亚洲电影免费观看高清| 亚洲va国产va天堂va久久| 国产亚洲精品久久久久久牛牛| 最近日韩中文字幕中文| 国产日韩欧美一二三区| 国产亚洲一区二区精品| 日韩在线免费观看视频| 欧美日韩免费区域视频在线观看| 8090成年在线看片午夜| 一本色道久久88精品综合| 黑人巨大精品欧美一区二区一视频| 日韩视频免费中文字幕| 国产精品jvid在线观看蜜臀| 神马久久久久久| 日韩av在线电影网| 欧美一区二区三区免费视| 国产精品情侣自拍| 亚洲精品视频网上网址在线观看| 国产精品日韩电影| 神马久久久久久| 日韩视频欧美视频| 欧美电影免费看| 2018中文字幕一区二区三区| 日韩av成人在线| 成人日韩av在线| 国产精品欧美激情在线播放| 国产精品稀缺呦系列在线| 国产精品福利在线观看| 欧美第一淫aaasss性| 久久久精品2019中文字幕神马| 国产专区精品视频| 日本成人黄色片| 精品亚洲永久免费精品| 亚洲成人免费在线视频| 久久久亚洲国产天美传媒修理工| 欧美韩国理论所午夜片917电影| 日韩精品在线观看一区二区| 亚洲一区二区黄| 欧美孕妇与黑人孕交| 久久精品国产v日韩v亚洲| 久久成人国产精品| 日韩av在线电影网|