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影象長寬的整除問題 方法一:四捨五入法