成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Hadoop的“Hello world”---WordCount

sunnyxd / 3459人閱讀

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

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

MapReduce 原理

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

過程

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

WordCount展示 前期工作 啟動hadoop
cd /usr/hadoop/hadoop-2.6.2/
sbin/start-dfs.sh
sbin/start-yarn.sh
創(chuàng)建本地數(shù)據(jù)文件
cd ~/
mkdir ~/file
cd file
echo "Hello World" > test1.txt
echo "Hello Hadoop" > test2.txt

這樣就創(chuàng)建了兩個txt文件,里面分別有一個字符串:Hello World,Hello Hadoop。我們通過wordcount想要得到的結(jié)果是這樣的:Hello 2,World 1,Hadoop 1。

在HDFS上創(chuàng)建輸入文件夾
hadoop fs -mkdir /input

創(chuàng)建好我們可以通過

hadoop fs -ls /

來查看結(jié)果:

將數(shù)據(jù)文件傳到input目錄下
hadoop fs -put ~/file/test*.txt /input

同樣,我們可以通過

hadoop fs -ls /input 

來查看是否上傳成功:

如果看不到任何結(jié)果,說明在hadoop的配置中存在問題,或者是防火墻沒有關(guān)閉,導(dǎo)致節(jié)點(diǎn)連接不通。

運(yùn)行程序 運(yùn)行wordcount
hadoop jar /你的hadoop根目錄/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.2.jar wordcount /input /output

運(yùn)行這條命令后,Hadoop會啟動一個JVM來運(yùn)行MapReduce程序,而且會在集群上創(chuàng)建一個output文件夾,將結(jié)果存在其中。

我們來看看結(jié)果:

注意點(diǎn):

這個目錄一定要填對,要不然會報jar不存在。

輸出文件夾一定要是空文件夾。

查看結(jié)果

output文件夾中現(xiàn)在有兩個文件,我們需要的結(jié)果在part-r-00000這個文件夾中。

hadoop fs -cat /output/part-r-00000

我們就可以看到最終的wordcount結(jié)果了:

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中數(shù)據(jù)都是通過傳遞的。我們可以通過控制臺來看看其中的value值和key值是什么樣的。在map方法中加入以下代碼:

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

運(yùn)行程序后控制臺輸出如下:

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

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

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

然后我們只要遍歷values并且求和,就可以得到各單詞的總次數(shù)了。

執(zhí)行MapReduce

我們已經(jīng)寫好了map函數(shù)和reduce函數(shù),現(xiàn)在就是要執(zhí)行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*()方法是為對任務(wù)的參數(shù)進(jìn)行相關(guān)的設(shè)置,然后調(diào)用job.waitForCompletion()方法執(zhí)行任務(wù)。

原文鏈接:http://axuebin.com/blog/2016/02/14/hadoop-wordcount/

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64802.html

相關(guān)文章

  • hadoop運(yùn)行第一個實(shí)例wordcount

    摘要:引語這幾周事情比較多,兩周沒寫博客了,這周總算把的實(shí)例給運(yùn)行起來,然后跑了一下官方的例子用于統(tǒng)計文件中單詞出現(xiàn)的次數(shù)。接下來是我成功運(yùn)行實(shí)例的記錄。 引語: 這幾周事情比較多,兩周沒寫博客了,這周總算把hadoop的實(shí)例給運(yùn)行起來,然后跑了一下官方的wordcount例子(用于統(tǒng)計文件中單詞出現(xiàn)的次數(shù))。接下來是我成功運(yùn)行實(shí)例的記錄。運(yùn)行的前提是安裝配置好hadoop(可以參考我上一篇...

    light 評論0 收藏0

發(fā)表評論

0條評論

sunnyxd

|高級講師

TA的文章

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