最近因实习需要开始摆弄起了hadoop和spark相关的,记录一下我踩过的坑。由于linux下不好调试程序,因此记录一下用windows下的eclipse调试MapReduce程序。
环境:虚拟机VMware搭建的Ubuntu16.0.4集群,一个master,两个slaves
windows环境:64位,eclipse版本:Oxygen JAVA SE
准备环境:三台集群都搭好,其上能跑hadoop程序,这些我都已经自己试过了,通过在windows下写好的MapReduce程序能够打成jar包发送到集群上去跑。windows下也需要准备hadoop包,eclipse连接hadoop的插件,我这里用的是2.7.3版本的插件+2.6.5版本的hadoop包,由于windows环境的和linux环境不一样,因此hadoop包必须是经过处理的。有博客说这个步骤与运行环境无关,只是在新建工程的时候能将hadoop根目录和lib目录下的所有jar包自动导入。但是我试过还是要处理一下才行。
我这里用的插件是这个,1、将这个插件放入eclipse安装目录下的plugins插件中,重启eclipse。
2、此时打开eclipse,在window-->prefrences下可以发现多了一个Hadoop Map/reduce
下一步需要配置hadoop的安装目录,并将hadoop加入到环境变量中去。查了很多资料说是要把winutils.exe、hadoop.dll这两个文件文件复制到hadoop/bin目录下,将lib文件中的native库替换为windows版本库,新建系统环境变量 HADOOP_HOME Path。这里我找了很久才找到,想要这个hadoop包可以留言
插件的话可以百度下载。
3、在这里选择other,找到MapReduce tools ,将其显示出来
此时在如下这两个地方都会显示:
在这个空白的地方选择右键新建hadoop location
配置好相关的,其中location name可以自己随意,起个名字而已,下面的map/reduce master 要对应配置文件里的mapred-site.xml中mapred.job.tracker的端口一致,我这里是默认的,默认是50020,DFS master与Hadoop配置文件core-site.xml中fs.default.name的端口号一致,我这里是9000.
配置好之后可以新建new -->other,选择MapReduce程序,这样就能自动把需要的jar包都导进来,这个需要在第一步中配置好hadoop的位置才会自动导入jar包,导入的包如下图所示
如果顺利的话,在这个DFS Locations中可以显示HDFS文件系统中的文件。
!!注意, 必须启动集群,并且启动dfs和yarn才能显示出文件系统下的文件
折腾了半天,终于连接上hdfs了。。。这还只是第一步,后面编码的时候还是会遇上坑的。
把碰到的问题总结一下:
1、在连接hadoop时一直连接不上,查看error log出现了call from user-XXX/162.XX.XX.XX to master2:9000failed on connection exception,出现这个问题的原因一般是路径没配置好,默认的DFS端口号是8020,如果没有做改动的话就是8020,注意你程序里的出现的端口号也要和这个匹配。可以尝试设置绝对路径,这样一般不会出错。
2、在配置好路径之后,写好JobRun、Mapper、Reducer,提交任务可能出现的问题,见1
3、第二个错误:(null)entry in command string:null chmod 0700 这个问题一般来说是权限问题,有的博客说有两种解决方法,一种是在程序中指定hadoop.home.dir System.setProperty("hadoop.home.dir","hadoop的文件路径" );这种方法我试过,反正没有成功。
,第二种方法参见https://ask.hellobi.com/blog/jack/5063
4、之后又出现在eclipse上传文件到dfs中内容为空的情况,这是因为我多次格式化了namenode,导致datanode没有启动成功,只要将temp下的tmp文件夹以及dfs下的data、name文件夹清空,等了一会。然后重新格式化了两遍,然后启动集群就能了。