Hadoop Getting Started

本文描述在ubuntu上安装Hadoop,并在Pseudo-Distributed Operation模式下运行一个WordCount的Demo。

 

Step1

安装必要的软件:jdk,ssh。

在ubuntu下可以使用apt安装。

sudo apt-get install openjdk-6-jdk 
sudo apt-get install ssh

ssh安装完成后需要做一个特殊的设置。Hadoop使用ssh对集群的机器进行控制,需要让ssh无密码的登录远程机器,本文使用单击模拟分布环境,只要能无密码登录到localhost即可。

首先使用 ssh-keygen 命令按提示生成ssh密钥对。

在使用ssh-copy-id user@localhost,把公钥复制到authorized_keys中。

最后验证一下能否ssh localhost无密码登录。

Step2

下载hadoop-0.20.2.tar.gz ,解压。并把bin目录添加到PATH中。

配置hadoop/conf/hadoop-env.sh,添加JAVA_HOME环境变量

export JAVA_HOME="/usr/lib/jvm/java-6-openjdk"

 

分别配置conf/core-site.xml,conf/hdfs-site.xml,conf/mapred-site.xml三个hadoop主要的配置文件。


  
    fs.default.name
    hdfs://localhost:9000
  
 

  
    dfs.replication
    1
  
 

  
    mapred.job.tracker
    localhost:9001
  

 以上配置告诉hadoop在本机同时启动jobtracker,tasktracker,namenode,datanode,在本机模拟分布式的计算环境。

Step3

格式化一个新的分布式文件系统

hadoop namenode -format

 

启动所有的服务

start-all.sh

通过web UI查看namenode,jobtracker的状态。页面打开后表示hadoop启动完毕。

NameNode - http://localhost:50070/

JobTracker - http://localhost:50030/

Step4

编写简单WordCount Demo。需要把hadoop-0.20.2-core.jar api添加到classpath下。如果使用maven构建项目,可以添加以下依赖。


       org.apache.hadoop
       hadoop-core
       0.20.2
 

代码如下。

public class WordCountMapper extends Mapper {

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

        String line = value.toString();
        StringTokenizer tokenizer = new StringTokenizer(line);
        while(tokenizer.hasMoreTokens()){
            context.write(new Text(tokenizer.nextToken()), new IntWritable(1));
        }

    }
}
 
public class WordCountReducer extends Reducer {

    @Override
    protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {

        int count = 0;
        for (IntWritable value : values) {
            count++;
        }
        context.write(key, new IntWritable(count));
    }
}
 
public class WordCountJobConf {

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        if (args.length != 2) {
            System.err.println("Usage: NewMaxTemperature  ");
            System.exit(-1);
        }
        Job job = new Job();
        job.setJarByClass(WordCountJobConf.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        job.setMapperClass(WordCountMapper.class);
        job.setReducerClass(WordCountReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }


}

 编译项目打包为jar wordcount.jar(不需要包含依赖)

Step5

准备wordcount的输入文本stuff.txt,并复杂到hdfs上。

创建input目录。

hadoop dfs -mkdir input

hadoop dfs -put stufff.txt input

 

最后运行wordcount,注意output目录,不应该存在。

hadoop jar wordcount.jar WordCountJobConf input output

 

map和reduce都运行完成可以,可以到output查看计算结果。

hadoop dfs -ls output

hadoop dfs -cat output/part-r-00000

 

wordcount程序简单分析

map方法使用hadoop默认的TextInputFormat从input目录读取文件,并把每一行作为一个输入,key为行号,value为该行文本内容。map方法,从数据中提取所有的token,并以该token为key,1为value作为输出。hadoop收集所有的map输出,并通过shuffle过程,归并所有相同的key。reduce过程的数据即为归并的结果,key为token,value为map中该token对应的所有value的集合。reduce方法简单计算value集合的大小,输出结果。key为token,value为数量。最后hadoop使用默认TextOutputFormat输出结果。

vast    1
version 3
very    4
via     36
view    4
viewed  1
views   1
virtual 1
void    8
walk    1
watch   1
wave    1
way     2
we      5
what    1
when    6
where   7

 

你可能感兴趣的:(Hadoop)