如何用hadoop运行第一个程序(纯新手教程)

因为大概花了一上午的时间琢磨(捂脸.jpg),所以觉得应该写一篇教程记录一下,以防下次遗忘。

前提:成功安装并启动了hadoop。

注意:有一部分为回顾内容,具体指令可能有问题。还有,权限不够记得用sudo。

一、添加java文件

1. 在hadoop安装路径下创建第一个程序的wordcount文件夹、src文件夹、classes文件夹

(一般安装路径都在/usr/local/hadoop,这里创建的src用于存放java程序,classes用于存放java文件编译之后的class文件)

cd /usr/local/hadoop

mkdir /wordcount

mkdir /wordcount/src

mkdir /wordcount/classes

2.在src文件夹下创建三个java文件,并添加内容

(选择自己常用的编译器,这里用的是vim)

(1)vim /wordcount/src/TokenizerMapper.java

(2)点击键盘上的insert来开始vim编辑

(3)ctrl+shift+C复制以下内容并ctrl+shift+V粘帖:

package com.lisong.hadoop;

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
	IntWritable one = new IntWritable(1);
	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);
		}
	}
}

(4)点击键盘上的esc来退出vim编辑器

(5)输入:wq保存并退出

(6)重复1-5步,输入其他两个java文件

(6.1)IntSumReducer.java

package com.lisong.hadoop;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
	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);
	}
}

(6.2)WordCount.java

package com.lisong.hadoop;

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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class WordCount {
	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, "wordcount");
		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]));
		FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
		System.exit(job.waitForCompletion(true)?0:1);
	} 
}

二、上传input文件

3.在Hadoop安装目录下面创建input文件夹: mkdir /input 用来存放本地的输入文件

(hadoop主文件夹下面本来也有几个txt文件,所以可以直接cp过来用作input文件)

在/usr/local/hadoop安装目录下打开指令:cp README.txt /input

4.好像如果直接用readme的文件名有可能报错,保险起见改一下:

cd /input

mv README.txt redme.txt

5.把本地input文件上传到hadoop中的input文件

hdfs dfs -put ./input/ /input

6.上传是否成功可以查看一下

hdfs dfs -ls /input

三、编译java文件

7. 如果是新手的话,大概跟我一样还没修改好classpath变量,这里采用修改.bashrc文件的方式

(7.1)vim ~/.bashrc

(7.2)按上文中的java文件添加方法,在文件末尾添加:

(第一句应该都是用的这个java默认路径不用改,第二句粗体部分要注意修改成自己的版本号(不知道的就用hadoop version查询一下))

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CLASSPATH
export CLASSPATH=.:$HADOOP_HOME/share/hadoop/common/hadoop-common-2.6.5.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.6.5.jar:$HADOOP_HOME/share/hadoop/common/lib/commons-cli-1.2.jar:$CLASSPATH

(7.3)同样vim保存并退出

(7.4)注意这里需要source ~/.bashrc才能生效

8.打开wordcount文件夹,用javac指令编译(粗体部分记得改安装目录和版本号)

cd wordcount

javac -classpath /usr/local/hadoop/share/hadoop/common/hadoop-common-2.6.5.jar:/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.6.5.jar:/usr/local/hadoop/share/hadoop/common/lib/commons-cli-1.2.jar -d classes/ src/*.java

这里的符号解释一下:

  • -classpath,设置源代码里使用的各种类库所在的路径,多个路径用":"隔开。
  • -d,设置编译后的 class 文件保存的路径。
  • src/*.java,待编译的源文件。

这一步要是报错哪个哪个packet不存在,一定是上一步的路径没改好。

9.将编译好的 class 文件打包成 Jar 包

在打开了wordcount文件夹的状态下,输入:

jar -cvf wordcount.jar classes

打包结果是 wordcount.jar 文件,放在当前目录下。

四、运行

在打开了wordcount文件夹的状态下,输入:

hadoop jar wordcount.jar com.lisong.hadoop.WordCount /input /output

解释一下这句:hadoop+jar+jar文件名+jar中的路径+hadoop中的input路径+hadoop中的output路径

五、查看结果

结果存在了/output/part-r-00000中:

hdfs dfs -cat /output/part-r-00000

感觉网上很多教程乱乱的,所以自己写一个,大体上应该没啥问题,有问题请留言。

猜你喜欢

转载自blog.csdn.net/lilililililydia/article/details/88795004