Hadoop环境搭建及WordCount实验详解

来源:互联网 发布:电脑笛子软件 编辑:程序博客网 时间:2024/04/30 16:30

Hadoop环境搭建及WordCount实验详解

一、实验内容

(1)Hadoop 环境搭建。

(2)Map-Reduce分布式编程。

二、实验步骤

1、集成环境搭建

(1)设置hostname(需要重新启动机器生效)

$ sudo vim /etc/hostname

(2)设置静态IP地址

$ ifconfig

(3)记录集群信息

     机器名     

      用户名      

        密码        

           IP地址          

     master

       jyneo

    yj810904

    192.168.50.188   

     slave1

       jyneo

    yj810904

    192.168.50.137

     slave2

       jyneo

    yj810904

    192.168.50.138

(4)配置IP地址和机器名的映射关系

$ sudo vim /etc/hosts(每台机器均需要配置)


2、设置无密钥登录

(1)建立ssh服务

在三台机器上都安装 openssh,建立 ssh 服务:

$ sudo apt-get install openssh-server

(2)设置无密钥登录

>>>>在各节点生成密钥:$ ssh-keygen

执行上一步命令后,会在 /home/jyneo/ 目录下生成.ssh 文件夹。

>>>>将各slave节点的 id_rsa.pub 文件集中至 master

>>>>在slave1机器上执行命令:$ scp  /home/jyneo/.ssh/id_rsa.pub jyneo@192.168.50.188:~/.ssh/slave1.pub

>>>>在slave2机器上执行命令:$ scp  /home/jyneo/.ssh/id_rsa.pub jyneo@192.168.50.188:~/.ssh/slave2.pub

>>>>将各节点的 id_rsa.pub 中的内容追加到 authorized_keys 文件中

在hadoop_master机器上执行命令:

$ cat  ~/.ssh/id_rsa.pub  >>  ~/.ssh/authorized_keys

$ cat  ~/.ssh/slave1.pub  >>  ~/.ssh/authorized_keys

$ cat  ~/.ssh/slave2.pub  >>  ~/.ssh/authorized_keys

>>>>将 authorized_keys 文件分发到各节点:

$ scp  ~/.ssh/authorized_keys  jyneo@192.168.50.137:~/.ssh/

$ scp  ~/.ssh/authorized_keys  jyneo@192.168.50.138:~/.ssh/

3、手动配置 JDK

>>>>将文件夹 jdk1.7.0_79 拷贝到各节点

$ scp  –r  jdk1.7.0_79  jyneo@slave1:~/Cloud/

$ scp  –r  jdk1.7.0_79  jyneo@slave2:~/Cloud/

>>>>修改 /etc/profile 文件,在该文件最后追加如下信息:

export  JAVA_HOME=/home/jyneo/Cloud/jdk1.7.0_79export  CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/libexport  PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

>>>>更新 profile 文件:$ source /etc/profile

4、搭建 Hadoop 环境

(1)下载Hadoop。

(2)解压缩:将下载的压缩包移动到目标文件夹,并解压。

$ cp~/Downloads/hadoop-2.6.0.tar.gz ~/Cloud

$ tar –vzxfhadoop-2.6.0.tar.gz

(3)配置文件、配置目录:

$ cd hadoop-2.6.0/etc/hadoop

core-site.xml:


mapred-site.xml:


hdfs-site.xml:


yarn-site.xml:


hadoop-env.sh:


yarn-env.sh:


slaves:


>>>>将修改后的 Hadoop 文件分发到各节点

$auto_sync_simple.sh~/Cloud/hadoop-2.6.0 ~/Cloud(执行命令出错,这里我是直接拷贝到机器slave1和slave2上的)

>>>>启动 Hadoop(在 master 节点执行)

$ cd hadoop-2.6.0


$ bin/hdfs namenode –format



$ sbin/start-all.sh(./start-dfs.sh ./start-yarn.sh)


>>>>集群监控界面:


三、WordCount 实验

       单词计数是最简单也是最能体现MapReduce思想的程序之一,可以称为MapReduce版"Hello World",该程序的完整代码可以在Hadoop安装包的"src/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;public class WordCount {  public static class TokenizerMapper       extends Mapper<Object, Text, Text, IntWritable>{    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());      while (itr.hasMoreTokens()) {        word.set(itr.nextToken());        context.write(word, one);      }    }  }  public static class IntSumReducer       extends Reducer<Text,IntWritable,Text,IntWritable> {    private IntWritable result = new IntWritable();    public void reduce(Text key, Iterable<IntWritable> values,                       Context context) throws IOException, InterruptedException {      int sum = 0;      for (IntWritable val : values) {        sum += val.get();      }      result.set(sum);      context.write(key, result);    }  }  public static void main(String[] args) throws Exception {    Configuration conf = new Configuration();    Job job = Job.getInstance(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);    FileInputFormat.addInputPath(job, new Path(args[0]));    FileOutputFormat.setOutputPath(job, new Path(args[1]));    System.exit(job.waitForCompletion(true) ? 0 : 1);  }}

(1)创建本地的数据文件

        在jyne/Cloud/hadoop-2.6.0下创建一个文件夹file用来存储本地原始数据,并在这个目录下创建2个文件,分别命名为【test1.txt】和【test2.txt】,分别在这2个文件中输入下列示例语句:


(2)在HDFS文件系统上创建input文件夹,作为输入文件目录。打开终端,输入下面指令:

$ bin/hadoop fs -mkdir /input

(3)上传本地file中文件到集群的input目录下在终端依次输入下面指令:

cd hadoop-2.6.0

bin/hadoop fs -put /home/jyneo/Cloud/hadoop-2.6.0/file/test*.txt /input


(4)运行程序实例。在终端输入以下指令:

bin/hadoop jar /home/jyneo/Cloud/hadoop-2.6.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount /input /output

运行结果如下图所示:




       Hadoop命令会启动一个JVM来运行这个MapReduce程序,并自动获得Hadoop的配置,同时把类的路径(及其依赖关系)加入到Hadoop的库中。以上就是Hadoop Job的运行记录,从这里可以看到,这个Job被赋予了一个ID号:job_201202292213_0002,而且得知输入文件有两个(Total input paths to process : 2),同时还可以了解map的输入输出记录(record数及字节数),以及reduce输入输出记录。

查看HDFS上output目录内容,在终端输入下面指令:

bin/hadoop fs -ls /output

从图中可以知道生成了两个文件,我们的结果在"part-r-00000"中。使用下面指令查看结果输出文件内容:

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

输出结果如下图所示;