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

您所在的位置:网站首页 怎么用代码编写程序 如何用hadoop运行第一个程序(纯新手教程)

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

2024-07-09 10:45| 来源: 网络整理| 查看: 265

因为大概花了一上午的时间琢磨(捂脸.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 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

 

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

 

 

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3