hadoop编程遇到的jvm问题为内存不够的解决办法

在ubuntu系统下开发hadoop程序时,遇到几个问题,小结如下。


问题:内存不足,报错:There is insufficient memory for the Java Runtime Environment to continue

解决方法如下:

1、使用进程查看命令:ps -e | grep java。

然后删除过多的java进程,释放出内存资源。这种方法治标。

打开系统的限制文件:vi  /etc/security/limits.conf,在文件最后添加:* - nofile 278528   保存(已经设置得够大了)

使用命令查看open files数值:vim /etc/security/limits.conf,看到open files.(这个方法没试成功,修改后查看open files 还是1024,也许需要重启系统。)

详见参考文章1.

还有说是因为java设置的最大可用内存,不够maven使用,所以出现警告(这种解释最靠谱)。

对应的解决办法是,设置/etc/profile文件中maven的opts:export MAVEN_OPTS="-Xms256m -Xmx512m"

2、测试mapreduce程序时,设置input,output文件位置如下代码。

3、输出文件output不能存在,程序自动删除output文件代码如下。

	public static void main(String[] args) throws Exception {
		Configuration conf = new Configuration();
		// String[] otherArgs = new GenericOptionsParser(conf,
		// args).getRemainingArgs();
		String[] otherArgs = new String[] { "input", "output" }; /* 直接设置输入参数 */
		if (otherArgs.length != 2) {
			System.err.println("Usage: wordcount <in>  <out>");
			System.exit(2);
		}

		/* 删除输出目录 */
		Path outputPath = new Path(otherArgs[1]);
		outputPath.getFileSystem(conf).delete(outputPath, true);
		
		Job job = Job.getInstance(conf, "word count");
		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]));	//输出在本地
//		FileOutputFormat.setOutputPath(job, new Path("output06"));		//输出为HDFS?
		System.exit(job.waitForCompletion(true) ? 0 : 1);
	}

4、运行程序,能够在本工程目录下,看到output文件夹。

文件夹下的文件即是程序运行后的结果,如下图。

hadoop编程遇到的jvm问题为内存不够的解决办法_第1张图片

5、运行通过后,即可将程序打成jar包。

将打包后的jar放在某个位置,假设名字为×××.jar。

调用./bin/hadoop jar ×××.jar WordCount input(HDFS input文件的位置) output(HDFS输出文件的位置)

运行即可的到结果。

6、用hadoop eclipse插件刷新后,查看运行结果。

也可以将结果文件通过hadoop文件下载到本地查看,或保存。


补充说明:

我的程序在本地运行很好。

可始终在hadoop eclipse插件上,看不到hdfs上文件的更新。

如何能使用hadoop eclipse插件,调试、运行源程序,同事在插件上查看到结果,后一篇文章再解决。


参考文章

1、http://www.linuxidc.com/Linux/2013-07/86954.htm

2、http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html(hadoop官方说明)

你可能感兴趣的:(java,hadoop)