您的位置:首页 > 运维架构

hadoop基础学习-环境及实践(一)

2013-06-22 11:43 302 查看
1.云计算的概念

狭义云计算是指IT基础设施的交付和使用模式,通过网络以按需、易扩展的方式获得所需的资源(硬件、平台、软件)。

广义云计算是指服务的交付和使用模式,通过网络以按需、易扩展的方式获得所需的服务。这种服务可以是IT和软件、互联网相关的,也可以是任意其他的服务。

2.三层模型

Saas:more
Paas:hadoop
Iaas: openstack
3.google VS hadoop

google calls it:hadoop equivalent:
MapReduceHadoop
GFSHDFS
BigtableHBase
ChubbyZookeeper
3.hadoop的使用:

编写map和reduce函数

3.1 map :

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); //设置 key value

}

}

}

说明: map的输出key 、value和reduce的输入key、value要一致,见上面红色部分

3.2 reduce

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);
}
}
说明: map的输出key 、value和reduce的输入key、value要一致,见上面红色部分

3.3 job的配置

public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: wordcount <in> <out>");
System.exit(2);
}
Job job = new Job(conf, "word count"); //job name
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(otherArgs[0])); //file input
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); //file output
System.exit(job.waitForCompletion(true) ? 0 : 1);
}

4.命令行运行
步骤:

a.打包mapreduce函数,wordcount.jar 设类名WordCount

b.进入hadoop安装目录

c.执行方式:hadoop jar 本地jar包目录 类名 hdfs输入文件目录 hdfs输入文件目录

例如:hadoop jar /home/deke/wordcount.jar WordCount hdfs输入文件目录 hdfs输入文件目录

5.eclipse配置

步骤:

a.下载eclipse,eclipse3.3.X,其他版本会不兼容,下好eclipse-java-3.3-linux.tar.gz文件后,sudo
cp **.tar.gz /usr/lib,解压缩sudo -xvf ****.tar.gz

b.将 hadoop 文件夹下的 contrib/eclipse-plugin/hadoop-*-eclipse- plugin.jar ,拷贝到 eclipse 文件夹下的/plugins 文件夹里

c.启动 Eclipse

d.设置 Hadoop 安装文件夹的路径

Window->Preferences—>hadoop Map/Reduce设置 hadoop的linux下文件位置,如:/usr/hadoop

e.window->show view->other->MapReduce Tool ->Map/Reduce Location,在Map/Reduce Location控制台空白处,

右击选择“New Map/Reduce

Location”,在弹出的对话框里,根据core-site.xml和maperd-site.xml里的端口填写

在窗口左侧试图的'Project Explorer'里,点击'DFS Location',就会出现HDFS的目录级

到这里配置完成了

e.让你的map reduce程序直接在eclipse运行,而不需要打成jar包放到/hadoop/bin下手动在控制台run的方法:

在你建的mapreduce项目的类上,右键 -> Run As -> Open Run Dialog...

在弹出的对话框中,点击 Java Application -> 类名 -> Arguments,如下图所示:

在Arguments里填上输入路径(即待处理文件存放目录)和输出路径(即处理结果存放目录),在这里这两个目录都是HDFS的路径,不是本地目录,中间用空格隔开即可。其中的hdfs://localhost:54310
是你在core-site.xml配置文件的里定义的fs.default.name的值。

另外,/user/MR
目录需要你手工创建(在把本地待处理文件拷贝到HDFS时创建的),/user/MRout不用事先创建,HDFS会为你自动创建此目录。

3.
现在在你写的mapreduce 类里,就想平时写的java程序一样,点击Run,即可在Console里出现跟在控制台里手动run一样的输出。如下图所示:

f。这时,如下图所示,刷新
"user" 文件夹就会出现第2步定义的MRout文件夹,里面的part-r-00000就是mapreduce的处理结果,双击此文件即可打开,查看结果。

PS:

当你下次再运行程序时,会报错说 /user/MRout 目录已存在,那么解决方法也很简单,要么在步骤4里把MRout目录,右击选择"Delete";要么在步骤2里改输出路径,当然了,还是前者方便些。
使用说明:

1、查看文件系统。点击eclipse右上角的蓝色大象图标,然后在左边Project Explorer会出现DFS Locations的链接,打开就能看到HDFS的文档结构。

2、运行Job,运行的时候采用Run on hadoop。这里需要注意3点,

A、记得配置输入输出参数。

B、记得在main函数中添加conf.set("hadoop.job.ugi", "root,hadoop"); root是用户名,hadoop是密码。

C、工程需要加载hadoop下lib里的所有包以及hadoop目录下的包,当然不是全部都需要,我觉得麻烦,所以全部加上了。

参考:http://hi.baidu.com/ihsauqaxblbdmwq/item/9ddaf2fca32315b230c199a7
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: