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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

逐行分析Hadoop的HelloWorld

發(fā)布時間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 逐行分析Hadoop的HelloWorld 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

學(xué)寫代碼的時候,我們總是先從helloworld開始寫起,那么學(xué)習(xí)Hadoop,我們也必不可少的從helloworld開始,那么WordCount作為經(jīng)典的Hadoop程序,可以作為我們庖丁解牛的材料,進而從代碼的角度學(xué)習(xí)一下mapreduce的實現(xiàn)過程。下面我們就開始一步步的探索。

先從源碼看起,再一步步剖析

package org.apache.hadoop.examples;import java.io.IOException; import java.util.StringTokenizer;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; 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.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser;public class WordCount {public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(Object key, Text value, Context context) throws IOException, InterruptedException {StringTokenizer itr = new StringTokenizer(value.toString());while (itr.hasMoreTokens()) {word.set(itr.nextToken());context.write(word, one);}}}public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {private IntWritable result = new IntWritable();public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {sum += val.get();}result.set(sum);context.write(key, result);}}public static void main(String[] args) throws Exception {Configuration conf = new Configuration();conf.set("mapred.job.tracker", "172.16.10.15:9001");//自己額外加的代碼String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();if (otherArgs.length != 2) {System.err.println("Usage: wordcount <in> <out>");System.exit(2);}Job job = new Job(conf, "word count");job.setJarByClass(WordCount.class);job.setMapperClass(TokenizerMapper.class);job.setCombinerClass(IntSumReducer.class);job.setReducerClass(IntSumReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path(otherArgs[0]));FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));System.exit(job.waitForCompletion(true) ? 0 : 1);} }

大家可以看到整個源代碼分為三個部分:

1. Map

public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(Object key, Text value, Context context) throws IOException, InterruptedException {StringTokenizer itr = new StringTokenizer(value.toString());while (itr.hasMoreTokens()) {word.set(itr.nextToken());context.write(word, one);}}}

a) 定義一個自己的Map過程,TokenizerMapper 這個類名自己設(shè)定,這個類需要繼承org.apache.hadoop.mapreduce包中的Mapper類,四個參數(shù)分別表示輸入鍵key的參數(shù)類型,輸入值value的參數(shù)類型,輸出鍵key的參數(shù)類型,輸出值value的參數(shù)類型 值得注意的是Hadoop本身提供了一套可優(yōu)化的網(wǎng)絡(luò)序列化傳輸?shù)幕绢愋?#xff0c;而不是用java內(nèi)嵌的類型。這些類型都是在org.apache.hadoop.io包中。其中LongWritable類型相當(dāng)于Long類型,Text類型相當(dāng)于String類型,IntWritable相當(dāng)于Integer類型。
b) map方法中參數(shù)value是指文本文件中的一行,參數(shù)key是為該行首字母相對于文本文件首地址的偏移量
c) StringTokenizer類是一個用來分隔String的應(yīng)用類,類似于split。

//它的構(gòu)造函數(shù)有三種: public StringTokenizer(String str) public StringTokenizer(String str,String delim) public StringTokenizer(String str,String delim,boolean returnDelims) //其中第一個參數(shù)為要分隔的String,第二個參數(shù)為分隔字符集合,第三個參數(shù)為分隔符是否作為標(biāo)記返回,如果不指定分隔符,默認是'\t\n\r\f' //它的方法主要有三種: public boolean hasMoreTokens()//返回是否還有分隔符 public String nextToken()//返回從當(dāng)前位置到下一個分隔符的字符串 public int countTokens()//返回nextToken方法被調(diào)用的次數(shù)

d) 經(jīng)過StringTolenizer 處理之后會得到一個個 < word,1 > 這樣的鍵值對,放在context里,Context用于輸出內(nèi)容的寫入,讀起來有點兒繞口,自己理解一下。

2. Reduce

public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {private IntWritable result = new IntWritable();public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {sum += val.get();}result.set(sum);context.write(key, result);} }

a) 同mapper 過程一樣,Reduce過程需要繼承org.apache.hadoop.mapreduce包中Reducer類,并重寫其reduce方法。?
b) reduce方法中輸入?yún)?shù)key 指單個單詞,values 指對應(yīng)單詞的計數(shù)值的列表?
c) reduce 方法的目的就是對列表的值進行加和處理?
d) 輸出的是< key,value>,key 指單個單詞,value 指對應(yīng)單詞的計數(shù)值的列表的值的總和。

3. Main

public static void main(String[] args) throws Exception {Configuration conf = new Configuration();conf.set("mapred.job.tracker", "172.16.10.15:9001");//自己額外加的代碼String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();if (otherArgs.length != 2) {System.err.println("Usage: wordcount <in> <out>");System.exit(2);}Job job = new Job(conf, "word count");job.setJarByClass(WordCount.class);job.setMapperClass(TokenizerMapper.class);job.setCombinerClass(IntSumReducer.class);job.setReducerClass(IntSumReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path(otherArgs[0]));FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));System.exit(job.waitForCompletion(true) ? 0 : 1); }

a) Configuration conf = new Configuration(); 默認情況下,Configuration開始實例化的時候,會從Hadoop的配置文件里讀取參數(shù)。?
b) conf.set(“mapred.job.tracker”, “172.16.10.15:9001”);設(shè)置這句代碼是由于我們要把使用eclipse提交作業(yè)到Hadoop集群,所以手動添加Job運行地址。若是直接在Hadoop 集群進行運行,不用加這句代碼。 而且你可以看到只要前三句使用了這個代碼,所以這三句以后的代碼才是所有Hadoop例子中都會包含的。
c) 接下來這一句也是讀取參數(shù),這里是從命令行參數(shù)里讀取參數(shù)。?
d) Job job = new Job(conf, “word count”); 在MapReduce處理過程中,由Job對象負責(zé)管理和運行一個計算任務(wù),然后通過Job的若干方法來對任務(wù)的參數(shù)進行設(shè)置。”word count”是Job的名字,(當(dāng)然了,根據(jù)所有java語言規(guī)范規(guī)定的那樣,你也可以用

Job job = new Job(); job.setJobName("Name");

的形式做聲明)。?
e) job.setJarByClass(WordCount.class);是根據(jù)WordCount類的位置設(shè)置Jar文件 。

為什么要這么做?因為我們在Hadoop集群上運行這個作業(yè)時候,要把代碼打包成一個JAR文件,用以在集群上發(fā)布這個文件。Hadoop利用這個傳遞進去的類來查找包含它的JAR文件。
f) job.setMapperClass(TokenizerMapper.class);設(shè)置Mapper?
g) job.setCombinerClass(IntSumReducer.class);設(shè)置Combiner,這里先使用Reduce類來進行Mapper 的中間結(jié)果的合并,能夠減輕網(wǎng)絡(luò)傳輸?shù)膲毫Α?
h) job.setReducerClass(IntSumReducer.class);設(shè)置Reduce?
i) job.setOutputKeyClass(Text.class);和 job.setOutputValueClass(IntWritable.class);分別是設(shè)置輸出鍵的類型和設(shè)置輸出值的類型?
j) FileInputFormat.addInputPath(job, new Path(otherArgs[0]));設(shè)置輸入文件,它是otherArgs第一個參數(shù)?
k) FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));設(shè)置輸出文件,將輸出結(jié)果寫入這個文件里,它是otherArgs第二個參數(shù) 。

注意:在運行作業(yè)前這個輸出目錄不應(yīng)該存在,否則Hadoop會報錯并拒絕運行該作業(yè)。這種預(yù)防措施的目的是防止數(shù)據(jù)丟失(如果長時間運行的數(shù)據(jù)結(jié)果被意外覆蓋,肯定是非常惱人的)
l) System.exit(job.waitForCompletion(true) ? 0 : 1);job執(zhí)行,等待執(zhí)行結(jié)果

4. 各個包的功能

到此為止,三大部分就分析完畢,然后再來看看引入的有哪些類:

a) package org.apache.hadoop.examples;Java 提供包機制管理代碼,關(guān)鍵詞是package, 包名字可以自己定,但不能重復(fù)。通常為了包的唯一性,推薦使用公司域名的逆序作為包,于是有了上面例子中的‘org.apache.hadoop’這樣的包名。?
b) import java.io.IOException; 凡是以java開頭的包,在JDK1.7的API里可以找到類的資料。這里是從java.io中引入IOException,是一個輸入輸出異常類。?
c) import java.util.StringTokenizer;這是從java.util包中引入的StringTokenizer類,是一個解析文本的類。具體用法上文中已提過了。?
d) import org.apache.hadoop.conf.Configuration;凡是以org.apache.hadoop開頭的包,在Hadoop1.2.1 的API文檔可以找到類的資料。這里是從hadoop的conf包中引入Configuration類,它是一個讀寫和保存配置信息的類。?
e) import org.apache.hadoop.fs.Path; ?Path類保存文件或者目錄的路徑字符串?
f) import org.apache.hadoop.io.IntWritable; ?IntWritable是一個以類表示的可序化的整數(shù)。在java中,要表示一個整數(shù),可以使用int類型,也可以使用integer類型,integer封裝了int類型,且integer類是可序化的。但Hadoop認為integer的可序化不合適,于是實現(xiàn)了IntWritable。?
g) import org.apache.hadoop.io.Text; ?從io包中引入Text類,是一個存儲字符串的可比較可序化的類。?
h) import org.apache.hadoop.mapreduce.Job; ?引入Job類,Hadoop中每個需要執(zhí)行的任務(wù)是一個Job,這個Job負責(zé)參數(shù)配置、設(shè)置MapReduce細節(jié)、提交到Hadoop集群、執(zhí)行控制等操作。?
i) import org.apache.hadoop.mapreduce.Mapper;引入Mapper類,負責(zé)MapReduce中的Map過程。?
j) import org.apache.hadoop.mapreduce.Reducer;引入Reduce類,負責(zé)MapReduce中的Reduce過程。?
k) import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;引入FileInputFormat類,主要功能是將文件進行切片。?
l) import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;FileOutputFormat類是將輸出結(jié)果寫入文件。?
m) import org.apache.hadoop.util.GenericOptionsParser;這個類負責(zé)解析命令行參數(shù)。

?

從代碼的功能上,我們已經(jīng)對map reduce有了一個清晰的認識,那么wordcount程序具體是怎么執(zhí)行的呢?

將文件file1.txt,file2.txt 上傳到hdfs中的hdfsinput1文件夾里(上傳的方式可以通過eclipse客戶端,也可以通過Hadoop命令行),然后在eclipse上編寫wordcount.java文件(也即是第一部分分析的源碼)?

由于測試用的文件較小,所以每個文件為一個split,并將文件按行分割形成< key,value>,這一步由MapReduce框架自動完成,其中key值為該行首字母相對于文本文件首地址的偏移量。?

將分割好的< key,value>對交給自己定義的map方法,輸出新的< key,value>對。?

得到map方法輸出的< key,value>對后,進行Combine操作。這里Combine 執(zhí)行的是Reduce的代碼。?

同樣,在Reduce過程中先對輸入的數(shù)據(jù)進行排序,再交由自定義的reduce方法進行處理,得到新的< key,value>對,并作為WordCount的輸出結(jié)果,輸出結(jié)果存放在第一張圖的lxnoutputssss文件夾下的part-r-00000里。?

轉(zhuǎn)載于:https://my.oschina.net/hunglish/blog/782519

總結(jié)

以上是生活随笔為你收集整理的逐行分析Hadoop的HelloWorld的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人字幕| 一区二区三区精彩视频 | 天堂久久爱 | 成人拍拍视频 | 日本视频网站在线观看 | 射影院 | 日韩亚洲欧美在线 | 91在线第一页 | 一级片一级片 | 日本成人免费在线视频 | 91网入口 | 天天射网站| 国产二区在线播放 | 国产黑丝av| 欧美三级免费 | 91精品国产欧美一区二区成人 | 国产精品一区二区在线播放 | 午夜影院福利 | 黄色网页免费 | 国产精品xxxx喷水欧美 | 无码精品一区二区三区在线播放 | 欧美色频 | 亚洲av无码不卡一区二区三区 | 中文字幕首页 | 六月婷婷中文字幕 | 影音先锋亚洲资源 | 成人a级网站 | 在线看三级 | 色图自拍 | 亚洲AV综合色区国产精品天天 | 日日操天天操 | 自拍1页| 国产影视一区二区三区 | 中文字幕日韩一区二区三区不卡 | 久久久久久久久久一级 | 亚洲一区二区激情 | 神马久久精品 | 午夜在线小视频 | 国产午夜三级一区二区三 | 青青草原伊人网 | 欧美成年人 | 亚洲黄色片子 | 四虎av在线播放 | 亚洲综合免费观看高清完整版在线 | 亚洲熟妇毛茸茸 | 一本久道综合色婷婷五月 | 91在线视频观看 | 成人免费网站视频 | 国产精品久久毛片 | 老熟妇仑乱视频一区二区 | 亚洲精选一区二区三区 | 国产一级片麻豆 | 国产草草草 | 影音先锋伦理片 | 在线观看视频99 | 日本福利社 | 超污视频在线观看 | 99国产精品久久久久久久 | 久久女女 | 国产a v一区二区三区 | 好吊妞在线 | 天天干视频在线观看 | 成人免费影院 | 国产乱色精品成人免费视频 | 国产乱淫a∨片免费观看 | 国产在线观看黄色 | 影音先锋美女 | 娇妻高潮浓精白浆xxⅹ | 青青草青青操 | 亚洲欧美日韩一区二区三区四区 | 51ⅴ精品国产91久久久久久 | 美女网站黄频 | 爱情岛论坛成人av | 欧美视频自拍偷拍 | 狠狠干影院 | 日本在线中文 | 小镇姑娘国语版在线观看免费 | 一级性爱视频 | 在线国产一区二区 | 91人妻一区二区三区 | 性欧美熟妇videofreesex | 极品少妇一区二区三区 | 成人三区| 日日夜夜超碰 | 日韩欧美黄色网址 | 51av视频| 国产原创在线播放 | 日本不卡一区视频 | 福利视频第一页 | 国产精品视频在线免费观看 | 日本久久爱 | 国产精品二三区 | 在线视频欧美一区 | 在线观看成人免费视频 | 日本一区二区三区精品 | 亚洲精品视频中文字幕 | 婷婷亚洲综合 | 在线播放91灌醉迷j高跟美女 | 欧美色图一区二区 |