1. 程式人生 > >hdfs使用隨機取樣器進行分區劃分實現全排序,totalOrderPartitioner,sampler

hdfs使用隨機取樣器進行分區劃分實現全排序,totalOrderPartitioner,sampler

問題描述

現在有個sequenceFile檔案裡面記錄著年份和溫度,key是年份value是溫度,找出每年的最高氣溫然後按照年份遞增排序。因為reducer預設會對key進行排序,解決辦法有兩種:第一種使用一個reducer,這樣做會造成效能問題,因為所有的key都發往了一臺機器。第二種是使用分割槽函式對年份進行分段,在每一個段是遞增排序,幾個reducer處理後的檔案拼接後在整體上也是有序的。

自定義的Mapper只需要把key-value發往Reducer即可:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;
/**
 * MaxTempMapper
 */
public class MaxTempMapper extends Mapper<IntWritable, IntWritable, IntWritable, IntWritable>{
    protected void map(IntWritable key, IntWritable value, Context context) throws IOException, InterruptedException {
        context.write(key,value);
    }
}

自定義的Reducer遍歷values,找出最大氣溫即可:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

/**
 * Reducer
 */
public class MaxTempReducer extends Reducer<IntWritable, IntWritable, IntWritable, IntWritable>{
    /**
     * reduce
     */
    protected void reduce(IntWritable key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int max = Integer.MIN_VALUE ;
        for(IntWritable iw : values){
            max = max > iw.get() ? max : iw.get() ;
        }
        context.write(key,new IntWritable(max));
    }

    public static void main(String[] args) {
        System.out.println(Integer.MIN_VALUE);
    }
}

啟動執行類"MaxTempApp"除了設定job執行的基本引數之外,還要設定分割槽類函式,和取樣器:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.partition.InputSampler;
import org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitioner;

/**
 * 求每個年份最高氣溫,然後按照年份遞增全排序
 * reducer數量為3
 */
public class MaxTempApp {

    public static void main(String[] args) throws Exception{
        Configuration conf = new Configuration();//配置物件
        conf.set("fs.defaultFS","file:///");//本地檔案協議
        Job job = Job.getInstance(conf);//job物件
        job.setJobName("maxTemperatureByTotalPartition");
        job.setInputFormatClass(SequenceFileInputFormat.class);
        job.setJarByClass(MaxTempApp.class);

        //job新增輸入路徑
        FileInputFormat.setInputPaths(job,new Path(args[0]));
        //job新增輸出路徑
        FileOutputFormat.setOutputPath(job,new Path(args[1]));
        job.setMapperClass(MaxTempMapper.class);
        job.setReducerClass(MaxTempReducer.class);
        job.setMapOutputKeyClass(IntWritable.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputKeyClass(IntWritable.class);
        job.setOutputValueClass(IntWritable.class);
        // job設定reducer個數
        job.setNumReduceTasks(3);

        //job設定全排序分割槽類,設定分割槽結果儲存路徑
        job.setPartitionerClass(TotalOrderPartitioner.class);
        TotalOrderPartitioner.setPartitionFile(job.getConfiguration(),new Path("/home/hadoop/seq/par.lst"));

        //job建立隨機取樣器物件,0.2樣本被採納的概率,4000是樣本數量
        InputSampler.Sampler<IntWritable,IntWritable> sampler = new InputSampler.RandomSampler<IntWritable, IntWritable>(0.2,4000);
        InputSampler.writePartitionFile(job,sampler);

        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

檢視取樣器的分割槽結果,我們的key值從1970-2069 我們設定的reducer個數為3,取樣器會生成兩個值把key分成三段:
key值在2004之前,2004-2035之間,(>=2035)之後


檢視輸出結果,生成了三個檔案每個檔案在相應的key區間裡有序,由於key區間也是有序的,全排序完成。


相關推薦

hdfs使用隨機取樣進行區劃實現排序totalOrderPartitioner,sampler

問題描述現在有個sequenceFile檔案裡面記錄著年份和溫度,key是年份value是溫度,找出每年的最高氣溫然後按照年份遞增排序。因為reducer預設會對key進行排序,解決辦法有兩種:第一種使用一個reducer,這樣做會造成效能問題,因為所有的key都發往了一臺機

運維學習之磁盤的區劃、管理及應用

linux磁盤管理1. bootloader(512) 啟動引導 / | \ / | \ mbr(446) mpt(6

用阿里巴巴官方給Jmeter開發的Dubbo sampler取樣進行dubbo介面測試【圖解剖析】

(本文圖片過於橫長,請右鍵新視窗開啟本文截圖) 【一】Dubbo sampler下載地址:       該外掛支援jmeter 3.2及3.2以上版本。       現在很多網際網路公司開發的系統中,越來越多的介面漸漸從http/https呼叫,改成了dubbo方式,原

linux伺服器掛載硬碟和伺服器硬碟區劃物理卷

通過VMware 編輯虛擬機器新增一塊硬碟,作為新的新檔案儲存 fdisk -l檢視伺服器硬碟分割槽 預設伺服器會有一塊 sda的硬碟,新新增的為sdb是未分割槽不能使用的硬碟空間 fdisk /dev/sdb  系統提示Command(m for help):m 會顯示選

element-UI 一個表格有頁、序號、排序使序號不因排序而變化

關鍵程式碼: <el-table-column fixed label="序號" width="50" align="center"> <template scope="scope"><span>{{scope.$index+(pag

自定義實現排序

hadoop utf shuf compareto on() dex rabl return main 數據準備 創建一個creatadatas.sh腳本 #!/bin/bash for i in {1..1000};do echo $RANDOM done;

Qt學習筆記-使用QScreen對螢幕進行截圖(可可部分)

執行截圖如下: 原始碼如下: widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace

Hadoop入門案例 排序TotalOrderPartitioner工具類+自動取樣

程式碼 package com.myhadoop.mapreduce.test; import org.apache.hadoop.conf.Configured; import org.apache.hadoop.fs.Path; import org.apache

對流(資料)進行自定義塊:partitioningBy收集

partitioningBy收集器 在JDK8中,可以對流進行方便的自定義分塊,通常是根據某種過濾條件將流一分為二。 例如:有一組人名,包含中文和英文,在 JDK8 中可以通過 partitioni

Lucene.net(4.8.0) 學習問題記錄五: JIEba詞和Lucene的結合以及對的思考

+= d+ ext eth reac chart rdl ret start 前言:目前自己在做使用Lucene.net和PanGu分詞實現全文檢索的工作,不過自己是把別人做好的項目進行遷移。因為項目整體要遷移到ASP.NET Core 2.0版本,而Lucene使用的版本

搜索引擎系列四:Lucene提供的、IKAnalyze中文集成

author oid core 長度 maven項目 int get attribute clu 一、Lucene提供的分詞器StandardAnalyzer和SmartChineseAnalyzer 1.新建一個測試Lucene提供的分詞器的maven項目LuceneAn

[NOI2015]軟件包管理(樹鏈剖)

algorithm sum print get fine continue n) != 一個 樹鏈剖分 在jacktang的幫助下終於al。。。 這道題剖分後用線段樹維護一個sum和lazy就可以了; install操作就是詢問x節點到根節點的路徑上有多少0;然後全部置為1

洛谷 P2146 [NOI2015]軟件包管理 樹鏈剖

並且 linu ins 輸出格式 manage 不依賴 change Nid sum 題面 題目描述 Linux用戶和OSX用戶一定對軟件包管理器不會陌生。通過軟件包管理器,你可以通過一行命令安裝某一個軟件包,然後軟件包管理器會幫助你從軟件源下載軟件包,同時自動解決所有的依

bzoj 4196 [Noi2015]軟體包管理 (樹鏈剖+線段樹)

4196: [Noi2015]軟體包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2852  Solved: 1668[Submit][Status][Discu

Lucene筆記14-Lucene的詞-的原理講解

一、分詞器原理 最主要的分詞器有SimpleAnalyzer、StopAnalyzer、WhitespaceAnalyzer、StandardAnalyzer。 先來研究一下SimpleAnalyzer。當一串資料傳進來之後,會被轉化成TokenStream這樣一個東西,這個TokenS

.net工具類 分享一個簡單的隨機紅包的實現方式

廢話不多說,直接上程式碼 /// <summary> /// 分紅包 /// </summary> public class RandomMoney { public RandomMoney(double totalMon

Django及自定義

info tar trap 當前頁 quest res error: 封裝 HERE Django的分頁器 view from django.shortcuts import render,HttpResponse # Create your views here. f

網路社區劃演算法

網路社區劃分演算法 目錄   [隱藏]  1 簡介 2 構建一個點選流網路 3 網路社區劃分的兩種主要思路:拓撲分析和流分析 4 拓

Es學習第五課 介紹和中文配置

 上課我們介紹了倒排索引,在裡面提到了分詞的概念,分詞器就是用來分詞的。 分詞器是ES中專門處理分詞的元件,英文為Analyzer,定義為:從一串文字中切分出一個一個的詞條,並對每個詞條進行標準化。它由三部分組成, Character Filters:分詞之前進行預處

用Python語言對任意影象進行m*n的均勻塊(思路非常清晰步驟簡單)

目錄 1.讀取原始影象 2.網格劃分,將影象劃分為m*n塊 2.1分塊後圖像的儲存問題 2.2影象的裁剪 2.3影象長寬的整除問題 方法一:四捨五入法