Sök…


Syntax

  • För att köra exemplet är kommandosyntaxen:

    bin/hadoop jar hadoop-*-examples.jar wordcount [-m <#maps>] [-r <#reducers>] <in-dir> <out-dir>
    
  • Så här kopierar du data till HDFS (från lokalt):

    bin/hadoop dfs -mkdir <hdfs-dir> //not required in hadoop 0.17.2 and later
    bin/hadoop dfs -copyFromLocal <local-dir> <hdfs-dir>
    

Anmärkningar

Word Count-program med MapReduce i Hadoop.

Word Count Program (i Java & Python)

Ordet räknar programmet är som "Hello World" -programmet i MapReduce.

Hadoop MapReduce är ett mjukvaroram för att enkelt skriva applikationer som behandlar stora mängder data (multi-terabyte-datauppsättningar) parallellt på stora kluster (tusentals noder) av varuhårdvara på ett tillförlitligt, feltolerant sätt.

Ett MapReduce-jobb delar vanligtvis indatadatten i oberoende bitar som bearbetas av kartuppgifterna på ett helt parallellt sätt. Ramverket sorterar utdata från kartorna, som sedan matas in för att minska uppgifterna. Vanligtvis lagras både ingången och utgången från jobbet i ett filsystem. Ramverket tar hand om schemaläggningsuppgifter, övervakar dem och kör igen de misslyckade uppgifterna.

Exempel på ordräkning:

WordCount-exempel läser textfiler och räknar hur ofta ord förekommer. Ingången är textfiler och utgången är textfiler, där varje rad innehåller ett ord och antalet hur ofta det inträffade, separerade av en flik.

Varje mapper tar en rad som inmatning och delar upp den i ord. Den avger sedan ett nyckel / värdepar av ordet och varje reducer summerar räkningarna för varje ord och avger en enda nyckel / värde med ordet och summan.

Som optimering används reduceraren också som en kombinerare på kartoutgångarna. Detta minskar mängden data som skickas över nätverket genom att kombinera varje ord till en enda post.

Word Count Code:

package org.myorg;
        
import java.io.IOException;
import java.util.*;
        
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
        
public class WordCount {
        
 public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();
        
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String line = value.toString();
        StringTokenizer tokenizer = new StringTokenizer(line);
        while (tokenizer.hasMoreTokens()) {
            word.set(tokenizer.nextToken());
            context.write(word, one);
        }
    }
 } 
        
 public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {

    public void reduce(Text key, Iterable<IntWritable> values, Context context) 
      throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        context.write(key, new IntWritable(sum));
    }
 }
        
 public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
        
        Job job = new Job(conf, "wordcount");
    
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
        
    job.setMapperClass(Map.class);
    job.setReducerClass(Reduce.class);
        
    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);
        
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
        
    job.waitForCompletion(true);
 }
        
}

För att köra exemplet är kommandosyntaxen:

bin/hadoop jar hadoop-*-examples.jar wordcount [-m <#maps>] [-r <#reducers>] <in-dir> <out-dir>

Alla filerna i inmatningskatalogen (kallas in-dir i kommandoraden ovan) läses och antalet ord i ingången skrivs till utgångskatalogen (kallas ut-dir ovan). Det antas att både in- och utgångar lagras i HDFS.Om din ingång inte redan finns i HDFS utan snarare är i ett lokalt filsystem någonstans, måste du kopiera data till HDFS med ett kommando som detta:

bin/hadoop dfs -mkdir <hdfs-dir> //not required in hadoop 0.17.2 and later
bin/hadoop dfs -copyFromLocal <local-dir> <hdfs-dir>

Exempel på Word Count i Python:

mapper.py

import sys 
for line in sys.stdin: 
    # remove leading and trailing whitespace 
    line = line.strip() 
    # split the line into words 
    words = line.split() 
    # increase counters 
    for word in words: 
        print '%s\t%s' % (word, 1)

reducer.py

import sys
current_word = None
current_count = 0
word = None
for line in sys.stdin:
    # remove leading and trailing whitespaces
    line = line.strip()
    # parse the input we got from mapper.py
    word, count = line.split('\t', 1)
    # convert count (currently a string) to int
    try:
        count = int(count)
    except ValueError:
        # count was not a number, so silently
        # ignore/discard this line
        continue
    if current_word == word:
        current_count += count
    else:
        if current_word:
            print '%s\t%s' % (current_word, current_count)
        current_count = count
        current_word = word
if current_word == word:
    print '%s\t%s' % (current_word, current_count)

Ovanstående program kan köras med cat filename.txt | python mapper.py | sort -k1,1 | python reducer.py



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow