天天看點

在eclipse和指令行運作第一個WordCount程式實驗心得

建立wordcount程式代碼:

package hdWordCount;
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
   
    {
  
  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
    
      {
  private 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);
  }
}

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, "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); for (int i = 0; i < otherArgs.length - 1; ++i) { FileInputFormat.addInputPath(job, new Path(otherArgs[i])); } FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length - 1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } } 
        
       
      
     
    
   
           

(一)   本組總結實驗結論:

(1)使用eclipse中,執行wordcount的程式比用指令行執行的程式快。

通過查詢資料,發現了如下:Hadoop程式的MR模式可以提供并行化運作環境,而HDFS是并行化的基礎(HDFS畢竟把檔案分割了,而local隻是存在一台機器上),是以,如何在eclipse上跑程式,讓其讀取HDFS上的檔案,是一個關鍵。一般來說,要通過設定configuration來設定目錄是hdfs還是local,如果不設定預設就是local,此時如果把hdfs-site.xml放入eclipse建的工程的話,那麼,跑的程式就會在HDFS上了,因為那個xml配置了程式預設的運作目錄,清楚了如何在HDFS上跑程式,那麼下一步是如何在eclipse調試程式。

eclipse上運作hadoop可以看作有2種模式,第一種就是Local模式,也叫本地模式,第二種就是我們正式的線上叢集模式,當運作本地模式的時候,程式并不會被送出到Hadoop叢集上,而是基于單機的模式跑的,但是單機的模式,運作的結果仍在是存儲在HDFS上的,隻不過沒有利用hadoop叢集的資源,單機的模式不要送出jar包到hadoop叢集上,是以一般我們使用local來測試我們的MR程式是否能夠正常運作,而且對于不複雜的程式運作的速度非常的快,比指令行送出jar的叢集模式快得多,因為少了叢集的job送出環節。

(1)       在搭建的時候遇到了很多問題,經過整理,以下是本組的總結以及解決方法彙總:

1.        在配置hadoop叢集的時候,從一開始搭建的時候,我們在虛拟機安裝就遇到安裝失敗的問題,通過當解除安裝虛拟機的時候沒有解除安裝幹淨。我們試過通過各種删除虛拟機表格的軟體、系統資料庫一一删除,但是也沒有效。而又不想重裝重裝系統,我們選擇重新下載下傳一個别的版本的虛拟機,這是完全不影響的。

2.        在配置hadoop叢集的時候,我們遇到過能ping通8.8.8.8,但是就不能ping域名的時候,找到這是因為DNS伺服器沒有配置好。

3.        在配置hadoop叢集的時候,我們發現,如果選擇克隆虛拟機需要删掉網卡,但是如果想避免解決處理這些麻煩,可以不選擇克隆虛拟機,直接在本地先複制好,再打開虛拟機,再重新生成mac位址,這樣會減少各種問題。

4.        在配置hadoop叢集的時候,在配置免密鑰登陸控制以後,發現還是要輸入密碼,後來發現原因是因為我們沒有切換到waibao的使用者下,或者是用root使用者進行操作,而沒有嚴格按照對應的使用者操作,會遇到很多問題,這是不能粗心。

5.        在使用指令行運作wordcount程式的時候,我們可以通過指令上傳、下載下傳、删除文檔以及檢視文檔,發現了如果在運作程式指令輸入錯誤(如路徑問題等),會出現報錯。而如果是非waibao的使用者下,hadoop fs–指令  的指令是輸入沒效的。

6.        在使用指令行運作wordcount程式的時候,必須要先建立好輸出路徑檔案,輸入路徑檔案等,和eclipse運作是不同的,但是可以代替eclipse運作。

7.   在使用eclipse運作wordcount程式的時候,在使用eclipse中,如果遇到例如上傳本機文檔到text文檔中出現為空的情況時候,通過調式發現是叢集啟動不成功的原因。

(二)本組組員實驗體會:

(一)組員1:

實驗體會:

在一開始的時候我們組在虛拟機互相ping問題上解決我們使用了三天的時間去解決,最後才處理成功,原因是橋接模式和.net模式的原理不清楚,是以遇到很多問題,最後我們通過對這三種模式的上網百度了解,才了解到其中的是怎麼運作,了解到原理後操作的效率大大提高。

在配置hadoop的時候出現免密鑰發送不成功、hadoop啟動叢集失敗的問題我們使用了幾近一個星期的時間去解決,總結到的原因是因為沒有仔細看清楚配置文檔的要求,如在什麼使用者下操作,導緻配置失敗,這個是粗心的原因。

在使用指令行運作hadoop程式的時候,我們遇到了上傳文檔失敗的問題,原因是指令行不清楚意思以及怎麼使用,通過我們詳細了解了指令的意思以後,以及怎麼編寫規範,才成功地運作。

最後,這次實驗,我收獲了很多,靠着我們組員之間互相搜尋各種網上資料,以及互相分享學習資源以及交流自己學習到的、搜尋網上到實驗心得,互相學習,一起通過自己解決了各種問題,以及了解到各種問題的解決方法記錄好,深刻地了解到必須先了解原理,後才會提高效率,通過自己去學習,學習到了比課堂上學習的更多。

(二)   組員2:

實驗體會:

在一開始實驗的時候,我們遇到了很多問題,而最後通過我們總結,都是因為不夠細心,不夠認真,同時,如果一開始沒搞清楚原理就去操作,會大大地拖慢我們的效率。在别的組都在做下一個實驗的時候,我們還停留在配置橋接模式、.net模式、配置hadoop的步驟中,而我們後來重新回顧了這幾種模式以後,清楚了這幾種模式的差別,如在宿舍也如何使用.net模式以及橋接模式等。

另外,遇到了這些問題我們反反複複地配置,但是不清楚原理,時間花費很長,後來弄懂了原理以後,我們能對指令、步驟更加深了熟悉。

(三)   組員3:

       實驗體會:

通過實驗,我懂得了如何解決打不開虛拟機,怎麼進行linux環境配置,怎麼進行Hadoop的配置部署,還有ping不同等等各種問題。也了解了怎麼樣在虛拟機上直接建立text檔案,上傳,并檢視日志檔案和運作結果,怎麼用指令來建立檔案、上傳檔案、送出作業、檢視運作結果。

搜尋能力是最重要的,要懂得如何搜尋找到自己想要的東西很重要,最大的感觸是,通過自己搜尋網上的各種資料去解決問題,雖然時間花費比較長時間,但是我們能大緻清楚其中的原理,以及運作是怎麼操作,雖然遇到了很多問題,我們需要不急不躁去解決這些問題,這次實驗收獲很多。