摘要:運行程序運行你的根目錄運行這條命令后,會啟動一個來運行程序,而且會在集群上創建一個文件夾,將結果存在其中。
在安裝并配置好Hadoop環境之后,需要運行一個實例來驗證配置是否正確,Hadoop就提供了一個簡單的wordcount程序,其實就是統計單詞個數的程序,這個程序可以算是Hadoop中的“Hello World”了。
MapReduce 原理MapReduce其實就是采用分而治之的思想,將大規模的數據分成各個節點共同完成,然后再整合各個節點的結果,得到最終的結果。這些分節點處理數據都可以做到并行處理,大大縮減了工作的復雜度。
過程MapReduce可以分成兩個階段,其實就是單詞拆成map和reduce,這其實是兩個函數。map函數會產生一個中間輸出,然后reduce函數接受多個map函數產生的一系列中間輸出然后再產生一個最終輸出。
WordCount展示 前期工作 啟動hadoopcd /usr/hadoop/hadoop-2.6.2/ sbin/start-dfs.sh sbin/start-yarn.sh創建本地數據文件
cd ~/ mkdir ~/file cd file echo "Hello World" > test1.txt echo "Hello Hadoop" > test2.txt
這樣就創建了兩個txt文件,里面分別有一個字符串:Hello World,Hello Hadoop。我們通過wordcount想要得到的結果是這樣的:Hello 2,World 1,Hadoop 1。
在HDFS上創建輸入文件夾hadoop fs -mkdir /input
創建好我們可以通過
hadoop fs -ls /
來查看結果:
將數據文件傳到input目錄下hadoop fs -put ~/file/test*.txt /input
同樣,我們可以通過
hadoop fs -ls /input
來查看是否上傳成功:
如果看不到任何結果,說明在hadoop的配置中存在問題,或者是防火墻沒有關閉,導致節點連接不通。
運行程序 運行wordcounthadoop jar /你的hadoop根目錄/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.2.jar wordcount /input /output
運行這條命令后,Hadoop會啟動一個JVM來運行MapReduce程序,而且會在集群上創建一個output文件夾,將結果存在其中。
我們來看看結果:
注意點:
這個目錄一定要填對,要不然會報jar不存在。
輸出文件夾一定要是空文件夾。
查看結果output文件夾中現在有兩個文件,我們需要的結果在part-r-00000這個文件夾中。
hadoop fs -cat /output/part-r-00000
我們就可以看到最終的wordcount結果了:
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中數據都是通過
System.out.println("key= "+key.toString());//查看key值 System.out.println("value= "+value.toString());//查看value值
運行程序后控制臺輸出如下:
我們可以看出,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的輸入參數是Text key和Iterable
然后我們只要遍歷values并且求和,就可以得到各單詞的總次數了。
執行MapReduce我們已經寫好了map函數和reduce函數,現在就是要執行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*()方法是為對任務的參數進行相關的設置,然后調用job.waitForCompletion()方法執行任務。
原文鏈接:http://axuebin.com/blog/2016/02/14/hadoop-wordcount/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64802.html
摘要:引語這幾周事情比較多,兩周沒寫博客了,這周總算把的實例給運行起來,然后跑了一下官方的例子用于統計文件中單詞出現的次數。接下來是我成功運行實例的記錄。 引語: 這幾周事情比較多,兩周沒寫博客了,這周總算把hadoop的實例給運行起來,然后跑了一下官方的wordcount例子(用于統計文件中單詞出現的次數)。接下來是我成功運行實例的記錄。運行的前提是安裝配置好hadoop(可以參考我上一篇...
閱讀 3494·2019-08-30 15:53
閱讀 3409·2019-08-29 16:54
閱讀 2197·2019-08-29 16:41
閱讀 2404·2019-08-23 16:10
閱讀 3382·2019-08-23 15:04
閱讀 1351·2019-08-23 13:58
閱讀 351·2019-08-23 11:40
閱讀 2457·2019-08-23 10:26