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

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

Hadoop對文本文件的快速全局排序實現方法及分析

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

一、背景

Hadoop中實現了用于全局排序的InputSampler類和TotalOrderPartitioner類,調用示例是org.apache.hadoop.examples.Sort。

但是當我們以Text文件作為輸入時,結果并非按Text中的string列排序,而且輸出結果是SequenceFile。

原因:

1) hadoop在處理Text文件時,key是行號LongWritable類型,InputSampler抽樣的是key,TotalOrderPartitioner也是用key去查找分區。這樣,抽樣得到的partition文件是對行號的抽樣,結果自然是根據行號來排序。

2)大數據量時,InputSampler抽樣速度會非常慢。比如,RandomSampler需要遍歷所有數據,IntervalSampler需要遍歷文件數與splits數一樣。SplitSampler效率比較高,但它只抽取每個文件前面的記錄,不適合應用于文件內有序的情況。

二、功能

1. 實現了一種局部抽樣方法PartialSampler,適用于輸入數據各文件是獨立同分布的情況

2. 使RandomSampler、IntervalSampler、SplitSampler支持對文本的抽樣

3. 實現了針對Text文件string列的TotalOrderPartitioner

三、實現

1. PartialSampler

PartialSampler從第一份輸入數據中隨機抽取第一列文本數據。PartialSampler有兩個屬性:freq(采樣頻率),numSamples(采樣總數)。

public K[] getSample(InputFormat<K,V> inf, JobConf job) throws IOException {   InputSplit[] splits = inf.getSplits(job, job.getNumMapTasks());   ArrayList<K> samples = new ArrayList<K>(numSamples);   Random r = new Random();   long seed = r.nextLong();   r.setSeed(seed);   LOG.debug("seed: " + seed);      // 對splits【0】抽樣   for (int i = 0; i < 1; i++) {    System.out.println("PartialSampler will getSample splits["+i+"]");    RecordReader<K,V> reader = inf.getRecordReader(splits[i], job,      Reporter.NULL);    K key = reader.createKey();    V value = reader.createValue();    while (reader.next(key, value)) {     if (r.nextDouble() <= freq) {      if (samples.size() < numSamples) {        // 選擇value中的第一列抽樣        Text value0 = new Text(value.toString().split("/t")[0]);             samples.add((K) value0);              } else {       // When exceeding the maximum number of samples, replace a       // random element with this one, then adjust the frequency       // to reflect the possibility of existing elements being       // pushed out       int ind = r.nextInt(numSamples);       if (ind != numSamples) {        Text value0 = new Text(value.toString().split("/t")[0]);         samples.set(ind, (K) value0);       }       freq *= (numSamples - 1) / (double) numSamples;      }      key = reader.createKey();     }    }        reader.close();   }   return (K[])samples.toArray();  }

首先通過InputFormat的getSplits方法得到所有的輸入分區;

然后掃描第一個分區中的記錄進行采樣。

記錄采樣的具體過程如下:

從指定分區中取出一條記錄,判斷得到的隨機浮點數是否小于等于采樣頻率freq

  如果大于則放棄這條記錄;

  如果小于,則判斷當前的采樣數是否小于最大采樣數,

    如果小于則這條記錄被選中,被放進采樣集合中;

    否則從【0,numSamples】中選擇一個隨機數,如果這個隨機數不等于最大采樣數numSamples,則用這條記錄替換掉采樣集合隨機數對應位置的記錄,同時采樣頻率freq減小變為freq*(numSamples-1)/numSamples。

然后依次遍歷分區中的其它記錄。

note:

1)PartialSampler只適用于輸入數據各文件是獨立同分布的情況。

2)自帶的三種Sampler通過修改samples.add(key)為samples.add((K) value0); 也可以實現對第一列的抽樣。

2. TotalOrderPartitioner

TotalOrderPartitioner主要改進了兩點:

1)讀partition時指定keyClass為Text.class

因為partition文件中的key類型為Text

在configure函數中,修改:

//Class<K> keyClass = (Class<K>)job.getMapOutputKeyClass();Class<K> keyClass = (Class<K>)Text.class;

2)查找分區時,改用value查

public int getPartition(K key, V value, int numPartitions) {  Text value0 = new Text(value.toString().split("/t")[0]);   return partitions.findPartition((K) value0); }

3. Sort

1)設置InputFormat、OutputFormat、OutputKeyClass、OutputValueClass、MapOutputKeyClass

2)初始化InputSampler對象,抽樣

3)partitionFile通過CacheFile傳給TotalOrderPartitioner,執行MapReduce任務

 Class<? extends InputFormat> inputFormatClass = TextInputFormat.class;  Class<? extends OutputFormat> outputFormatClass = TextOutputFormat.class;  Class<? extends WritableComparable> outputKeyClass = Text.class;  Class<? extends Writable> outputValueClass = Text.class;  jobConf.setMapOutputKeyClass(LongWritable.class);  // Set user-supplied (possibly default) job configs  jobConf.setNumReduceTasks(num_reduces);  jobConf.setInputFormat(inputFormatClass);  jobConf.setOutputFormat(outputFormatClass);  jobConf.setOutputKeyClass(outputKeyClass);  jobConf.setOutputValueClass(outputValueClass);  if (sampler != null) {   System.out.println("Sampling input to effect total-order sort...");   jobConf.setPartitionerClass(TotalOrderPartitioner.class);   Path inputDir = FileInputFormat.getInputPaths(jobConf)[0];   inputDir = inputDir.makeQualified(inputDir.getFileSystem(jobConf));   //Path partitionFile = new Path(inputDir, "_sortPartitioning");   TotalOrderPartitioner.setPartitionFile(jobConf, partitionFile);   InputSampler.<K,V>writePartitionFile(jobConf, sampler);   URI partitionUri = new URI(partitionFile.toString() + "#" + "_sortPartitioning");   DistributedCache.addCacheFile(partitionUri, jobConf);   DistributedCache.createSymlink(jobConf);  }  FileSystem hdfs = FileSystem.get(jobConf);  hdfs.delete(outputpath);  hdfs.close();  System.out.println("Running on " +    cluster.getTaskTrackers() +    " nodes to sort from " +     FileInputFormat.getInputPaths(jobConf)[0] + " into " +    FileOutputFormat.getOutputPath(jobConf) +    " with " + num_reduces + " reduces.");  Date startTime = new Date();  System.out.println("Job started: " + startTime);  jobResult = JobClient.runJob(jobConf);

四、執行

usage:

hadoop jar yitengfei.jar com.yitengfei.Sort [-m <maps>] [-r <reduces>]
[-splitRandom <double pcnt> <numSamples> <maxsplits> | // Sample from random splits at random (general)
-splitSample <numSamples> <maxsplits> | // Sample from first records in splits (random data)
-splitInterval <double pcnt> <maxsplits>] // Sample from splits at intervals (sorted data)
-splitPartial <double pcnt> <numSamples> <maxsplits> | // Sample from partial splits at random (general) ]
<input> <output> <partitionfile>

Example:

hadoop jar yitengfei.jar com.yitengfei.Sort -r 10 -splitPartial 0.1 10000 10 /user/rp-rd/yitengfei/sample/input /user/rp-rd/yitengfei/sample/output /user/rp-rd/yitengfei/sample/partition

五、性能

200G輸入數據,15億條url,1000個分區,排序時間只用了6分鐘

總結

以上就是本文關于Hadoop對文本文件的快速全局排序實現方法及分析的全部內容,希望對大家有所幫助 ,如有不足之處,歡迎留言指出,感謝朋友們對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91九色单男在线观看| 国产精品直播网红| 亚洲精品一区二区三区不| 欧美性猛交xxxx乱大交蜜桃| 国产精品视频xxx| 成人在线精品视频| 亚洲在线免费看| 亚洲国产成人爱av在线播放| 精品久久久久久亚洲国产300| 久久婷婷国产麻豆91天堂| 日韩欧美aaa| 午夜精品福利视频| 日韩在线资源网| 欧美裸体xxxx极品少妇软件| 日韩av在线天堂网| 日本伊人精品一区二区三区介绍| 中文字幕日本欧美| 欧美在线观看一区二区三区| 在线观看精品国产视频| 亚洲欧美在线一区| 欧美在线观看www| 一区二区中文字幕| 欧美视频在线观看 亚洲欧| 国产成人精品在线播放| 亚洲欧美成人一区二区在线电影| 国产欧美一区二区三区久久| 日韩美女毛茸茸| 色婷婷综合久久久久中文字幕1| 欧美性精品220| 亚洲成人黄色在线| 亚洲国产精品人久久电影| 国产成人精品免高潮费视频| 亚洲国产精品国自产拍av秋霞| 热久久这里只有精品| 91美女高潮出水| 国产精品电影久久久久电影网| 国产精品视频在线播放| 亚洲欧美另类在线观看| 在线日韩av观看| 中文字幕一区二区精品| 久久中文字幕国产| 狠狠躁天天躁日日躁欧美| 隔壁老王国产在线精品| 激情成人中文字幕| 69国产精品成人在线播放| 久久久久久伊人| 91亚洲国产成人久久精品网站| 成人免费看黄网站| 久久免费视频网站| 欧美色videos| 成人美女免费网站视频| 午夜精品福利视频| 日韩美女写真福利在线观看| 久久久久久中文| 国产www精品| 中文字幕精品网| 日本免费久久高清视频| 日韩欧美亚洲国产一区| 欧美国产一区二区三区| 亚洲毛片在线免费观看| 韩国视频理论视频久久| 日韩在线高清视频| 日韩欧美中文字幕在线观看| 国产精品爱久久久久久久| 日韩在线观看免费高清| 欧美日韩精品在线观看| 国产精品免费久久久| 亚洲一区二区三区毛片| 亚洲第一网中文字幕| 亚洲欧美国内爽妇网| 色婷婷综合成人av| 国产成人在线一区| 亚洲人成人99网站| 久久久久久久久国产| 日韩av电影中文字幕| 亚洲国产精品女人久久久| 最近2019年手机中文字幕| 日韩av观看网址| 国产精品18久久久久久麻辣| 国产精品av电影| 国产精品第8页| 成人激情在线观看| 97av在线视频免费播放| 最近2019好看的中文字幕免费| 3344国产精品免费看| 午夜精品久久久久久久99黑人| 亚洲小视频在线观看| 欧美在线观看一区二区三区| 欧美一级免费看| 欧美性精品220| 欧美激情高清视频| 久久影院在线观看| 欧美又大又粗又长| 黄色一区二区三区| 超碰97人人做人人爱少妇| 日日噜噜噜夜夜爽亚洲精品| 国产99久久精品一区二区永久免费| 久久精品中文字幕一区| 欧美乱人伦中文字幕在线| 精品欧美aⅴ在线网站| 最新中文字幕亚洲| 国产欧美精品一区二区三区介绍| 久久男人的天堂| 欧美有码在线观看视频| 日韩中文有码在线视频| 亚洲天堂色网站| 成人黄色激情网| 国产成人拍精品视频午夜网站| 日本老师69xxx| 欧美日韩国产成人在线| 俺也去精品视频在线观看| 欧美综合国产精品久久丁香| 欧美性视频精品| 欧美日韩精品在线观看| www.久久草.com| 日韩在线视频观看| 日本亚洲欧洲色| 欧美性69xxxx肥| 91在线观看免费高清| 日韩电影视频免费| 亚洲欧美激情一区| 国产精品成av人在线视午夜片| 亚洲国产97在线精品一区| 日韩视频在线观看免费| 国产日韩欧美日韩| 欧美视频在线观看免费| 久久久亚洲影院你懂的| 欧美老少做受xxxx高潮| 亚洲福利视频网站| 国产一区二区在线免费视频| 欧美另类老肥妇| 欧美亚洲国产视频| 亚洲人成电影网站色xx| 亚洲一区二区三区xxx视频| 国产欧美精品在线播放| 成人免费网站在线| 欧美综合一区第一页| 国产精品久久久久久久av电影| 久久久久久久999精品视频| 91高清视频免费| 国产精品成人一区二区三区吃奶| 国产69精品久久久久久| 亚洲精品国产综合久久| 国产精品高精视频免费| 欧美大片在线看| 国产91对白在线播放| 欧美日韩国产综合视频在线观看中文| 国产一区二区三区毛片| 一区二区亚洲欧洲国产日韩| 成人精品aaaa网站| 中文字幕一区二区三区电影| 欧洲成人性视频| 免费99精品国产自在在线| 亚洲另类图片色| 欧美有码在线观看| 日韩精品在线免费播放| 一区二区亚洲精品国产| 久久久久久久97| 97在线观看视频国产| 日韩在线观看网址| 亚洲欧美999| 国产在线观看精品一区二区三区| 美女性感视频久久久| 国产精品三级久久久久久电影|