日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 实现MapReduce函数

發布時間:2025/7/25 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 实现MapReduce函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

明白了MapReduce程序的工作原理之后,下一步就是寫代碼來實現它。我們需要三樣東西:一個map函數、一個reduce函數和一些用來運行作業的代碼。map函數由Mapper類來表示,后者聲明一個map()虛方法。范例2-3顯示了我們的map函數實現。

范例2-3 查找最高氣溫的Mapper類

Import java.Io.IOException; import org.apahce.hadoop.io.IntWritable; import org.apahce.hadoop.io.LongWritable; import org.apahce.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper;public class MaxTemperatureMapper extends MapReduceBase implements Mapper<LongWritable,Text,Text,IntWritable>{private static final int MISSING = 9999;@Overridepublic void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException{String line = value.toString();String year = line.substring(15,19);int airTemperature;if(line.charAt(87) =='+'){airTemperature = Integer.parseInt(line.substring(88,92));else{airTemperature = Integer.parseInt(line.subtring(87,92)); }String quality = line.substring(92,93);if(airTemperature != MISSING &&quality.matches("[01459]")){context.write(new Text(year),new IntWritetable(airTemperature)); }}} }

?

這個Mapper類是一個泛型類型,他有四個行參類型,分別指定:map函數的輸入鍵,輸入值,輸出鍵和輸出值的類型。就現在的例子來說,輸入鍵是一個長整數偏移量,輸入值是一行文本,輸出鍵是年份,輸出值是氣溫(整數)。Hadoop本身提供了一套可優化網絡序列化傳輸的基本類型,而不直接使用Java內嵌的類型。這些類型都在org.apache.hadoop.io包中。這里使用LongWritable類型(相當于Java的Long類型)、Text類型(相當于Java的String類型)和IntWritable類型(相當于Java的Integer類型)。

map()方法的輸入時一個鍵和一個值。我們首先將包含有一行輸入的Text值轉換成Java的String類型,之后使用substring()方法提取我們感興趣的列。

map()方法還提供了Context實例用于輸出內容的寫入。在這種情況下,我們將年份按Text對象進行讀/寫(因為我們把年份當作鍵),將氣溫值封裝在IntWritable類型中。只有氣溫數據不缺并且對應質量代碼顯示為正確的氣溫讀數時,這些數據才會被寫入輸出記錄中。

?

以類似方法用Reducer來定義reduce函數,如范例2-4所示。

范例2-4.查找最高氣溫的Reducer類

import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apche.hadoop.io.Text; import org.apche.hadoop.mapreduce.Reducer;public class MaxTemperatureReducer extends Reducer<Text,IntWritable,Text,IntWritable>{@Overidepublic void reduce(Text key,Interable<IntWritable> values,Context context){int maxValue = Integer.MIN_VALUE;for(IntWritable value:values){maxValue = Max.max(maxValue,value.get()); } context.write(key,new IntWritable(maxValue));}}

同樣,reduce函數也有四個形式參數類型用于指定輸入和輸出類型。reduce函數的輸入類型必須匹配map函數的輸出類型:即Text類型和IntWritable類型。在這種情況下,reduce函數的輸出類型也必須是Text和IntWritable類型,分別輸出年份及其最高氣溫。這個最高氣溫是通過循環比較每個氣溫與當前所知最高氣溫所得到的。

第三部分代碼負責運行MapReduce作業(請參見范例2-5)

范例2-5 這個應用程序在氣象數據集中找出最高氣溫

import java.oo.IOException; import org.apache.hadoop.fs.Path; import org.apahce.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.input.FileOutputFormat; import org.apache.hadoop.mapreduce.input.FileOutputFormat;public class MaxTemperature{public static void main(String[] args) throws Exception{if(args.length !=2){System.err.printlin("Usage:MaxTemperature<input path> <output path>"); System.exit(-1);}Job job = new Job(); job.serJarByClass(MaxTemperature.class); job.setName("Max temperature");FileInputFormat.addInputPath(job,new Path(args[0])); FileOutputFormat.setOutputPath(job,new Path([args[1]));job.setMapperClass(MaxTemperatureMapper,class); job.setReducerClass(MaxTemperatureReducer.class);job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class);System.exit(job.waitForCompletion(true)?0:1);}}

Job對象可以指定作業執行規范。我們可以用它來控制整個作業的運行。我們在Hadoop集群上運行這個作業時,要把代碼打包成一個Jar文件(Haoop在集群上發布在合格文件)。

不必明確指定JAR文件的名稱,在Job對象的setJarByClass()方法中傳遞一個類即可,Hadoop利用這個類來查找包含它的JAR文件,進而找到相關的Jar文件。

構造Job對象之后,需要指定輸入和輸出數據的路徑。調用FileInputFormat類的靜態方法addInputPath()來定義輸入數據的路徑,這個路徑可以是單個的文件、一個目錄(此時,將目錄下所有文件當做輸入)或符合特定文件模式的一系列文件。由函數名可知,可以多次調用addInputPath()來實現多路徑的輸入。

調用FileOutputFormat類中的靜態方法setOutputPath()來指定輸出路徑(只能有一個輸出路徑)。這個方法指定的是reduce函數輸出文件的寫入目錄。在運行作業前該目錄是不應該存在的,否則Hadoop會報錯并拒絕運行作業。這種預防措施的目的是放置數據丟失(長時間運行的作業如果結果被意外覆蓋,肯定是非常惱人的)。

接著,調用setMapperClas()和setReducerClass()指定map類型和reduce類型。
setOutputKeyClass()和setOutputValueClass()控制map和reduce函數的輸出類型,正如本例所示,這兩個輸出類型一般都是相同的。如果不同,則通過setMapOutputKeyClass()和setMapOutputValueClass()來設置mao函數的輸出類型。

輸入的類型通過InputFormat類來控制,我們的例子中沒有設置,因為使用的是默認的TextInputFormat(文本輸入格式)。

在設置定義map和reduce函數的類之后,可以開始運行作業。Job中的waitForCompletion()方法提交作業并等待執行完成。該方法中的布爾參數是個詳細標識,所以作業會把進度寫到控制臺。

waitForCompletion()方法返回一個布爾值,表示執行的成(true)敗(false)。

轉載于:https://www.cnblogs.com/jingblogs/p/5519349.html

總結

以上是生活随笔為你收集整理的Java 实现MapReduce函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 古代玷污糟蹋np高辣h文 | 在线国产视频 | 欧美啪啪网站 | 自由 日本语 热 亚洲人 | 美女毛片 | 亚洲精品一级片 | 国产视频123 | 黑人操日本女人 | 人妻巨大乳一二三区 | 色碰视频 | 久久久久久91 | 72种无遮挡啪啪的姿势 | 久久久久夜夜夜精品国产 | 初尝情欲h名器av | 精品少妇久久久久久888优播 | 青青草华人在线 | 国产精品嫩草影院桃色 | 极品销魂美女少妇尤物 | 欧美午夜一区二区 | 红桃成人网 | 7色av| 激情五月婷婷丁香 | 国产欧美成人 | 中文字幕av有码 | 亚洲视频精品一区 | 国产精品桃色 | 色爽影院| 国产午夜精品理论片 | 激情久久av | 国产色视频网站 | 亚洲人午夜射精精品日韩 | 深夜久久 | 超碰caoprom | 一本大道久久精品 | 日本电影大尺度免费观看 | 亚洲专区免费 | 国产在线超碰 | 国产午夜啪啪 | 免费性视频 | 在线观看毛片网站 | 三级不卡视频 | 国产九色视频 | 久久久无码人妻精品一区 | 免费男女乱淫真视频免费播放 | 乱一色一乱一性一视频 | 北条麻妃在线一区 | 国产一二在线 | 国产大屁股喷水视频在线观看 | 国产精品久久久久久一区二区三区 | 国产精品视频免费在线观看 | 成人午夜精品视频 | 最新中文字幕在线观看 | 黄色免费网站视频 | 成人免费视频免费观看 | 久草黄色 | 国产91页 | 成人在线播放av | 成人日韩 | 久草福利视频 | 欧美午夜一区二区 | 精品无码久久久久久久久果冻 | 天天天天射 | 在线精品国产 | 天天干女人 | 午夜激情av | 婷婷色网站 | 久久久成人精品 | 草久在线观看视频 | 青娱乐精品视频 | 日韩亚洲欧美在线观看 | 中文字幕激情视频 | 日日做夜夜爽毛片麻豆 | 国产电影一区二区三区爱妃记 | 婷婷精品一区二区三区 | 色哟哟无码精品一区二区三区 | 亚洲视频手机在线观看 | 亚洲欧美v | 五月天婷婷在线视频 | 四虎永久在线精品免费网址 | 亚洲第一精品在线观看 | 男人天堂av电影 | 催眠调教艳妇成肉便小说 | 成人欧美一区二区三区小说 | 香蕉久久a毛片 | 99国产精品久久久久99打野战 | 亚洲一区图片 | 亚洲色图13p| 色哟哟精品一区 | 欧美系列一区二区 | 国产麻豆乱码精品一区二区三区 | 公妇借种乱htp109cc | www香蕉视频 | 欧美精品一区二区蜜臀亚洲 | 阿v天堂在线 | 日本免费高清 | 男男一级淫片免费播放 | 尤物在线观看 | 亚洲第一天堂 | 天天拍夜夜拍 |