因为大概花了一上午的时间琢磨(捂脸.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
(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{ IntWritable result = new IntWritable(); public void reduce(Text key, Iterable 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"); 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
这里的符号解释一下:
":"
隔开。这一步要是报错哪个哪个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
感觉网上很多教程乱乱的,所以自己写一个,大体上应该没啥问题,有问题请留言。