閱讀目錄
本文版權歸mephisto和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作。
文章是哥(mephisto)寫的,SourceLink
序
上一篇,我們的Eclipse外掛搞定,那開始我們的MapReduce之旅。
在這裡,我們先呼叫官方的wordcount例子,然後再手動建立個例子,這樣可以更好的理解Job。
資料準備
一:說明
wordcount這個類是對不同的word進行統計個數,所以這裡我們得準備資料,當然也不需要很大的資料量,畢竟是自己做試驗對吧。
二:造資料
開啟記事本,輸入各種word,有相同的,不同的。然後儲存為words_01.txt。
三:上傳
開啟eclipse,然後在DFS location 中將我們準備的資料來源上傳到tmp/input。
這樣我們的資料就準備好了。
wordcount
一:官網示例
wordcount是hadoop的一個官網試例,打包在hadoop-mapreduce-examples-<ver>.jar。
二:找到示例
我們在結果中看到兩個地方有,那就找個近一點的地方吧。
find / -name *hadoop-mapreduce-examples*
四:進入目錄
我們選擇進入/usr/hdp/下面的這個例子。
cd /usr/hdp/2.3.0.0-2557/hadoop-mapreduce五:執行
我們先使用hadoop jar這個命令執行。
命令說明:hadoop jar 包名稱 方法 輸入檔案/目錄 輸出目錄
#切換使用者 su hsfs #執行 hadoop jar hadoop-mapreduce-examples-2.7.1.2.3.0.0-2557.jar wordcount /tmp/input/words_01.txt /tmp/output/1007_01命令執行結果
外掛結果
job頁面結果
這樣我們的第一個job就這樣順利的執行完成了。
Yarn
一:介紹
Hadoop2.X和Hadoop1.X有兩個最大的變化,也是根本性變化。
其中一個是Namenode的單點問題解決,然後就是Yarn的引入。在這裡我們就不做展開的講了,後面會安排章節進行講述。
二:Yarn命令
如果仔細看的話,我們可以發現在上面hadoop jar這個命令執行後,會有一個警告。
yarn jar hadoop-mapreduce-examples-2.7.1.2.3.0.0-2557.jar wordcount /tmp/input/words_01.txt /tmp/output/1007_02
新建MapReduce
一:通過外掛新建工程
這裡就不詳說了,在上一篇我們通過外掛建立了一個工程,我們直接使用那個工程“com.first”。
二:新建WordCountEx類
這個是我們的自定義的wordcount類,仿照官網例子寫的,做了點DIY,方便大家理解。
完成後
三:新建Mapper
在WordCountEx類中建一個內部類MyMapper。
在這裡我們做了點DIY,排除了字母長度小於5的資料,方便大家對比理解程式。
View Codestatic class MyMapper extends Mapper<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); @Override protected void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException { // 分割字串 StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { // 排除字母少於5個的 String tmp = itr.nextToken(); if (tmp.length() < 5) continue; word.set(tmp); context.write(word, one); } } }四:新建Reduce
同上,我們將map的結果乘以2,然後輸出的內容的key加了個字首。
View Codestatic class MyReduce extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); private Text keyEx = new Text(); @Override protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { // 將map的結果放大,乘以2 sum += val.get() * 2; } result.set(sum); // 自定義輸出key keyEx.set("輸出:" + key.toString()); context.write(keyEx, result); } }五:新建Main
在main方法中我們得定義一個job,配置它。
View Codepublic static void main(String[] args) throws Exception { //配置資訊 Configuration conf = new Configuration(); //job名稱 Job job = Job.getInstance(conf, "mywordcount"); job.setJarByClass(WordCountEx.class); job.setMapperClass(MyMapper.class); // job.setCombinerClass(IntSumReducer.class); job.setReducerClass(MyReduce.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); //輸入、輸出path FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); //結束 System.exit(job.waitForCompletion(true) ? 0 : 1); }六:匯出jar包
匯出我們寫好的jar包。命名為com.first.jar
七:放入Linux
將匯出的jar包放到H31的/var/tmp下
cd /var/tmp
ls八:執行
大家仔細看下命令和結果會發現有什麼不同
yarn jar com.first.jar /tmp/input/words_01.txt /tmp/output/1007_03如果是仔細看了,發現少個wordcount對吧,為什麼列,因為在匯出jar包的時候制定的main函式。
九:匯出不指定main入口的jar包
我們在匯出的時候,不指定main的入口。
十:執行2
我們發現這裡就得多帶一個引數了,就是方法的入口,這裡得全路徑。
yarn jar com.first.jar com.first.WordCountEx /tmp/input/words_01.txt /tmp/output/1007_04十一:結果
我們看下輸出的結果,可以明顯的看到少於5個長度的被排除了,而且結果的count都乘以了2。字首亂碼的不要糾結了,換個編碼方式就好了。
--------------------------------------------------------------------
到此,本章節的內容講述完畢。
示例下載
Github:https://github.com/sinodzh/HadoopExample/tree/master/2015/com.first
系列索引
本文版權歸mephisto和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作。
文章是哥(mephisto)寫的,SourceLink