CentOS下用Eclipse和命令行方式编译运行WordCount程序

安装Eclipse

一、下载Eclipse软件

二、安装Eclipse软件

三、安装Eclipse插件 Hadoop-Eclipse-Plugin

四、配置 Hadoop-Eclipse-Plugin

WordCount程序

一、在eclipse中写个WordCount吧

1.建立项目

2.在项目里面建立WordCount类

3.写入代码

4.通过 Eclipse 运行 MapReduce

二、命令行运行WordCount:

1、添加一个环境变量

2、编译程序

3、把 .class 文件打包成 jar:​

4、试图运行jar文件

4.1如果报错了,就这样解决

5、创建几个输入文件

6、将本地的文件put到hdfs文件系统(注意上面运行jar包报错哪儿需要什么位置就建立在什么位置,这个由保存项目的位置有关)

7、运行jar文件,分析成功

7.1运行时可能报错的情况和解决方法

8、查看输出文件

附录:解决错误记录

1、安装完Hadoop之后,命令行输入hadoop却找不到命令的解决方法

2、出现以下异常:Permission denied: user=administrator, access=WRITE, inode="/":root:supergroup:drwxr-xr-x

3、报错Name node is in safe mode的解决方法

4、hadoop上传文件错误org.apache.hadoop.ipc.RemoteException(java.io.IOException)


  • 环境:

CentOS7;Hadoop2.7.6,伪分布式配置

备注:文章最后总结了本人在完成该实验遇到的错误,若在操作过程中遇到一些报错,可在最后查看。

  • 安装Eclipse

一、下载Eclipse软件

下载地址:http://www.eclipse.org/downloads/packages/release/Luna/SR2

下载与操作系统版本对应的Eclipse软件,比如操作系统是64位的,则Eclipse软件也必须是64位的,也就是需要下载:eclipse-jee-luna-SR2-linux-gtk-x86_64.tar.gz

二、安装Eclipse软件

  1. 将eclipse上传(安装了虚拟机工具之后可直接从真机中复制文件到虚拟机)到CentOs上去,我这里放到了/home/eclipse下。或者直接在虚拟机里面下载eclipse。
  2. 移动安装包到/opt目录中:mv /home/eclipse/eclipse-jee-luna-SR2-linux-gtk-x86_64.tar.gz  /opt
  3. 解压缩包:tar -zxvf eclipse-jee-luna-SR2-linux-gtk-x86_64.tar.gz
  4. 创建eclipse的快捷方式:
vim /usr/share/applications/eclipse.desktop

添加如下内容:

[Desktop Entry]
Type=Application
Name=eclipse
Exec=/opt/eclipse/eclipse
GenericName=eclipse
Comment=Java development tools
Icon=/opt/eclipse/icon.xpm
Categories=Application;Development;
Terminal=false

Exec根据eclipse解压具体位置而定;Icon为eclipse图标(如果有的话);Name为快捷键名称;
然后保存,打开 应用程序 》编程 就会发现eclipse的图标了。

三、安装Eclipse插件 Hadoop-Eclipse-Plugin

要在 Eclipse 上编译和运行 MapReduce 程序,需要安装 hadoop-eclipse-plugin,可下载 Github 上的 hadoop2x-eclipse-plugin(备用下载地址:http://pan.baidu.com/s/1i4ikIoP)。

下载后,将 release 中的 hadoop-eclipse-kepler-plugin-2.4.1.jar (还提供了 2.2.0 和2.6.0 版本)复制到 Eclipse 安装目录的 plugins 文件夹中,还是像上面复制eclipse到虚拟机里面一样,我是从到 /home/admin/usr/java 目录下复制到Eclipse 安装目录。(若遇到权限问题,请切换到root权限下操作)

cp hadoop-eclipse-kepler-plugin-2.4.1.jar  /opt/eclipse/plugins/

运行 eclipse -clean 重启 Eclipse 即可(添加插件后只需要运行一次该命令,以后按照正常方式启动就行了)。

/opt/eclipse/eclipse -clean    # 添加插件后需要用这种方式使插件生效

四、配置 Hadoop-Eclipse-Plugin

在继续配置前请确保已经开启了 Hadoop

启动 Eclipse 后就可以在左侧的Project Explorer中看到 DFS Locations(若看到的是 welcome 界面,点击左上角的 x 关闭就可以看到了。)

安装好Hadoop-Eclipse-Plugin插件后的效果

配置过程:

1.打开Preference

2.选择 Hadoop 的安装目录(如果没有出现1,可能是插件版本不对。看下eclipse版本再确定用什么版本的插件)然后确定

3.切换 Map/Reduce 开发视图,选择 Window 菜单下选择 Open Perspective ,弹出一个窗体,从中选择 Map/Reduce 选项即可进行切换。

4.建立与 Hadoop 集群的连接,点击 Eclipse软件右下角的 Map/Reduce Locations 面板,在面板中单击右键,选择 New Hadoop Location

在弹出来的 General 选项面板中,General 的设置要与 Hadoop 的配置一致。一般两个 Host 值是一样的,如果是伪分布式,填写 localhost 即可,另外我使用的Hadoop伪分布式配置,设置 fs.defaultFS hdfs://localhost:9000,则 DFS Master Port 要改为 9000Map/Reduce(V2) Master Port 用默认的即可,Location Name 随意填写。

Advanced parameters 选项面板是对 Hadoop 参数进行配置,实际上就是填写 Hadoop 的配置项(/usr/local/hadoop/etc/hadoop中的配置文件),如我配置了 hadoop.tmp.dir ,就要进行相应的修改。但修改起来会比较繁琐,我们可以通过复制配置文件的方式解决。总之,我们只要配置 General 就行了,点击 finish,Map/Reduce Location 就创建好了。

一般情况格式化后文件系统里面是空的,右键点击可以上传、下载、删除 HDFS 中的文件,双击可以查看内容,无需再通过繁琐的 hdfs dfs -ls 等命令进行操作了。


  • WordCount程序

一、在eclipse中写个WordCount吧

1.建立项目

2.在项目里面建立WordCount类

3.写入代码

import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;

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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
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 <in> [<in>...] <out>");
			System.exit(2);
		}
		Job job = Job.getInstance(conf, "word count");  // 实例化job,传入参数,job的名字叫 word count
		job.setJarByClass(WordCount.class);  //使用反射机制,加载程序
		job.setMapperClass(TokenizerMapper.class);  //设置job的map阶段的执行类
		job.setCombinerClass(IntSumReducer.class);  //设置job的combine阶段的执行类
		job.setReducerClass(IntSumReducer.class);  //设置job的reduce阶段的执行类
		job.setOutputKeyClass(Text.class);  //设置程序的输出的key值的类型
		job.setOutputValueClass(IntWritable.class);  //设置程序的输出的value值的类型
		for (int i = 0; i < otherArgs.length - 1; ++i) {
			FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
		}  //获取我们给定的参数中,输入文件所在路径
		FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length - 1]));  //获取我们给定的参数中,输出文件所在路径
		System.exit(job.waitForCompletion(true) ? 0 : 1);  //等待任务完成,任务完成之后退出程序
	}
			
		//reduce function
		public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
		    public IntSumReducer() {}
		    private IntWritable result = new IntWritable();
		    
		    public void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
		        int sum = 0;
		
		        IntWritable val;
		        for(Iterator i$ = values.iterator(); i$.hasNext(); sum += val.get()) {
		            val = (IntWritable)i$.next();
		        }
		
		        this.result.set(sum);
		        context.write(key, this.result);
		    }
		}
			
		//Mapper function
		public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
		    public TokenizerMapper() {}
		    private static final IntWritable one = new IntWritable(1);
		    private Text word = new Text();
		
		    public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
		    	//splite words
		        StringTokenizer itr = new StringTokenizer(value.toString());
		
		        // 
		        while(itr.hasMoreTokens()) {
		            this.word.set(itr.nextToken());
		            context.write(this.word, one);
		        }
		
		    }
		}
}

4.通过 Eclipse 运行 MapReduce

从/opt/hadoop/etc/hadoop 中将有修改过的配置文件 core-site.xml hdfs-site.xml log4j.properties 复制到 WordCount 项目下的 src 文件夹

找到文件后复制过去,复制完成后,务必右键点击 WordCount 选择 refresh 进行刷新,可以看到文件结构如下所示:

点击工具栏中的 Run 图标,或者右键点击 Project Explorer 中的 WordCount.java,选择 Run As -> Run on Hadoop,就可以运行 MapReduce 程序了。不过由于没有指定参数,运行时会提示 “Usage: wordcount “,需要通过Eclipse设定一下运行参数

右键点击刚创建的 WordCount.java,选择 Run As -> Run Configurations,在此处可以设置运行时的相关参数(如果 Java Application 下面没有 WordCount,那么需要先双击 Java Application)。切换到 “Arguments” 栏,在 Program arguments 处填写input output就可以了。

报了个错,本人感觉是这个原因报的错

建立input,看报错哪儿是没找到哪个文件夹就建立什么。我这种情况是挨着先建立user目录,再在user下再建admin,再在admin下再建立input:(注意:项目保存位置不同,这儿会有所不同)

建好了这样的

运行一下,OK,完美解决!

(因为input目录下是空的,所以输出文件内容也会是空的,这儿就查看输出文件内容了。如果需要分析什么内容,把分析的文本文件放input里面就可以了)

 


二、命令行运行WordCount:

1、添加一个环境变量

我们将 Hadoop classhpath 信息添加到 CLASSPATH 变量中,在 ~/.bashrc 中增加如下几行:

修改~/.bashrc输入:vim ~/.bashrc

export HADOOP_HOME=/opt/hadoop-2.7.6 #不同环境变量,这儿写法不同,可以输入echo $HADOOP_HOME查看
export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH

接着执行source ~/.bashrc 使变量生效,接着就可以通过 javac 命令编译 WordCount.java

2、编译程序

(注意:不同保存位置,这儿会有所不同)

av

3、把 .class 文件打包成 jar

4、试图运行jar文件

报错的原因可能有一下情况:

1、使用的在默认包中的类,也就该类是没有用包管理。(这种情况有些时候不得报错有些时候得换个方法解决。我这儿换一种方式解决,用包管理的方式解决了)

2、使用了包管理的情况下,需要写全类名

4.1如果报错了,就这样解决

使用包管理的方式:为了方便起见,就在eclipse中建包然后把上面那个文件复制过来,不然命令行操作麻烦得很。

编译打包过程

运行jar包

OK,可以看到没有报下面的错误了

5、创建几个输入文件

6、将本地的文件put到hdfs文件系统(注意上面运行jar包报错哪儿需要什么位置就建立在什么位置,这个由保存项目的位置有关

7、运行jar文件,分析成功

7.1运行时可能报错的情况和解决方法

对这个报错原因感兴趣的课可以看下这个:https://blog.csdn.net/weiyongle1996/article/details/74094989/   

解决步骤:(注意:该步骤只是伪分布式的情况,其他配置请看上面链接)

然后重新将文件上传到hdfs文件系统上然后分析。

8、查看输出文件

验证到和预期结果一致!over

 

附录:解决错误记录

1、安装完Hadoop之后,命令行输入hadoop却找不到命令的解决方法

大多数原因是没有配置环境变量。解决方法:

1. cd /etc/profile

2. 把这三条加到proflie文件的最后

export JAVA_HOME=XXXX(在安装了jdk的前提下,echo $JAVA_HOME可以查看得到)

export HADOOP_HOME=XXX(hadoop的安装路径)

export PATH=.:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH

3.完成后保存文件, 更新环境变量

 source /etc/profile

 

2、出现以下异常:Permission denied: user=administrator, access=WRITE, inode="/":root:supergroup:drwxr-xr-x

解决方法:hadoop 的hdfs-site文件中添加以下内容,关闭权限检查 ,解决了上述问题。

<property>

        <name>dfs.permissions</name>

        <value>false</value>

 </property>

3、报错Name node is in safe mode的解决方法

这是因为在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。

可以通过以下命令来手动离开安全模式:

bin/hadoop dfsadmin -safemode leave


4、hadoop上传文件错误org.apache.hadoop.ipc.RemoteException(java.io.IOException)

参考:https://blog.csdn.net/weiyongle1996/article/details/74094989/ 

 

本次实验是在一些实验指导和相关技术博客之上完成的,感谢那些资源分享者。

如果遇到操作过程中某些地方本人理解不到位或者有更简便的方法完成,欢迎各位大佬批评指出噢!

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值