一、准备工作
(1)Hadoop2.7.2 在linux部署完毕,成功启动dfs和yarn,通过jps查看,进程都存在
(2)安装maven
二、最终效果
在windows系统中,直接通过Run as Java Application运行wordcount,而不需要先打包成jar包,然后在linux终端运行
三,操作步骤
1、启动dfs和yarn
终端:${HADOOP_HOME}/sbin/start-dfs.sh
${HADOOP_HOME}/sbin/start-yarn.sh
通过在namenode节点上jps查看显示:
4852 NameNode
5364 ResourceManager
5141 SecondaryNameNode
10335 Jps
在datanode节点上使用jps查看显示:
10369 Jps
4852 NameNode
5364 ResourceManager
5141 SecondaryNameNode
2、Eclipse基础配置
(1)将hadoop-eclipse-plugin-2.7.2.jar插件下载,放在Eclipse的目录下的plugins目录下,启动Eclipse,然后点击查看Hadoop插件是否生效,点击windows——>preferences,如下图1
(2)将hadoop-2.7.2的解压包添加到2所示的目录,点击OK
3、Eclipse创建maven工程
(1)创建过程省略
(2)添加dependency,POM.xml中的依赖项如下:
hadoop-common
hadoop-hdfs
hadoop-mapreduce-client-core
hadoop-mapreduce-client-common
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>2.7.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-common --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-common</artifactId> <version>2.7.2</version> </dependency>
(3)此时可能会卡顿一段时间,Build workpath如果特别慢的话,请参考我前不久的一篇解决方法,等到maven中的依赖包下载install完毕即可
4、编写mapreduce中的wordcount代码
代码此处不在累述,,简单代码架构(红色框的那个包)和内容如下:
WCMapper类:
package cn.edu.nupt.hadoop.mr.wordcount; import java.io.IOException; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; // 4个泛型中,前两个是指定的mapper输入数据的类型 //map 和 reduce 的数据输入输出是以key-value的形式封装的 //默认情况下,框架传递给我们的mapper的输入数据中,key是要处理的文本中一行的其实偏移量,这一行的内容作为value // JDK 中long string等使用jdk自带的序列化机制,序列化之后会携带很多附加信息,造成网络传输冗余, // 所以Hadoop自己封装了一些序列化机制 public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable>{ // mapreduce框架每读一行就调用一次该方法 @Override protected void map(LongWritable key, Text value,Context context) throws IOException, InterruptedException { //具体的业务写在这个方法中,而且我们业务要处理的数据已经被该框架传递进来 // key是这一行的其实偏移量,value是文本内容 String line = value.toString(); String[] words = StringUtils.split(line, " "); for(String word : words){ context.write(new Text(word), new LongWritable(1)); } } }