摘要:運(yùn)行程序運(yùn)行你的根目錄運(yùn)行這條命令后,會啟動一個來運(yùn)行程序,而且會在集群上創(chuàng)建一個文件夾,將結(jié)果存在其中。
在安裝并配置好Hadoop環(huán)境之后,需要運(yùn)行一個實(shí)例來驗(yàn)證配置是否正確,Hadoop就提供了一個簡單的wordcount程序,其實(shí)就是統(tǒng)計單詞個數(shù)的程序,這個程序可以算是Hadoop中的“Hello World”了。
MapReduce 原理MapReduce其實(shí)就是采用分而治之的思想,將大規(guī)模的數(shù)據(jù)分成各個節(jié)點(diǎn)共同完成,然后再整合各個節(jié)點(diǎn)的結(jié)果,得到最終的結(jié)果。這些分節(jié)點(diǎn)處理數(shù)據(jù)都可以做到并行處理,大大縮減了工作的復(fù)雜度。
過程MapReduce可以分成兩個階段,其實(shí)就是單詞拆成map和reduce,這其實(shí)是兩個函數(shù)。map函數(shù)會產(chǎn)生一個中間輸出,然后reduce函數(shù)接受多個map函數(shù)產(chǎn)生的一系列中間輸出然后再產(chǎn)生一個最終輸出。
WordCount展示 前期工作 啟動hadoopcd /usr/hadoop/hadoop-2.6.2/ sbin/start-dfs.sh sbin/start-yarn.sh創(chuàng)建本地數(shù)據(jù)文件
cd ~/ mkdir ~/file cd file echo "Hello World" > test1.txt echo "Hello Hadoop" > test2.txt
這樣就創(chuàng)建了兩個txt文件,里面分別有一個字符串:Hello World,Hello Hadoop。我們通過wordcount想要得到的結(jié)果是這樣的:Hello 2,World 1,Hadoop 1。
在HDFS上創(chuàng)建輸入文件夾hadoop fs -mkdir /input
創(chuàng)建好我們可以通過
hadoop fs -ls /
來查看結(jié)果:
將數(shù)據(jù)文件傳到input目錄下hadoop fs -put ~/file/test*.txt /input
同樣,我們可以通過
hadoop fs -ls /input
來查看是否上傳成功:
如果看不到任何結(jié)果,說明在hadoop的配置中存在問題,或者是防火墻沒有關(guān)閉,導(dǎo)致節(jié)點(diǎn)連接不通。
運(yùn)行程序 運(yùn)行wordcounthadoop jar /你的hadoop根目錄/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.2.jar wordcount /input /output
運(yùn)行這條命令后,Hadoop會啟動一個JVM來運(yùn)行MapReduce程序,而且會在集群上創(chuàng)建一個output文件夾,將結(jié)果存在其中。
我們來看看結(jié)果:
注意點(diǎn):
這個目錄一定要填對,要不然會報jar不存在。
輸出文件夾一定要是空文件夾。
查看結(jié)果output文件夾中現(xiàn)在有兩個文件,我們需要的結(jié)果在part-r-00000這個文件夾中。
hadoop fs -cat /output/part-r-00000
我們就可以看到最終的wordcount結(jié)果了:
WordCount源碼分析 Map過程源碼:
import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; public class TokenizerMapper extends Mapper
繼承Mapper類,重寫map方法。
我們了解到mapreduce中數(shù)據(jù)都是通過
System.out.println("key= "+key.toString());//查看key值 System.out.println("value= "+value.toString());//查看value值
運(yùn)行程序后控制臺輸出如下:
我們可以看出,map方法中的value值存儲的是文本文件中的一行,而key值為該行的首字符相對于文本文件的首地址的偏移量。
程序中的StringTokenizer這個類的功能是將每一行拆分成一個一個的單詞,并將
源碼:
import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class IntSumReducer extends Reducer{ IntWritable result = new IntWritable(); public void reduce(Text key, Iterable values, Context context) throws IOException,InterruptedException { int sum = 0; for(IntWritable val:values) { sum += val.get(); } result.set(sum); context.write(key,result); } }
同樣,Reduce過程也需要繼承一個Reducer類,并重寫reduce方法。
我們可以看到reduce的輸入?yún)?shù)是Text key和Iterable
然后我們只要遍歷values并且求和,就可以得到各單詞的總次數(shù)了。
執(zhí)行MapReduce我們已經(jīng)寫好了map函數(shù)和reduce函數(shù),現(xiàn)在就是要執(zhí)行mapreduce了。
源碼:
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.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser; public class WordCount { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); if(otherArgs.length != 2) { System.err.println("Usage: wordcount"); System.exit(2); } Job job = new Job(conf, "wordcount"); 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); } }
代碼中的job.set*()方法是為對任務(wù)的參數(shù)進(jìn)行相關(guān)的設(shè)置,然后調(diào)用job.waitForCompletion()方法執(zhí)行任務(wù)。
原文鏈接:http://axuebin.com/blog/2016/02/14/hadoop-wordcount/
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64802.html
摘要:引語這幾周事情比較多,兩周沒寫博客了,這周總算把的實(shí)例給運(yùn)行起來,然后跑了一下官方的例子用于統(tǒng)計文件中單詞出現(xiàn)的次數(shù)。接下來是我成功運(yùn)行實(shí)例的記錄。 引語: 這幾周事情比較多,兩周沒寫博客了,這周總算把hadoop的實(shí)例給運(yùn)行起來,然后跑了一下官方的wordcount例子(用于統(tǒng)計文件中單詞出現(xiàn)的次數(shù))。接下來是我成功運(yùn)行實(shí)例的記錄。運(yùn)行的前提是安裝配置好hadoop(可以參考我上一篇...
閱讀 3521·2019-08-30 15:53
閱讀 3435·2019-08-29 16:54
閱讀 2220·2019-08-29 16:41
閱讀 2448·2019-08-23 16:10
閱讀 3403·2019-08-23 15:04
閱讀 1377·2019-08-23 13:58
閱讀 377·2019-08-23 11:40
閱讀 2481·2019-08-23 10:26