如何用hadoop运行第一个程序(纯新手教程) |
您所在的位置:网站首页 › 怎么用代码编写程序 › 如何用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 { 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 { 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 wordcountjavac -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
感觉网上很多教程乱乱的,所以自己写一个,大体上应该没啥问题,有问题请留言。
|
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |