大致流程
一:启动Hadoop集群
二.编写mapreduce程序代码
三:将写好的java代码打包jar
四:将jar上传至服务器,即Hadoop集群中
五:运行jar程序
hadoop jar Word.jar hdfs://hadoop01:9000/word.txt output
命令:hadoop jar jar包名 输入文件名 输出目录
详细步骤
前期准备工作
xshell分别远程连接三台虚拟机hadoop01,hadoop02,hadoop03
进入hadoop01主机,cd进入bin目录,使用bash脚本启动Hadoop集群
命令:cluster start
使用写好的脚本xcall jps查看启动好的集群情况
命令:xcall jps
查看namenode的web页面并查看hdfs上的文件系统
IP地址或主机:端口号
hadoop01:50070或192.168.226.101:50070
查看yarn资源调度器的web页面
同上,除端口号外都一致
hadoop01:8088
进入code目录,新建一个txt文件
这里我新建的是wordcount.txt,内容如下(code在家目录下)
在hdfs上新建一个目录input用于存放输入文件
这里的input创建在hdfs的用户主目录,绝对路径是/user/ghh,可以简写为空白或空格
比如,要查看用户主目录下的列表文件目录,可以用hdfs dfs -ls /user/ghh或hdfs dfs -ls
注:hdfs dfs命令等价与hadoop fs,即hdfs dfs -ls /user/ghh等价于hadoop fs -ls /user/ghh
之后再使用mkdir在hdfs中的主目录创建output目录,用来存放输出文件
到此,前期工作已经完成,现在开始第一个mapreduce任务—wordcount单词计数,即统计我的wordcount.txt文件中的单词出现的数目
进入 /usr/local/eclipse,打开eclipse,进行编写Java程序代码
注:前提安装了eclipse,这里已经安装好了
如果用xshell连接服务器(虚拟机),则需要安装Xmanager Power Suite才能打开,已安装好
运行之后会弹出选择代码的工作目录,之后点击launch
编写代码前需要导入代码所要用到的相关jar包,于是我们需要进行导入
进入代码编辑页面,依次点击project→properties
需要从相关配置文件目录下导入
在hadoop目录下的share/hadoop/mapreduce目录下的所有jar包
在hadoop目录下的share/hadoop/common目录下的common的jar包
在hadoop目录下的share/hadoop/common/lib目录下的所有jar包
具体所需的jar如下
具体要导入的jar包如下:
导入全部jar包后apply应用
完成导入jar包之后,就可以开始编写mapreduce代码了
代码如下:
package word; //导入相关jar包 import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; //Map class Map extends Mapper{ @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { //获取一行的内容 String line = value.toString(); //每一行的单词是以空格隔开的,所以使用空格切割成数组 String[] words = line.split(" "); for (String word:words ) { //输出到reduce context.write(new Text(word),new LongWritable(1)); } } } //Reduce class Reduce extends Reducer { @Override protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { long sum = 0; for (LongWritable value:values ) { sum = sum + value.get(); } //输出 context.write(key,new LongWritable(sum)); } } //main函数 public class WordCount{ public static void main(String[] args) throws Exception{ //获取job Configuration conf=new Configuration(); Job job=Job.getInstance(conf); //Job job=Job.getInstance(new Configuration()); //指定job使用的类 job.setJarByClass(WordCount.class); //设置mapper的类以及属性 job.setMapperClass(Map.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(LongWritable.class); //设置reducer的类以及属性 job.setReducerClass(Reduce.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(LongWritable.class); //设置输入文件 FileInputFormat.setInputPaths(job, new Path(args[0])); //设置输出目录 FileOutputFormat.setOutputPath(job, new Path(args[1])); //提交任务 job.waitForCompletion(true); } }
编写完代码将写好的代码无需运行,直接打包成jar
file→export
双击hadoop01,新开一个终端,因为当前终端正在运行eclipse程序
可以看到,我们写好的程序已经打包好了
现在开始运行
运行命令:
hadoop jar WordCount.jar word.WordCount input/wordcount.txt output/wordcount
hadoop jar jar包名 包名.主类名 输入文件 输出文件目录



