在云主机构建的hadoop集群上运行程序(接上一篇博文)

在查关于设置ssh免密登陆的时候,看到一篇很好的博客,有一种很简便的方法来设置集群中主机之间的ssh免密登录,地址:http://blog.csdn.net/zzu09huixu/article/details/36416007
用到了一种传递的思想来存储每台主机产生的公钥,具体步骤如下:
(1)在所有主机上都执行:

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

这样,每台主机都产生一个自己的密钥对。在~/.ssh下会生成三个文件:
authorized_keys :权限认证文件,这个文件存储了谁的主机的公钥,就可以被谁访问。比如slave01的~/.ssh下的authorized_keys中存储了master-namenode的公钥,那么master-namenode所在的主机就可以通过ssh免密访问slave01所在的主机
id_dsa :生成的密钥对中的私钥
id_dsa.pub :生成的密钥对中的公钥
(2)第一台主机执行:

cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

将自己的密钥对中的公钥存放到authorized_keys文件中,
然后执行:

scp ~/.ssh/authorized_keys 第二台的主机名@第二台主机的ip:~/.ssh

将authorized_keys文件拷贝到第二台主机的~/.ssh下。

后面的主机重复步骤(2),直至最后一台主机。

最后一台主机将自己的公钥存放到authorized_keys后,该文件就保存了所有主机的公钥。
(3)将最后一台主机的authorized_keys再拷贝至其他所有的主机。

如此一来,就保证了所有主机均包含其他主机的公钥,也就实现了集群主机之间的ssh免密登录。

这种方法很简便,但是hadoop集群不需要所有的主机之间都可以通过ssh免密登录,hadoop集群最低的要求是:
(一)namenode所在的节点可以通过ssh免密访问所有的datanode所在的节点;
(二)jobtracker所在的节点可以通过ssh免密访问所有的tasktracker所在的节点。只需保证这两点即可。

接下来完成在该云主机搭建的hadoop集群上运行wordcount程序

因为通过putty远程连接云主机,只有一个窗口,没有可视化的界面,所以程序和数据都需要通过一个本地的Linux系统来上传。
我用的是在virtualbox安装一个ubuntu 14.04的可视化linux系统。

(一)将待分析的数据上传到该集群的hdfs中。
这可以通过本地的linux终端中执行scp命令将数据拷贝至集群的任何一个主机上,然后在该主机上执行hadoop fs -copyFromLocal命令将数据上传至hdfs中。

(二)将程序打包成jar上传至集群
我是在本地的linux中的eclipse中写好程序,程序代码如下:

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.io.compress.GzipCodec;
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 = new Job(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);

        // 设置输出的压缩格式
        FileOutputFormat.setCompressOutput(job, true);
        FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);

        FileInputFormat.addInputPath(job, new Path("hdfs://master-namenode:9527/user/chj/wordcount/data/README.txt"));
        FileOutputFormat.setOutputPath(job, new Path("hdfs://master-namenode:9527/user/chj/wordcount/output"));
        System.exit(job.waitForCompletion(false) ? 0 : 1);
    }
}

需要注意的地方就是:

FileInputFormat.addInputPath(job,new Path("hdfs://master-namenode:9527/user/chj/wordcount/data/README.txt"));
FileOutputFormat.setOutputPath(job,new Path("hdfs://master-namenode:9527/user/chj/wordcount/output"));

这里可以先不写路径,然后在命令行中写,也可以像我这样直接写上去。
第一个路径是待分析的数据在hdfs中的路径;
第二个路径是生成的结果在hdfs中的保存路径。

接下来右键该wordcount.java,选择Export->JAR File->选择存放位置
这里写图片描述
最后点击“finish”即可。

将生成的jar文件通过scp命令拷贝至集群的主机上,
然后在该主机上执行:

hadoop jar 名称.jar WordCount

我的程序类名为WordCount,生成的jar为wc.jar,所以我的命令是

hadoop jar wc.jar WordCount

运行结束后查看上面设置的结果路径
这里写图片描述
看到了_SUCCESS表明作业执行成功。

查看分析的结果:
这里写图片描述

至此,完成了在该集群上执行作业的整个过程。

我是个hadoop学习的新手,以上只是自己的一些心得,如有不对之处,还请指出来,大家一起学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值