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

来源:互联网 发布:淘宝做工瑕疵运费 编辑:程序博客网 时间:2024/05/23 12:54

在查关于设置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
原创粉丝点击