hadoop 2.2.0 错误收集

声明:个人自学,不足之处请指出,不喜勿喷!!!

安装错误

Hadoop on OSX “Unable to load realm info from SCDynamicStore”

Hadoop error:  “Unable to load realm info from SCDynamicStore”  on mac

解决方法:

A. 在$HADOOP_HOME/etc/hadoop/hadoop-env.sh中添加如下:

export HADOOP_OPTS="-Djava.security.krb5.realm=OX.AC.UK -Djava.security.krb5.kdc=kdc0.ox.ac.uk:kdc1.ox.ac.uk"

B. 改变JDK的版本1.6 版本正常,1.7还是有此错误,1.8 mac版本的jdk暂时还没有出现


 此错误hadoop收录解决网址如下,英文好的童鞋可以自己看看英文原文:

Hadoop on OSX “Unable to load realm info from SCDynamicStore”

http://stackoverflow.com/questions/7134723/hadoop-on-osx-unable-to-load-realm-info-from-scdynamicstore


WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

解决方法:(linux,mac)

直接到百度网盘中下载编译好的native文件:

linux,mac hadoop2.2.0 native 文件   这儿感谢http://www.micmiu.com/ 网址的作者做出的贡献

如果想自己编译hadoop项目,那么请移步http://www.micmiu.com/


开发错误:

错误描述: 自定义Key类型时,报EOFException

错误1:

public void write(DataOutput out) throws IOException {
	out.write(ip.getBytes());
	out.write(count);
}

 以上错误解析:

DataOutput对于8种基本类型的写出都提供了对应的写出方法,write()只能写出一个byte,或者一个byte数组,如果是一个int,调用了write() 那么写出的只是该int值的高8位,那么在readFields()中
使用in.read() 实际上只读取了一个byte,那么不满足一个int 4个byte,所有报EOFException

错误2:

    自定义mapper 输出类型

public static class IPCountPair implements WritableComparable<IPCountPair>{
		
		private String ip=null;
		private int count=0;
		public void set(String ip,int count){
			this.ip=ip;
			this.count=count;
		}
		public void write(DataOutput out) throws IOException {
			out.write(ip.getBytes());
			out.writeInt(count);
		}

		public void readFields(DataInput in) throws IOException {
			ip=in.readLine();//    look
			count=in.readInt();
		}

		public int compareTo(IPCountPair o) {
			if(this.count!=o.count){
				return this.count-o.count;
			}else{
				return this.ip.compareTo(o.ip);
			}
		}
		public String getIp() {
			return ip;
		}
		public void setIp(String ip) {
			this.ip = ip;
		}
		public int getCount() {
			return count;
		}
		public void setCount(int count) {
			this.count = count;
		}
		
	}


 因为自定义类型中有字符串和int,那么readFields()中读取字符串必须使用readLine() ,这儿需要我们在mapper中得map()中做处理:

	@Override
		protected void map(Object key, Text value,
											Context context)
				throws IOException, InterruptedException {
			StringTokenizer token=new StringTokenizer(value.toString());
			if(token.hasMoreTokens()){
				ip=token.nextToken()+"\n";// look    在字符串上加上一个回车,方便readFields()使用readLine()读取字符串
				System.out.println("ip:"+ip);
				if(token.hasMoreTokens()){
					count=Integer.parseInt(token.nextToken());
					System.out.println("count:"+count);
				}
				mapKey.set(ip, count);
				mapValue.set(count);
				context.write(mapKey, mapValue);
			}
		}


你可能感兴趣的:(EOFException,hadoop2.x)