真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

[HadoopinAction]第1章Hadoop簡(jiǎn)介-創(chuàng)新互聯(lián)

  • 編寫(xiě)可擴(kuò)展、分布式的數(shù)據(jù)密集型程序和基礎(chǔ)知識(shí)

    成都創(chuàng)新互聯(lián)服務(wù)電話:13518219792,為您提供成都網(wǎng)站建設(shè)網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),成都創(chuàng)新互聯(lián)網(wǎng)頁(yè)制作領(lǐng)域十余年,包括花箱等多個(gè)行業(yè)擁有多年的網(wǎng)站維護(hù)經(jīng)驗(yàn),選擇成都創(chuàng)新互聯(lián),為企業(yè)錦上添花。
  • 理解Hadoop和MapReduce

  • 編寫(xiě)和運(yùn)行一個(gè)基本的MapReduce程序

1、什么是Hadoop

Hadoop是一個(gè)開(kāi)源的框架,可編寫(xiě)和運(yùn)行分布式應(yīng)用處理大規(guī)模數(shù)據(jù)。

Hadoop與眾不同之處在于以下幾點(diǎn):

  1. 方便——Hadoop運(yùn)行在由一般商用機(jī)器構(gòu)成的大型集群上,或者云計(jì)算服務(wù)之上;

  2. 健壯——Hadoop致力于在一般商用硬件上運(yùn)行,其架構(gòu)假設(shè)硬件會(huì)頻繁地出現(xiàn)失效;

  3. 可擴(kuò)展——Hadoop通過(guò)增加集群節(jié)點(diǎn),可以線性地?cái)U(kuò)展以處理更大的數(shù)據(jù)集;

  4. 簡(jiǎn)單——Hadoop運(yùn)行用戶快速編寫(xiě)出高效的并行代碼。

2、了解分布式系統(tǒng)和Hadoop

理解分布式系統(tǒng)(向外擴(kuò)展)和大型單機(jī)服務(wù)器(向上擴(kuò)展)之間的對(duì)比,考慮現(xiàn)有I/O技術(shù)的性價(jià)比。

理解Hadoop和其他分布式架構(gòu)(SETI@home)的區(qū)別:

Hadoop設(shè)計(jì)理念是代碼向數(shù)據(jù)遷移,而SETI@home設(shè)計(jì)理念是數(shù)據(jù)遷移。

要運(yùn)行的程序在規(guī)模上比數(shù)據(jù)小幾個(gè)數(shù)量級(jí),更容易移動(dòng);此外,在網(wǎng)絡(luò)上移動(dòng)數(shù)據(jù)要比在其上加載代碼更花時(shí)間,不如讓數(shù)據(jù)不動(dòng)而將可執(zhí)行代碼移動(dòng)到數(shù)據(jù)所在機(jī)器上去。

3、比較SQL數(shù)據(jù)庫(kù)和Hadoop

SQL(結(jié)構(gòu)化查詢語(yǔ)言)是針對(duì)結(jié)構(gòu)化數(shù)據(jù)設(shè)計(jì)的,而Hadoop最初的許多應(yīng)用針對(duì)的是文本這種非結(jié)構(gòu)化數(shù)據(jù)。讓我們從特定的視角將Hadoop與典型SQL數(shù)據(jù)庫(kù)做更詳細(xì)的比較:

  1. 用向外擴(kuò)展代替向上擴(kuò)展——擴(kuò)展商用關(guān)系型數(shù)據(jù)庫(kù)的代價(jià)會(huì)更加昂貴的

  2. 用鍵/值對(duì)代替關(guān)系表——Hadoop使用鍵/值對(duì)作為基本數(shù)據(jù)單元,可足夠靈活地處理較少結(jié)構(gòu)化的數(shù)據(jù)類型

  3. 用函數(shù)式編程(MapReduce)代替聲明式查詢(SQL)——在MapReduce中,實(shí)際的數(shù)據(jù)處理步驟是由你指定的,很類似于SQL引擎的一個(gè)執(zhí)行計(jì)劃

  4. 用離線處理代替在線處理——Hadoop是專為離線處理和大規(guī)模數(shù)據(jù)分析而設(shè)計(jì)的,并不適合那種對(duì)幾個(gè)記錄隨機(jī)讀寫(xiě)的在線事務(wù)處理模式

4、理解MapReduce

MapReduce是一種數(shù)據(jù)處理模型,大的優(yōu)點(diǎn)是容易擴(kuò)展到多個(gè)計(jì)算節(jié)點(diǎn)上處理數(shù)據(jù);

在MapReduce模型中,數(shù)據(jù)處理原語(yǔ)被稱為mapper和reducer;

分解一個(gè)數(shù)據(jù)處理應(yīng)用為mapper和reducer有時(shí)是繁瑣的,但是一旦一MapReduce的形式寫(xiě)好了一個(gè)應(yīng)用程序,僅需修改配置就可以將它擴(kuò)展到集群中幾百、幾千,甚至幾萬(wàn)臺(tái)機(jī)器上運(yùn)行。

[動(dòng)手?jǐn)U展一個(gè)簡(jiǎn)單程序]

少量文檔處理方式:對(duì)于每個(gè)文檔,使用分詞過(guò)程逐個(gè)提取單詞;對(duì)于每個(gè)單詞,在多重集合wordcount中的相應(yīng)項(xiàng)上加1;最后display()函數(shù)打印出wordcount中的所有條目。

大量文檔處理方式:將工作分布到多臺(tái)機(jī)器上,每臺(tái)機(jī)器處理這些文檔的不同部分,當(dāng)所有機(jī)器都完成時(shí),第二個(gè)處理階段將合并這些結(jié)果。

一些細(xì)節(jié)可能會(huì)妨礙程序按預(yù)期工作,如文檔讀取過(guò)量導(dǎo)致中央存儲(chǔ)服務(wù)器的帶寬性能跟不上、多重集合wordcount條目過(guò)多超過(guò)計(jì)算機(jī)的內(nèi)存容量。此外,第二階段只有一個(gè)計(jì)算機(jī)處理wordcount任務(wù),容易出現(xiàn)瓶頸,所以可以采用分布的方式運(yùn)轉(zhuǎn),以某種方式將其分割到多臺(tái)計(jì)算機(jī)上,使之能夠獨(dú)立運(yùn)行,即需要在第一階段后將wordcount分區(qū),使得第二階段的每臺(tái)計(jì)算機(jī)僅需處理一個(gè)分區(qū)。

為了使它工作在一個(gè)分布式計(jì)算機(jī)集群上,需要添加以下功能:

  • 存儲(chǔ)文件到許多計(jì)算機(jī)上(第一階段)

  • 編寫(xiě)一個(gè)基于磁盤(pán)的散列表,使得處理不受內(nèi)存容量限制

  • 劃分來(lái)自第一階段的中間數(shù)據(jù)(即wordcount)

  • 洗牌這些分區(qū)到第二階段中合適的計(jì)算機(jī)上

MapReduce程序執(zhí)行分為兩個(gè)主要階段,為mapping和reducing,每個(gè)階段均定義為一個(gè)數(shù)據(jù)處理函數(shù),分別稱為mapper和reducer。在mapping階段,MapReduce獲取輸入數(shù)據(jù)并將數(shù)據(jù)單元裝入mapper;在reduce階段,reducer處理來(lái)自mapper的所有輸出,并給出最終結(jié)果。簡(jiǎn)而言之,mapper意味著將輸入進(jìn)行過(guò)濾與轉(zhuǎn)換,使reducer可以完成聚合。

另外,為了擴(kuò)展分布式的單詞統(tǒng)計(jì)程序,不得不編寫(xiě)了partitioning和shuffling函數(shù)。

在MapReduce框架中編寫(xiě)應(yīng)用程序就是定制化mapper和reducer的過(guò)程,以下是完整的數(shù)據(jù)流:

  1. 應(yīng)用的輸入必須組織為一個(gè)鍵/值對(duì)的列表list();

  2. 含有鍵/值對(duì)的列表被拆分,進(jìn)而通過(guò)調(diào)用mapper的map函數(shù)對(duì)每個(gè)單獨(dú)的鍵/值對(duì)進(jìn)行處理;

  3. 所有mapper的輸出被聚合到一個(gè)包含對(duì)的巨大列表中;

  4. 每個(gè)reducer分別處理每個(gè)被聚合起來(lái)的,并輸出。

5、用Hadoop統(tǒng)計(jì)單詞——運(yùn)行第一個(gè)程序

  • Linux操作系統(tǒng)

  • JDK1.6以上運(yùn)行環(huán)境

  • Hadoop操作環(huán)境

Usage:hadoop [—config configdir] COMMAND

這里COMMAND為下列其中一個(gè):

namenode -format                       格式化DFS文件系統(tǒng)

secondarynamenode                     運(yùn)行DFS的第二個(gè)namenode

namenode                              運(yùn)行DFS的namenode

datanode                               運(yùn)行一個(gè)DFS的datanode

dfsadmin                               運(yùn)行一個(gè)DFS的admin客戶端

fsck                                   運(yùn)行一個(gè)DFS文件系統(tǒng)的檢查工具

fs                                     運(yùn)行一個(gè)普通的文件系統(tǒng)用戶客戶端

balancer                               運(yùn)行一個(gè)集群負(fù)載均衡工具

jobtracker                              運(yùn)行MapReduce的jobtracker節(jié)點(diǎn)

pipes                                  運(yùn)行一個(gè)pipes作業(yè)

tasktracker                             運(yùn)行一個(gè)MapReduce的tasktracker節(jié)點(diǎn)

job                                    處理MapReduce作業(yè)

version                                 打印版本

jar                                運(yùn)行一個(gè)jar文件

distcp                  遞歸地復(fù)制文件或者目錄

archive  -archiveName NAME *   生成一個(gè)Hadoop檔案

daemonlog                             獲取或設(shè)置每個(gè)daemon的log級(jí)別

CLASSNAME                           運(yùn)行名為CLASSNAME的類大多數(shù)命令會(huì)在使用w/o參數(shù)

                                      時(shí)打出幫助信息。

運(yùn)行單詞統(tǒng)計(jì)示例程序的命令形式如下:

hadoop jar hadoop-*-examples.jar wordcount [-m ] [-r reduces] input output

編譯修改后的單詞統(tǒng)計(jì)程序的命令形式如下:

javac -classpath hadoop-*-core.jar -d playground/classes playground/src/WordCount.java

jar -cvf playground/src/wordcount.jar -C playground/classes/

運(yùn)行修改后的單詞統(tǒng)計(jì)程序的命令形式如下:

hadoop jar playground/wordcount.jar org.apache.hadoop.examples.WordCount input output


代碼清單 WordCount.java

package org.apache.hadoop.examples;
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());   //(1)使用空格進(jìn)行分詞
      while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());   //(2)把Token放入Text對(duì)象中
        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);   //(3)輸出每個(gè)Token的統(tǒng)計(jì)結(jié)果
    }
  }
  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)的位置上wordcount以默認(rèn)配置使用了Java的StringTokenizer,這里僅基于空格來(lái)分詞。為了在分詞過(guò)程中忽略標(biāo)準(zhǔn)的標(biāo)點(diǎn)符號(hào),將它們加入到stringTokenizer的定界符列表中:

        StringTokenizer itr = new StringTokenizer(value.toString(),” \t\n\r\f,.:;?![]’");

因?yàn)橄M麊卧~統(tǒng)計(jì)忽略大小寫(xiě),把它們轉(zhuǎn)換為T(mén)ext對(duì)象前先將所有的單詞都變成小寫(xiě):

     word.set(itr.nextToken().toLowerCase());

希望僅僅顯示出現(xiàn)次數(shù)大于4次的單詞:

     if (sum > 4) context.write(key, result);


6、hadoop歷史

創(chuàng)始人:Doug Cutting

2004年左右——Google發(fā)表了兩篇論文來(lái)論述Google文件系統(tǒng)(GFS)和MapReduce框架。

2006年1月——雅虎聘用Doug,讓他和一個(gè)專項(xiàng)團(tuán)隊(duì)一起改進(jìn)Hadoop,并將其作為一個(gè)開(kāi)源項(xiàng)目。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


網(wǎng)頁(yè)題目:[HadoopinAction]第1章Hadoop簡(jiǎn)介-創(chuàng)新互聯(lián)
URL鏈接:http://weahome.cn/article/epcjd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部