精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Hadoop集群系列7:WordCount運行詳解

開發 開發工具 大數據 Hadoop
本文為Hadoop集群系列第七篇,單詞計數是最簡單也是最能體現MapReduce思想的程序之一,可以稱為MapReduce版"Hello World"。

1、MapReduce理論簡介

1.1 MapReduce編程模型

  MapReduce采用"分而治之"的思想,把對大規模數據集的操作,分發給一個主節點管理下的各個分節點共同完成,然后通過整合各個節點的中間結果,得到最終結果。簡單地說,MapReduce就是"任務的分解與結果的匯總"。

  在Hadoop中,用于執行MapReduce任務的機器角色有兩個:一個是JobTracker;另一個是TaskTracker,JobTracker是用于調度工作的,TaskTracker是用于執行工作的。一個Hadoop集群中只有一臺JobTracker。

  在分布式計算中,MapReduce框架負責處理了并行編程中分布式存儲、工作調度、負載均衡、容錯均衡、容錯處理以及網絡通信等復雜問題,把處理過程高度抽象為兩個函數:map和reduce,map負責把任務分解成多個任務,reduce負責把分解后多任務處理的結果匯總起來。

  需要注意的是,用MapReduce來處理的數據集(或任務)必須具備這樣的特點:待處理的數據集可以分解成許多小的數據集,而且每一個小數據集都可以完全并行地進行處理。

1.2 MapReduce處理過程

  在Hadoop中,每個MapReduce任務都被初始化為一個Job,每個Job又可以分為兩種階段:map階段和reduce階段。這兩個階段分別用兩個函數表示,即map函數和reduce函數。map函數接收一個<key,value>形式的輸入,然后同樣產生一個<key,value>形式的中間輸出,Hadoop函數接收一個如<key,(list of values)>形式的輸入,然后對這個value集合進行處理,每個reduce產生0或1個輸出,reduce的輸出也是<key,value>形式的。

 image

MapReduce處理大數據集的過程

2、運行WordCount程序

  單詞計數是最簡單也是最能體現MapReduce思想的程序之一,可以稱為MapReduce版"Hello World",該程序的完整代碼可以在Hadoop安裝包的"src/examples"目錄下找到。單詞計數主要完成功能是:統計一系列文本文件中每個單詞出現的次數,如下圖所示。

 image

2.1 準備工作

  現在以"hadoop"普通用戶登錄"Master.Hadoop"服務器。

  1)創建本地示例文件

  首先在"/home/hadoop"目錄下創建文件夾"file"。

 image

  接著創建兩個文本文件file1.txt和file2.txt,使file1.txt內容為"Hello World",而file2.txt的內容為"Hello Hadoop"。

image

  2)在HDFS上創建輸入文件夾

image

  3)上傳本地file中文件到集群的input目錄下

image

2.2 運行例子

  1)在集群上運行WordCount程序

  備注:以input作為輸入目錄,output目錄作為輸出目錄。

  已經編譯好的WordCount的Jar在"/usr/hadoop"下面,就是"hadoop-examples-1.0.0.jar",所以在下面執行命令時記得把路徑寫全了,不然會提示找不到該Jar包。

 image

  2)MapReduce執行過程顯示信息

image

  Hadoop命令會啟動一個JVM來運行這個MapReduce程序,并自動獲得Hadoop的配置,同時把類的路徑(及其依賴關系)加入到Hadoop的庫中。以上就是Hadoop Job的運行記錄,從這里可以看到,這個Job被賦予了一個ID號:job_201202292213_0002,而且得知輸入文件有兩個(Total input paths to process : 2),同時還可以了解map的輸入輸出記錄(record數及字節數),以及reduce輸入輸出記錄。比如說,在本例中,map的task數量是2個,reduce的task數量是一個。map的輸入record數是2個,輸出record數是4個等信息。

2.3 查看結果

  1)查看HDFS上output目錄內容

image

  從上圖中知道生成了三個文件,我們的結果在"part-r-00000"中。

  2)查看結果輸出文件內容

image

#p#

3、WordCount源碼分析

3.1 特別數據類型介紹

  Hadoop提供了如下內容的數據類型,這些數據類型都實現了WritableComparable接口,以便用這些類型定義的數據可以被序列化進行網絡傳輸和文件存儲,以及進行大小比較。

    BooleanWritable:標準布爾型數值

    ByteWritable:單字節數值

    DoubleWritable:雙字節數

    FloatWritable:浮點數

    IntWritable:整型數

    LongWritable:長整型數

    Text:使用UTF8格式存儲的文本

    NullWritable:當<key,value>中的key或value為空時使用

3.2 舊的WordCount分析

  1)源代碼程序

  1. package org.apache.hadoop.examples; 
  2.  
  3. import java.io.IOException; 
  4. import java.util.Iterator; 
  5. import java.util.StringTokenizer; 
  6.  
  7. import org.apache.hadoop.fs.Path; 
  8. import org.apache.hadoop.io.IntWritable; 
  9. import org.apache.hadoop.io.LongWritable; 
  10. import org.apache.hadoop.io.Text; 
  11. import org.apache.hadoop.mapred.FileInputFormat; 
  12. import org.apache.hadoop.mapred.FileOutputFormat; 
  13. import org.apache.hadoop.mapred.JobClient; 
  14. import org.apache.hadoop.mapred.JobConf; 
  15. import org.apache.hadoop.mapred.MapReduceBase; 
  16. import org.apache.hadoop.mapred.Mapper; 
  17. import org.apache.hadoop.mapred.OutputCollector; 
  18. import org.apache.hadoop.mapred.Reducer; 
  19. import org.apache.hadoop.mapred.Reporter; 
  20. import org.apache.hadoop.mapred.TextInputFormat; 
  21. import org.apache.hadoop.mapred.TextOutputFormat; 
  22.  
  23. public class WordCount { 
  24.  
  25.     public static class Map extends MapReduceBase implements 
  26.             Mapper<LongWritable, Text, Text, IntWritable> { 
  27.         private final static IntWritable one = new IntWritable(1); 
  28.         private Text word = new Text(); 
  29.  
  30.         public void map(LongWritable key, Text value, 
  31.                 OutputCollector<Text, IntWritable> output, Reporter reporter) 
  32.                 throws IOException { 
  33.             String line = value.toString(); 
  34.             StringTokenizer tokenizer = new StringTokenizer(line); 
  35.             while (tokenizer.hasMoreTokens()) { 
  36.                 word.set(tokenizer.nextToken()); 
  37.                 output.collect(word, one); 
  38.             } 
  39.         } 
  40.     } 
  41.  
  42.     public static class Reduce extends MapReduceBase implements 
  43.             Reducer<Text, IntWritable, Text, IntWritable> { 
  44.         public void reduce(Text key, Iterator<IntWritable> values, 
  45.                 OutputCollector<Text, IntWritable> output, Reporter reporter) 
  46.                 throws IOException { 
  47.             int sum = 0
  48.             while (values.hasNext()) { 
  49.                 sum += values.next().get(); 
  50.             } 
  51.             output.collect(key, new IntWritable(sum)); 
  52.         } 
  53.     } 
  54.  
  55.     public static void main(String[] args) throws Exception { 
  56.         JobConf conf = new JobConf(WordCount.class); 
  57.         conf.setJobName("wordcount"); 
  58.  
  59.         conf.setOutputKeyClass(Text.class); 
  60.         conf.setOutputValueClass(IntWritable.class); 
  61.  
  62.         conf.setMapperClass(Map.class); 
  63.         conf.setCombinerClass(Reduce.class); 
  64.         conf.setReducerClass(Reduce.class); 
  65.  
  66.         conf.setInputFormat(TextInputFormat.class); 
  67.         conf.setOutputFormat(TextOutputFormat.class); 
  68.  
  69.         FileInputFormat.setInputPaths(conf, new Path(args[0])); 
  70.         FileOutputFormat.setOutputPath(conf, new Path(args[1])); 
  71.  
  72.         JobClient.runJob(conf); 
  73.     } 

  3)主方法Main分析

  1. public static void main(String[] args) throws Exception { 
  2.     JobConf conf = new JobConf(WordCount.class); 
  3.     conf.setJobName("wordcount"); 
  4.  
  5.     conf.setOutputKeyClass(Text.class); 
  6.     conf.setOutputValueClass(IntWritable.class); 
  7.  
  8.     conf.setMapperClass(Map.class); 
  9.     conf.setCombinerClass(Reduce.class); 
  10.     conf.setReducerClass(Reduce.class); 
  11.  
  12.     conf.setInputFormat(TextInputFormat.class); 
  13.     conf.setOutputFormat(TextOutputFormat.class); 
  14.  
  15.     FileInputFormat.setInputPaths(conf, new Path(args[0])); 
  16.     FileOutputFormat.setOutputPath(conf, new Path(args[1])); 
  17.  
  18.     JobClient.runJob(conf); 

  首先講解一下Job的初始化過程。main函數調用Jobconf類來對MapReduce Job進行初始化,然后調用setJobName()方法命名這個Job。對Job進行合理的命名有助于更快地找到Job,以便在JobTracker和Tasktracker的頁面中對其進行監視。

JobConf conf = new JobConf(WordCount. class ); conf.setJobName("wordcount" );

  接著設置Job輸出結果<key,value>的中key和value數據類型,因為結果是<單詞,個數>,所以key設置為"Text"類型,相當于Java中String類型。Value設置為"IntWritable",相當于Java中的int類型。

conf.setOutputKeyClass(Text.class );

conf.setOutputValueClass(IntWritable.class );

  然后設置Job處理的Map(拆分)、Combiner(中間結果合并)以及Reduce(合并)的相關處理類。這里用Reduce類來進行Map產生的中間結果合并,避免給網絡數據傳輸產生壓力。

conf.setMapperClass(Map.class );

conf.setCombinerClass(Reduce.class );

conf.setReducerClass(Reduce.class );

  接著就是調用setInputPath()和setOutputPath()設置輸入輸出路徑。

conf.setInputFormat(TextInputFormat.class );

conf.setOutputFormat(TextOutputFormat.class );

 ?。?)InputFormat和InputSplit

  InputSplit是Hadoop定義的用來傳送給每個單獨的map的數據,InputSplit存儲的并非數據本身,而是一個分片長度和一個記錄數據位置的數組。生成InputSplit的方法可以通過InputFormat()來設置。

  當數據傳送給map時,map會將輸入分片傳送到InputFormat,InputFormat則調用方法getRecordReader()生成RecordReader,RecordReader再通過creatKey()、creatValue()方法創建可供map處理的<key,value>對。簡而言之,InputFormat()方法是用來生成可供map處理的<key,value>對的。

  Hadoop預定義了多種方法將不同類型的輸入數據轉化為map能夠處理的<key,value>對,它們都繼承自InputFormat,分別是:

 

  1. InputFormat 
  2.  
  3.     | 
  4.  
  5.     |---BaileyBorweinPlouffe.BbpInputFormat 
  6.  
  7.     |---ComposableInputFormat 
  8.  
  9.     |---CompositeInputFormat 
  10.  
  11.     |---DBInputFormat 
  12.  
  13.     |---DistSum.Machine.AbstractInputFormat 
  14.  
  15.     |---FileInputFormat 
  16.  
  17.         |---CombineFileInputFormat 
  18.  
  19.         |---KeyValueTextInputFormat 
  20.  
  21.         |---NLineInputFormat 
  22.  
  23.         |---SequenceFileInputFormat 
  24.  
  25.         |---TeraInputFormat 
  26.  
  27.         |---TextInputFormat 

  其中TextInputFormat是Hadoop默認的輸入方法,在TextInputFormat中,每個文件(或其一部分)都會單獨地作為map的輸入,而這個是繼承自FileInputFormat的。之后,每行數據都會生成一條記錄,每條記錄則表示成<key,value>形式:

  • key值是每個數據的記錄在數據分片中字節偏移量,數據類型是LongWritable;  

value值是每行的內容,數據類型是Text。

 ?。?)OutputFormat

  每一種輸入格式都有一種輸出格式與其對應。默認的輸出格式是TextOutputFormat,這種輸出方式與輸入類似,會將每條記錄以一行的形式存入文本文件。不過,它的鍵和值可以是任意形式的,因為程序內容會調用toString()方法將鍵和值轉換為String類型再輸出。

  3)Map類中map方法分析

  1. public static class Map extends MapReduceBase implements 
  2.         Mapper<LongWritable, Text, Text, IntWritable> { 
  3.     private final static IntWritable one = new IntWritable(1); 
  4.     private Text word = new Text(); 
  5.  
  6.     public void map(LongWritable key, Text value, 
  7.             OutputCollector<Text, IntWritable> output, Reporter reporter) 
  8.             throws IOException { 
  9.         String line = value.toString(); 
  10.         StringTokenizer tokenizer = new StringTokenizer(line); 
  11.         while (tokenizer.hasMoreTokens()) { 
  12.             word.set(tokenizer.nextToken()); 
  13.             output.collect(word, one); 
  14.         } 
  15.     } 

  Map類繼承自MapReduceBase,并且它實現了Mapper接口,此接口是一個規范類型,它有4種形式的參數,分別用來指定map的輸入key值類型、輸入value值類型、輸出key值類型和輸出value值類型。在本例中,因為使用的是TextInputFormat,它的輸出key值是LongWritable類型,輸出value值是Text類型,所以map的輸入類型為<LongWritable,Text>。在本例中需要輸出<word,1>這樣的形式,因此輸出的key值類型是Text,輸出的value值類型是IntWritable。

  實現此接口類還需要實現map方法,map方法會具體負責對輸入進行操作,在本例中,map方法對輸入的行以空格為單位進行切分,然后使用OutputCollect收集輸出的<word,1>。

  4)Reduce類中reduce方法分析

  1. public static class Reduce extends MapReduceBase implements 
  2.         Reducer<Text, IntWritable, Text, IntWritable> { 
  3.     public void reduce(Text key, Iterator<IntWritable> values, 
  4.             OutputCollector<Text, IntWritable> output, Reporter reporter) 
  5.             throws IOException { 
  6.         int sum = 0
  7.         while (values.hasNext()) { 
  8.             sum += values.next().get(); 
  9.         } 
  10.         output.collect(key, new IntWritable(sum)); 
  11.     } 

  Reduce類也是繼承自MapReduceBase的,需要實現Reducer接口。Reduce類以map的輸出作為輸入,因此Reduce的輸入類型是<Text,Intwritable>。而Reduce的輸出是單詞和它的數目,因此,它的輸出類型是<Text,IntWritable>。Reduce類也要實現reduce方法,在此方法中,reduce函數將輸入的key值作為輸出的key值,然后將獲得多個value值加起來,作為輸出的值。

3.3 新的WordCount分析

  1)源代碼程序

 

  1. package org.apache.hadoop.examples; 
  2. import java.io.IOException; 
  3. import java.util.StringTokenizer; 
  4. import org.apache.hadoop.conf.Configuration; 
  5. import org.apache.hadoop.fs.Path; 
  6. import org.apache.hadoop.io.IntWritable; 
  7. import org.apache.hadoop.io.Text; 
  8. import org.apache.hadoop.mapreduce.Job; 
  9. import org.apache.hadoop.mapreduce.Mapper; 
  10. import org.apache.hadoop.mapreduce.Reducer; 
  11. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
  12. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
  13. import org.apache.hadoop.util.GenericOptionsParser; 
  14. public class WordCount { 
  15.   public static class TokenizerMapper 
  16.       extends Mapper<Object, Text, Text, IntWritable>{ 
  17.       private final static IntWritable one = new IntWritable(1); 
  18.       private Text word = new Text(); 
  19.       public void map(Object key, Text value, Context context) 
  20.         throws IOException, InterruptedException { 
  21.         StringTokenizer itr = new StringTokenizer(value.toString()); 
  22.         while (itr.hasMoreTokens()) { 
  23.         word.set(itr.nextToken()); 
  24.         context.write(word, one); 
  25.       } 
  26.     } 
  27.   } 
  28.   public static class IntSumReducer 
  29.       extends Reducer<Text,IntWritable,Text,IntWritable> { 
  30.       private IntWritable result = new IntWritable(); 
  31.       public void reduce(Text key, Iterable<IntWritable> values,Context context) 
  32.            throws IOException, InterruptedException { 
  33.         int sum = 0
  34.         for (IntWritable val : values) { 
  35.            sum += val.get(); 
  36.         } 
  37.       result.set(sum); 
  38.       context.write(key, result); 
  39.     } 
  40.   } 
  41.   public static void main(String[] args) throws Exception { 
  42.     Configuration conf = new Configuration(); 
  43.     String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); 
  44.     if (otherArgs.length != 2) { 
  45.       System.err.println("Usage: wordcount <in> <out>"); 
  46.       System.exit(2); 
  47.     } 
  48.     Job job = new Job(conf, "word count"); 
  49.     job.setJarByClass(WordCount.class); 
  50.     job.setMapperClass(TokenizerMapper.class); 
  51.     job.setCombinerClass(IntSumReducer.class); 
  52.     job.setReducerClass(IntSumReducer.class); 
  53.     job.setOutputKeyClass(Text.class); 
  54.     job.setOutputValueClass(IntWritable.class); 
  55.     FileInputFormat.addInputPath(job, new Path(otherArgs[0])); 
  56.     FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); 
  57.     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);

  }

}

  Map過程需要繼承org.apache.hadoop.mapreduce包中Mapper類,并重寫其map方法。通過在map方法中添加兩句把key值和value值輸出到控制臺的代碼,可以發現map方法中value值存儲的是文本文件中的一行(以回車符為行結束標記),而key值為該行的首字母相對于文本文件的首地址的偏移量。然后StringTokenizer類將每一行拆分成為一個個的單詞,并將<word,1>作為map方法的結果輸出,其余的工作都交有MapReduce框架處理。

  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);

  }

}

  Reduce過程需要繼承org.apache.hadoop.mapreduce包中Reducer類,并重寫其reduce方法。Map過程輸出<key,values>中key為單個單詞,而values是對應單詞的計數值所組成的列表,Map的輸出就是Reduce的輸入,所以reduce方法只要遍歷values并求和,即可得到某個單詞的總次數。

    3)執行MapReduce任務

 

  1. public static void main(String[] args) throws Exception { 
  2.   Configuration conf = new Configuration(); 
  3.   String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); 
  4.   if (otherArgs.length != 2) { 
  5.     System.err.println("Usage: wordcount <in> <out>"); 
  6.     System.exit(2); 
  7.   } 
  8.   Job job = new Job(conf, "word count"); 
  9.   job.setJarByClass(WordCount.class); 
  10.   job.setMapperClass(TokenizerMapper.class); 
  11.   job.setCombinerClass(IntSumReducer.class); 
  12.   job.setReducerClass(IntSumReducer.class); 
  13.   job.setOutputKeyClass(Text.class); 
  14.   job.setOutputValueClass(IntWritable.class); 
  15.   FileInputFormat.addInputPath(job, new Path(otherArgs[0])); 
  16.   FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); 
  17.   System.exit(job.waitForCompletion(true) ? 0 : 1); 

  在MapReduce中,由Job對象負責管理和運行一個計算任務,并通過Job的一些方法對任務的參數進行相關的設置。此處設置了使用TokenizerMapper完成Map過程中的處理和使用IntSumReducer完成Combine和Reduce過程中的處理。還設置了Map過程和Reduce過程的輸出類型:key的類型為Text,value的類型為IntWritable。任務的輸出和輸入路徑則由命令行參數指定,并由FileInputFormat和FileOutputFormat分別設定。完成相應任務的參數設定后,即可調用job.waitForCompletion()方法執行任務。

4、WordCount處理過程

  本節將對WordCount進行更詳細的講解。詳細執行步驟如下:

  1)將文件拆分成splits,由于測試用的文件較小,所以每個文件為一個split,并將文件按行分割形成<key,value>對,如圖4-1所示。這一步由MapReduce框架自動完成,其中偏移量(即key值)包括了回車所占的字符數(Windows和Linux環境會不同)。

 image

圖4-1 分割過程

  2)將分割好的<key,value>對交給用戶定義的map方法進行處理,生成新的<key,value>對,如圖4-2所示。

 image

圖4-2 執行map方法

  3)得到map方法輸出的<key,value>對后,Mapper會將它們按照key值進行排序,并執行Combine過程,將key至相同value值累加,得到Mapper的最終輸出結果。如圖4-3所示。

 image

圖4-3 Map端排序及Combine過程

  4)Reducer先對從Mapper接收的數據進行排序,再交由用戶自定義的reduce方法進行處理,得到新的<key,value>對,并作為WordCount的輸出結果,如圖4-4所示。

 image

圖4-4 Reduce端排序及輸出結果

5、MapReduce新舊改變

  Hadoop最新版本的MapReduce Release 0.20.0的API包括了一個全新的Mapreduce JAVA API,有時候也稱為上下文對象。

  新的API類型上不兼容以前的API,所以,以前的應用程序需要重寫才能使新的API發揮其作用 。

  新的API和舊的API之間有下面幾個明顯的區別。

新的API傾向于使用抽象類,而不是接口,因為這更容易擴展。例如,你可以添加一個方法(用默認的實現)到一個抽象類而不需修改類之前的實現方法。在新的API中,Mapper和Reducer是抽象類。

新的API是在org.apache.hadoop.mapreduce包(和子包)中的。之前版本的API則是放在org.apache.hadoop.mapred中的。

新的API廣泛使用context object(上下文對象),并允許用戶代碼與MapReduce系統進行通信。例如,MapContext基本上充當著JobConf的OutputCollector和Reporter的角色。

新的API同時支持"推"和"拉"式的迭代。在這兩個新老API中,鍵/值記錄對被推mapper中,但除此之外,新的API允許把記錄從map()方法中拉出,這也適用于reducer。"拉"式的一個有用的例子是分批處理記錄,而不是一個接一個。

新的API統一了配置。舊的API有一個特殊的JobConf對象用于作業配置,這是一個對于Hadoop通常的Configuration對象的擴展。在新的API中,這種區別沒有了,所以作業配置通過Configuration來完成。作業控制的執行由Job類來負責,而不是JobClient,它在新的API中已經蕩然無存。

原文鏈接:http://www.cnblogs.com/xia520pi/archive/2012/05/16/2504205.html

【編輯推薦】

  1. Hadoop集群系列1:CentOS安裝配置
  2. Hadoop集群系列2:機器信息分布表
  3. Hadoop集群系列3:VSFTP安裝配置
  4. Hadoop集群系列4:SecureCRT使用
  5. Hadoop集群搭建過程中相關環境配置詳解
  6. Hadoop完全分布模式安裝實現詳解

 

責任編輯:彭凡 來源: 博客園
相關推薦

2012-06-20 09:19:19

Hadoop集群

2012-06-25 10:30:06

Hadoop集群

2012-07-05 10:51:57

Hadoop集群

2012-07-03 08:37:24

Hadoop集群

2012-06-13 09:56:53

2012-06-19 09:28:33

Hadoop集群

2012-06-19 15:51:22

集群系列2

2016-09-19 15:14:41

Hadoop Hadoop MapRWordCount

2012-08-22 15:25:43

Linux集群

2024-12-06 10:51:10

Hadoop大數據框架

2010-04-22 14:19:21

LVS負載均衡集群

2012-09-06 14:54:58

Linux集群

2010-09-29 10:16:02

Linux集群虛擬化

2009-06-29 12:37:21

linux

2011-01-14 15:32:17

2009-05-05 13:56:59

五舟intel四核

2010-05-07 14:15:06

集群系統負載均衡

2011-01-14 15:37:39

Linux集群系統

2010-06-04 17:43:12

Hadoop集群搭建

2011-12-07 16:11:50

Hadoop集群搭建
點贊
收藏

51CTO技術棧公眾號

欧美精品一区二区三区久久| 欧美床上激情在线观看| 男女视频一区二区三区| 福利小视频在线观看| 精久久久久久久久久久| 欧美区在线播放| av在线网站观看| 日韩成人动漫| 一区二区三区四区激情| 免费日韩av电影| 99热这里只有精品9| 国产情侣一区| 久久夜色精品亚洲噜噜国产mv| 黄色性视频网站| 欧美性生活一级| 狠狠久久五月精品中文字幕| 黄瓜视频免费观看在线观看www| 国精产品乱码一区一区三区四区| 日本不卡视频在线观看| 欧美精品videosex极品1| mm131丰满少妇人体欣赏图| 久久久久久久久成人| 在线观看日韩一区| 国产av人人夜夜澡人人爽麻豆| 欧美96在线| 国产女同互慰高潮91漫画| 国产一级特黄a大片99| 97人妻人人澡人人爽人人精品| 欧美中文字幕| 97精品欧美一区二区三区| 国产一区第一页| 国产精品亚洲人成在99www| 精品国产乱码久久久久久1区2区 | 91在线看www| 69国产精品视频免费观看| 欧美天天视频| 久久艹在线视频| 五月天婷婷丁香网| 精品日韩毛片| 亚洲天堂第一页| 欧美高清性xxxx| 青青草久久爱| 亚洲精品www久久久| 亚洲精品乱码久久久久久蜜桃欧美| 日韩有码欧美| 欧美日韩高清影院| 日日躁夜夜躁aaaabbbb| 91看片一区| 色八戒一区二区三区| 国产日产欧美视频| 麻豆蜜桃在线观看| 大伊人狠狠躁夜夜躁av一区| 国产一级爱c视频| 成年网站在线视频网站| 亚洲一区二区三区在线播放| 日韩中文在线字幕| 欧美bbbxxxxx| 亚洲成人动漫精品| 国产二级片在线观看| 成年男女免费视频网站不卡| 五月婷婷久久丁香| 成人av一级片| 亚洲成人人体| 欧美日韩一二三| 九色porny自拍| 国产麻豆精品| 精品精品欲导航| 中文乱码人妻一区二区三区视频| 少妇久久久久| 亚洲一区二区久久| 国产在线观看免费视频软件| 欧美/亚洲一区| 久久久久久久影院| 亚洲综合图片网| 美女视频黄 久久| 147欧美人体大胆444| 成人精品在线播放| 久久久三级国产网站| 亚洲欧美日韩精品在线| 97caopron在线视频| 亚洲高清一区二区三区| 激情五月亚洲色图| 91精品网站在线观看| 精品欧美乱码久久久久久| 一出一进一爽一粗一大视频| 国产区精品区| 超薄丝袜一区二区| 国产成人免费看| 老司机午夜精品| 成人av片网址| 国产高清免费av在线| 亚洲美女屁股眼交3| 91视频 -- 69xx| 国产一区二区三区四区五区3d| 日韩午夜精品视频| wwwwxxxx国产| 欧美精品大片| 国产成人在线播放| 午夜精品久久久久久久96蜜桃 | 欧洲精品码一区二区三区免费看| 欧美成人高清在线| 欧美日韩一区二区精品| www午夜视频| 牛牛影视一区二区三区免费看| 在线视频免费一区二区| 久久免费小视频| 免费亚洲电影在线| 国产在线精品一区| 成人午夜在线影视| 在线一区二区三区四区五区 | 中文字幕视频一区二区三区久| 国产视频在线观看网站| 成人四虎影院| 亚洲精品久久久久久久久| 糖心vlog免费在线观看| 日韩精品1区2区3区| 成人欧美一区二区三区视频xxx| 国产九九在线| 欧美日韩在线免费观看| 亚洲熟女一区二区三区| 99久久.com| 国产精品美女呻吟| 欧美女同网站| 黄色一区二区在线| 久久久久亚洲av无码专区首jn| 日韩一级毛片| 国产精品色婷婷视频| 日本一区高清| 欧美日韩国产综合新一区| 人妻精油按摩bd高清中文字幕| 全球成人免费直播| 国产91色在线播放| 久青草国产在线| 欧美小视频在线| av网页在线观看| 伊人久久大香线蕉av超碰演员| 91精品在线影院| 欧美成人hd| 欧美日韩国产三级| 日韩一区二区三区四区视频| 欧美a级理论片| 视频一区视频二区视频三区高| 免费福利视频一区二区三区| 亚洲美女在线观看| 九九精品免费视频| 久久久av毛片精品| 99精品视频播放| 亚洲+小说+欧美+激情+另类| 日本国产欧美一区二区三区| 日韩福利一区二区| 色哦色哦哦色天天综合| 精品人妻无码一区二区三区| 三级欧美在线一区| 日本亚洲欧洲精品| 成人免费一区| 久久综合色影院| 精品美女www爽爽爽视频| 一区二区免费在线播放| 涩视频在线观看| 亚洲精品男同| 欧美亚洲免费高清在线观看| 精品无人乱码一区二区三区| 日韩中文字幕免费看| 国产免费av电影| 艳妇臀荡乳欲伦亚洲一区| www.555国产精品免费| 国产精品久久777777毛茸茸| 免费精品视频一区| 欧美视频在线视频精品| 日韩视频免费看| 午夜精品久久久久久久99热黄桃| 亚洲.国产.中文慕字在线| 日韩中文字幕电影| 美女脱光内衣内裤视频久久影院| 异国色恋浪漫潭| 国产精品任我爽爆在线播放| 国产成人精品一区| 免费在线视频欧美| 亚洲国产高潮在线观看| 男人天堂av在线播放| 中文字幕在线播放不卡一区| 91成人在线观看喷潮蘑菇| 国产精品女主播一区二区三区| 日本一区二区在线视频观看| 国模大尺度视频一区二区| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 福利视频一区二区三区| 午夜伦理福利在线| 久久天堂电影网| 视频一区二区三区在线看免费看| 欧美午夜视频网站| 国产精久久久久久| 中文字幕欧美区| 黄色国产在线视频| 日本va欧美va欧美va精品| 麻豆视频传媒入口| 免费成人av| 9a蜜桃久久久久久免费| 欧美成人精品三级网站| 久久久视频在线| 中文日本在线观看| 亚洲电影免费观看高清完整版在线观看 | 欧美影院一区二区| 国产精品a成v人在线播放| 国产精品视频你懂的| 捆绑裸体绳奴bdsm亚洲| 国产在线精品免费| 日本新janpanese乱熟| 伊人成人在线| 久久久久久久久影视| 加勒比久久综合| 国产日韩一区二区三区| 91精品一久久香蕉国产线看观看| 国产ts人妖一区二区三区| 女人黄色免费在线观看| 色av吧综合网| 国产精品视频二区三区| 亚洲国产精品久久久久| 99久久久国产精品无码网爆| 欧洲人成人精品| 国产精品久久久久久久久久久久久久久久久 | 激情图片在线观看高清国产| 色悠悠国产精品| www 日韩| 亚洲小视频在线| 日韩一二三四| 日韩电影大片中文字幕| 免费av网站在线播放| 欧美一区二区免费视频| 亚洲自拍第二页| 亚洲r级在线视频| 婷婷色中文字幕| 亚洲欧美视频在线观看| 欧美电影免费观看完整版| 国产网友自拍视频| 一区二区视频在线看| 小向美奈子av| 国产精品成人一区二区艾草| 国产探花视频在线播放| 久久精品一区二区三区四区| 给我看免费高清在线观看| www.爱久久.com| 久久性爱视频网站| www.日韩在线| 亚洲av无码成人精品国产| eeuss影院一区二区三区| japanese在线观看| av高清不卡在线| 青青草成人免费视频| 99re这里都是精品| aa一级黄色片| 91丨九色丨蝌蚪富婆spa| 成年人的黄色片| 久久久久久黄色| 99精品欧美一区二区| 国产喷白浆一区二区三区| 在线观看亚洲大片短视频| 国产精品毛片大码女人| 国产日韩欧美在线观看视频| 亚洲黄网站在线观看| 男女激烈动态图| 国产激情在线观看| 精品亚洲国产视频| 番号集在线观看| 精品国产一区av| 性欧美1819sex性高清大胸| 久久久久久久国产精品视频| 男女羞羞在线观看| 国产精品久久久久久久美男 | 日本一级理论片在线大全| 欧美激情精品久久久久久| 日韩欧美一中文字暮专区 | 免费观看亚洲天堂| 国产精品一区二区av| 日韩成人一级| 亚洲aⅴ天堂av在线电影软件| 久久久久久影院| 欧美精品自拍视频| 男人的天堂久久精品| 在线观看网站黄| 91免费看视频| 国产免费美女视频| 精品欧美一区二区三区| 亚洲永久精品一区| 日韩精品一区二区三区中文不卡 | 91色.com| 99自拍视频在线| 欧美日韩亚洲一区二区| 国产又大又黑又粗| 久久婷婷av| 久久综合精品一区| 久久精品一区二区不卡| 国产九九九九九| 精品一区二区在线播放| 精品中文字幕在线播放| 国产精品色噜噜| 国产成人一区二区三区影院在线| 欧美久久婷婷综合色| 亚洲色欧美另类| 蜜月aⅴ免费一区二区三区| 成人福利视频| 成人免费看片网站| 日韩一区欧美| 逼特逼视频在线| 国产精品99久久久久久久女警 | 国产精品免费丝袜| 日产电影一区二区三区| 欧美日本乱大交xxxxx| 日本v片在线免费观看| 欧美精品在线极品| 久久精品 人人爱| 久久一区二区三区欧美亚洲| 欧美激情1区2区| 中文字幕在线综合| 久久精品免视看| 九九热在线视频播放| 日韩一区二区三区免费观看| caoporn国产精品免费视频| 久久久亚洲影院| 日韩精品免费视频一区二区三区| 日韩三级电影网站| 久久久久久黄| 黄色录像a级片| 亚洲一区二区五区| www.我爱av| 欧美精品一区二区三区国产精品| 免费视频成人| 亚洲精品一区二区毛豆| 久久久水蜜桃av免费网站| 800av在线播放| 亚洲成人在线观看视频| 午夜精品久久久久久久爽| 久久视频在线观看免费| 另类一区二区| 亚洲一区二区不卡视频| 另类专区欧美蜜桃臀第一页| 日本美女xxx| 欧美日韩国产123区| 精品国产丝袜高跟鞋| 成人av色在线观看| 国产精品久久久久久久久久10秀 | 男女日批视频在线观看| 国产精品88av| 不卡的免费av| 亚洲国产女人aaa毛片在线| 丰乳肥臀在线| 国产伦精品一区二区三区照片| 欧美体内she精视频在线观看| 最新国产精品自拍| 亚洲一区电影777| 色网站免费观看| 51色欧美片视频在线观看| 九九精品在线| 中文字幕欧美人妻精品一区| 国产精品青草久久| 国产乱色精品成人免费视频 | 天天做天天爱天天高潮| 韩国欧美国产一区| 久久久www成人免费毛片| 亚洲高清久久网| 精品3atv在线视频| 亚洲电影一二三区| 国产乱码精品1区2区3区| 久久精品性爱视频| 精品视频在线播放免| 91av一区| 99国产精品白浆在线观看免费| 99视频在线精品| 岛国av中文字幕| 日韩在线观看高清| 136导航精品福利| 国内外成人激情视频| 国产精品私人自拍| 黑人乱码一区二区三区av| 日本欧美精品在线| 亚洲欧洲美洲一区二区三区| 50一60岁老妇女毛片| 一本色道a无线码一区v| 在线国产91| 国产在线一区二区三区四区| 日本不卡一区二区三区高清视频| 国产精品成人免费观看| 亚洲精品国产品国语在线| 亚洲国产伊人| 婷婷五月综合缴情在线视频| 国产精品色噜噜| 污污网站在线免费观看| 国产ts人妖一区二区三区| 欧美国产日本| 日韩中文字幕电影| 日韩精品一区二区三区中文精品| 3d欧美精品动漫xxxx无尽| 久久男人资源站| 国产欧美一区二区精品忘忧草| 亚洲av无码一区二区乱子伦| 国产精品成人在线| 日韩亚洲精品在线| 99自拍视频在线| 伊人成人开心激情综合网| 国产厕拍一区|