Home >Database >Mysql Tutorial >myeclipse运行mapreduce报错:Cannot run program "cygpath

myeclipse运行mapreduce报错:Cannot run program "cygpath

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-07 15:30:351267browse

直接上代码:Mapper package com.winksi.dotstat;import java.io.IOException;import org.apache.hadoop.io.Text;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.mapreduce.Mapper;public class DotProducedMapper extends MapperLongW

直接上代码:Mapper

package com.winksi.dotstat;
import java.io.IOException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.mapreduce.Mapper;

public class DotProducedMapper extends  Mapper<longwritable text>{
	@Override
	public void map(LongWritable key, Text value, Context context) 
			throws IOException, InterruptedException{
		String line = value.toString();
		String fileds[] = line.split(",");
		String imsi = fileds[0];
		String adccompany = fileds[1];
		String phone = fileds[2];
		String cur_time = fileds[3];
		String call_length = fileds[4];
		String call_type = fileds[5];
		String show_length = fileds[6];
		String pkgname = fileds[7];
		String ip = fileds[8];
		String model = fileds[9];
		String ossdk = fileds[10];
		String av = fileds[11];
		String cityId = fileds[12];
		StringBuffer strKey = new StringBuffer();
		strKey.append(model).append(",").append(adccompany).append(",")
		.append(ossdk.toUpperCase()).append(",").append(av).append(",")
		.append(phone);
		context.write(new Text(strKey.toString()), new Text(imsi));
	}
}

</longwritable>
Reducer:
package com.winksi.dotstat;

import java.io.IOException;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class DotProducedReducer extends Reducer<text text>{
	 public void reduce(Text key, Iterator<text> values,
			 Context context)
		throws IOException, InterruptedException  {
		int count = 0;
		Set<string> set = new HashSet<string>();
		while (values.hasNext()) {
			set.add(values.next().toString());
            count++;
        }
		StringBuffer sb = new StringBuffer();
		sb.append(count).append(",").append(set.size());
		Date yesterdayDate = new Date(new Date().getTime() - 1*24*60*60*1000);
		String yesterday = DotStatPvUv.getCurrentDay(yesterdayDate);
		StringBuffer sbKey = new StringBuffer();
		sbKey.append(key.toString()).append(",").append(yesterday);
		context.write(new Text(sbKey.toString()), new Text(sb.toString()));
	}
}

</string></string></text></text>
Spring配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/hadoop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
	http://www.springframework.org/schema/hadoop http://www.springframework.org/schema/hadoop/spring-hadoop.xsd">
	<property-placeholder location="classpath:config.properties"></property-placeholder>
	<configuration>
	  fs.default.name=${hd.fs}
	</configuration>

	<job id="dotProductJob" input-path="${input.path}" output-path="${output.path}" mapper="com.winksi.dotstat.DotProducedMapper" reducer="com.winksi.dotstat.DotProducedReducer"></job>
 
	<job-runner id="runner" run-at-startup="true" job-ref="dotProductJob"></job-runner>	
</beans>
maven的jar包pom.xml
		<dependency>
			<groupid>org.springframework.data</groupid>
			<artifactid>spring-data-hadoop</artifactid>
			<version>1.0.2.RELEASE-cdh4</version>
		</dependency>

		<dependency>
			<groupid>org.apache.hadoop</groupid>
			<artifactid>hadoop-core</artifactid>
			<version>${hadoop.core.version}</version>
		</dependency>
java代码:

public class Test {
    public static void main(String[] args) {
         ApplicationContext ctx = new ClassPathXmlApplicationContext("hadoop-mr.xml");
    }
}

运行报错:

Exception in thread "main" java.io.IOException: Cannot run program "cygpath": CreateProcess error=2<span>, ?????μ???
 at java.lang.ProcessBuilder.start(ProcessBuilder.java:</span>459<span>)
 at org.apache.hadoop.util.Shell.runCommand(Shell.java:</span>201<span>)
 at org.apache.hadoop.util.Shell.run(Shell.java:</span>183<span>)
 at org.apache.hadoop.fs.FileUtil$CygPathCommand.</span><init>(FileUtil.java:413<span>)
 at org.apache.hadoop.fs.FileUtil.makeShellPath(FileUtil.java:</span>439<span>)
 at org.apache.hadoop.fs.FileUtil.makeShellPath(FileUtil.java:</span>466<span>)
 at org.apache.hadoop.fs.RawLocalFileSystem.execCommand(RawLocalFileSystem.java:</span>559<span>)
 at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:</span>551<span>)
 at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:</span>355<span>)
 at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:</span>212)</init>
原因是尽管连接的hadoop平台是在linux上面,但是我们的eclipse调试环境是在windows,我们需要安装一个linux模拟器“cygwin”来支持程序的运行。

在windows开发服务器上安装好cygwin,然后在环境变量中添加cygwin的bin目录,比如“D:\Program\cygwin\bin”,问题得以解决。

注意是在系统环境变量的Path上加入“D:\Program\cygwin\bin”这样我们就行像在linux上运行命令一样在windows的dos窗口下执行ls,cd等命令。

刚开始我一直是在系统环境变量下的classpath上加的D:\Program\cygwin\bin”,尝试了半天都是失败,后来才发现,是加错了地方。加完之后再cmd窗口中试一下ls,cd等命令。成功后重启myeclipse运行代码,就没有问题了。

------------------------------------------------------------------------------

之前纠结集成的Mapper和Reducer的问题,有两个文件可以继承,具体问题见:

http://wuyanzan60688.blog.163.com/blog/static/127776163201310164244955/

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn