国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Hadoop的“Hello world”---WordCount

sunnyxd / 3427人閱讀

摘要:運行程序運行你的根目錄運行這條命令后,會啟動一個來運行程序,而且會在集群上創建一個文件夾,將結果存在其中。

在安裝并配置好Hadoop環境之后,需要運行一個實例來驗證配置是否正確,Hadoop就提供了一個簡單的wordcount程序,其實就是統計單詞個數的程序,這個程序可以算是Hadoop中的“Hello World”了。

MapReduce 原理

MapReduce其實就是采用分而治之的思想,將大規模的數據分成各個節點共同完成,然后再整合各個節點的結果,得到最終的結果。這些分節點處理數據都可以做到并行處理,大大縮減了工作的復雜度。

過程

MapReduce可以分成兩個階段,其實就是單詞拆成map和reduce,這其實是兩個函數。map函數會產生一個中間輸出,然后reduce函數接受多個map函數產生的一系列中間輸出然后再產生一個最終輸出。

WordCount展示 前期工作 啟動hadoop
cd /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的配置中存在問題,或者是防火墻沒有關閉,導致節點連接不通。

運行程序 運行wordcount
hadoop 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 {
    IntWritable one = new IntWritable(1);
    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);
        }
    }
}

繼承Mapper類,重寫map方法。

我們了解到mapreduce中數據都是通過傳遞的。我們可以通過控制臺來看看其中的value值和key值是什么樣的。在map方法中加入以下代碼:

System.out.println("key= "+key.toString());//查看key值
System.out.println("value= "+value.toString());//查看value值

運行程序后控制臺輸出如下:

我們可以看出,map方法中的value值存儲的是文本文件中的一行,而key值為該行的首字符相對于文本文件的首地址的偏移量。

程序中的StringTokenizer這個類的功能是將每一行拆分成一個一個的單詞,并將作為map方法的結果輸出。

Reduce過程

源碼:

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 keyIterable。我們知道reduce方法的輸入參數key是一個單詞,而values是由各個Mapper上對應單詞的計數值所組成的列表,我們可以看到values實現了一個Iterable接口,可以理解成values里面包含了多個IntWritable整數,其實也就是計數值。

然后我們只要遍歷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的實例給運行起來,然后跑了一下官方的wordcount例子(用于統計文件中單詞出現的次數)。接下來是我成功運行實例的記錄。運行的前提是安裝配置好hadoop(可以參考我上一篇...

    light 評論0 收藏0

發表評論

0條評論

sunnyxd

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<