刘勇 Email: lyssym@sina.com
本博客记录作者在工作与研究中所经历的点滴,一方面给自己的工作与生活留下印记,另一方面若是能对大家有所帮助,则幸甚至哉矣!
简介
鉴于最近在研究Hadoop编程时,为考虑编程的方便,在Windows本地编译源程序,然后直接访问Hadoop集群,这样给广大编程人员提供了极大的便利。在这个过程中积累了一些实际经验,并针对在该过程中(初级阶段)可能会遇到的问题,提供一些解决方案,希望对大家有所帮助。
环境介绍
Hadoop 集群:hadoop 2.7.1, Cent OS 6.5,jdk 1.7
eclipse 环境:Windows 7, eclipse LUNA,jdk 1.8
环境搭建
1) 安装eclipse hadoop 插件
从网络上下载与hadoop 版本相同的插件,如hadoop-eclipse-plugin-2.7.1.jar, 并将其拷贝至eclipse 安装目录中plugins,如D:/Program/eclipse/plugins,然后重启eclipse。
2) 配置mapreduce插件
Windows—>Preference—>Hadoop Map/Reduce,本文配置Hadoop处理目录在D:/hadoop。需要指出,该目录指出后续编译源程序所需的相关jar包以及所需的库文件(Windows编译所需)。
3) 切换视角
Windows—>Open Perspective—>Other。
4) 配置Map/Reduce Locations
该部分配置在Windows下访问hadoop 集群的位置及相关信息。点击Map/Reduce Locations—>New Hadoop Locations—>General。参数配置过程中,需要关心红色方框中的Host 与Port,必须与Hadoop集群中Master与DFS配置保持一致。至于User name一般建议采用hadoop 集群安装的用户名hadoop,并在Windows用户与组中将administrator修改为hadoop能省掉很多不必要的麻烦。本文采用Windows下用户名root,后续将针对问题介绍(见FAQ 5)。
Map/Reduce Locations—>New Hadoop Locations—>Advanced parameters。配置过程中,只需关心红色方框中hadoop.tmp.dir 必须与hadoop集群core-site.xml配置一致。至此,eclipse Hadoop 插件已安装完毕。
5) 测试与验证
在工程导航栏,展开DFS Locations,若能看到用户通过hadoop fs 操作命令在hadoop集群上对文件做出的操作,则该插件安装完成。
编程异常与解决方案
经本文作者在编程过程中实际经验,写好的程序在hadoop 集群下(Linux环境中集群本地)能够访问,但是为编程的方便,将其编写于Windows下时可能会出现问题,下面结合作者的实际经验,给出相应解决方案。
1) FAQ:java.lang.NullPointerException
出现该异常是因为,在Windows下编译时会有hdfs临时文件存在,因此造成无法辨识该文件系统类型。
解决方案:从网络上下载与hadoop 版本号相同的hadoop.lib、winutils.exe等文件,并将其拷贝至hadoop 目录bin,如D:/hadoop/bin,以及Windows系统中,如C:/Windows/System32,同时需要注意下载的文件需要与CPU位数对应,即32位或64位。本文作者曾因CPU位数的问题折腾了许久。此外,本文作者给出一个最为保险的建议,采用Windows SDK将Hadoop 源码在Windows 本地编译一下,然后提取上述lib、exe文件,则该问题迎刃而解。
2) FAQ:java.lang.UnsatisfiedLinkError:
进一步分析,出现该异常是因为,在Windows中无合适的解析hdfs临时文件的问题,因此出现该情况,可能是hadoop.lib与hadoop集群版本不对,另一方面,可能是与CPU位数不一致。
解决方案:从网络上找到正确的版本文件,或者在本地重新编译hadoop 源码。
3) FAQ:org.apache.hadoop.mapreduce.lib.input.InvalidInputException
出现该异常是因为对hdfs文件系统目录的组织,不明确所致,若不指明hdfs,则以Windows下路径作为其默认路径名。
解决方案:在eclipse 工程目录栏中展开DFS Locations,逐级写出最终文件的位置,如test文件,则为hdfs://192.168.101.244:9000/user/input/test,需要加上hdfs://ip:port。
4) FAQ:java.lang.UnsupportedClassVersionError
出现该异常,则因为在Windows上编译的Hadoop程序与Hadoop集群上采用的JDK版本不一致。
解决方案:先查看Hadoop集群上jdk版本,然后在Windows上安装相同版本的即可。如本文Window上采用jdk 1.8,而hadoop 集群上采用jdk1.7,则在Windows上安装jdk 1.7,并对所需执行的工程,修改Build Path 和Compeler,并将其设为Java SE 1.7,之后重新编译即可。
5) FAQ:org.apache.hadoop.security.AccessControlException: Permission denied
程序运行后异常停止,无任何输出结果,出现该异常,则因为在本地访问hadoop hdfs时没有权限,因此在权限部分拒绝访问而退出,如,本文的root没有配置权限访问hdfs,故而看不到数据结果,此外,很多用户不太喜欢默认的用户名hadoop, 因此设置权限显得比较重要。
解决方案:本文基于测试环境,为图简便,修改集群的core-site.xml,如下图所示,将hdfs文件系统的访问许可检查关闭。但是,在实际应用中,则根据应用场景进行设置。