Windows环境下Hadoop开发环境配置

Windows环境下Hadoop开发环境配置

一、 事先准备
1) Hadoop集群环境搭建
已经用三台虚拟机(操作系统为ubuntu 10.0.4)搭建完成一个hadoop分布式集群,分别是hadoop1: 192.168.201.104,hadoop2: 192.168.201.54和hadoop3: 192.168.201.100 ,其中hadoop1为namenode,其余为datanode。

2) windows安装JDK和eclipse
过程从略,需要注意应安装与hadoop集群所用JDK兼容的版本。本例中,hadoop集群安装的是64位的JDK-8.0.20,因此Windows下选择64位的JDK-8.0.65,eclipse版本为支持64位的Kepler Service Release 2。

3) hadoop安装包解压
将搭建hadoop集群的安装包拷贝并解压到windows开发机器的某个目录下,本例中的安装包为hadoop-2.6.1.tar.gz,解压到D:\hadoop-2.6.1目录。

4) hadoop for eclipse插件包下载
下载hadoop for eclipse插件。由于本例中hadoop集群为hadoop2,插件也必须是2.x版本。本例中插件包为:hadoop-eclipse-plugin-2.2.0。

二、 配置eclipse
1) 拷贝插件包
将插件包拷贝至eclipse安装目录的plugin目录下,然后重启eclipse。

2) 配置hadoop安装路径
打开"Window"--"Prefrences",此时左侧会出现"Hadoop Map/Reduce"选项,将其配置为hadoop安装包解压后的目录。

Windows环境下Hadoop开发环境配置
 
3) 配置Map/Reduce Locations
打开"Window"--"Perspectives"--"Open Perspective"--"Other ...",在弹出窗口中选择"Map/Reduce",点击"OK"。
此时在下部中间的框内会有个"Map/Reduce Locations"的图标,点击上部右侧的小象图标,进入Map/Reduce Locations配置窗口:Windows环境下Hadoop开发环境配置
其中的Location name可以填写任意名称,而Map/Reduce(V2) Master的Host、Port与hadoop集群的mapred-site.xml配置文件中的mapred.job.tracker一致,而DFS Master的Host、Port与hadoop集群的core-site.xml配置文件中的fs.defaultFS(或fs.default.name)一致。 点击"Finish"按钮,关闭窗口。此时如果左侧"Project Explorer"框中的"DFS Locations"下出现刚才填写的Location name且其下没有出现"Error ...",表示配置成功。

三、 工程配置

1) 设置环境变量
在windows桌面,右键击"我的电脑",再依次"属性"--"高级系统设置"--"环境变量",增加新的环境变量HADOOP-HOME,其值与步骤2.2一致。设置完成后,重启eclipse。
如果忽略此步骤,将来会报“Failed to detect a valid hadoop home directory”错误

2) 拷贝winutils.exe和hadoop.dll

在网上下载winutils.exe和hadoop.dll,将前者拷贝到hadoop安装目录的bin子目录,将后者拷贝至C:\Windows\System32目录***意32位和64位的区别。
如果忽略winutils.exe,将来会报“Could not locate executable null\bin\winutils.exe in the Hadoop binaries”的错误;忽略hadoop.dll,将来会报“java.lang.UnsatisfiedLinkError: org. apache.hadoop.io.nativeio.NativeIO$Windows.access0……”的错误。

3) 新建Hadoop工程
打开"File"--"New"--"Project",选择"Map/Reduce Project",输入工程名。如果是第一次新建"Map/Reduce Project",需要点击"Use Default Hadoop"--"Configure Hadoop Install directory"(与步骤2.2一致)或 干脆"Specify Hadoop library location"。
然后一步步"Next",直至 "Finish"。

Windows环境下Hadoop开发环境配置

4) 导入 lib包
一般情况下不需要手工执行,创建工程后各jar包已自动加至build path。如果需要手工添加,相应jar包有:
D:/hadoop-2.6.1/share/hadoop/common下所有jar包,及里面的lib目录下所有jar包,

D:/hadoop-2.6.1/share/hadoop/hdfs下所有jar包,及里面lib下的jar包,
D:/hadoop-2.6.1/share/hadoop/mapreduce下所有jar包,及里面lib下的jar包,

D:/hadoop-2.6.1/share/hadoop/yarn下所有jar包,及里面lib下的jar包。

5) 生成log4j.properties文件
在工程的src目录下创建一个log4j.properties文件,可以直接从其它工程里或系统包(如Hibernate)里拷贝,否则可能将来无法显示日志信息。
如果电脑上安装了多个JDK(包括Websphere、Oracle等软件自带的JDK),需指定项目的编译环境,否则将来可能会报“java.lang.UnsupportedClassVersionError: JVMCFRE003 bad major version; class=map/CareMonths, offset=6”的类似错误。

方法是:在设置项目的Build Path时,指定步骤1.2中的JDK。

6) 修改集群配置文件的dfs.permission配置项
此步骤需要在hadoop集群上操作。修改hdfs-site.xml配置文件,在其中增加或修改配置项dfs.permission:
  <property>
    <name>dfs.permission</name>    

   <value>false</value> 

 </property>

必须注意:此步骤尽量限制在开发测试环境中进行,在正式的生产环境中如此设置会带来严重安全问题。

7) 在eclipse中运行

右键点击项目,选择"Run AS ..."--"Run on Hadoop",从搜索到的列表中找到自己编写的应用程序,再点击Ok。
正常情况下,自此工程应该可以提交到hadoop集群去执行,但实际上也可能不成功。此时的一个变通方法是修改hadoop的源代码。下载Hadoop 2.6.1的源码包并解压到本地,将其中的hadoop-common-project\hadoop-common\src\main\java\org\apache\hadoop\io\ nativeio\nativeIO.java复制到工程中(包名为org.apache.hadoop.io.nativeio),修改其中的Windows.access方法,将原来557行的代码注释掉,改为return true。

Windows环境下Hadoop开发环境配置

如忽略此步骤,会报告“ava.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio. NativeIO$Windows.access0……”的错误(同步骤3.2中缺少hadoop.dll的情形一样)。

四、 在集群中执行

上述步骤可以实现将一个作业提交到hadoop集群执行,但一般只能用小规模数据进行测试,用于查找作业执行过程中暴露出的问题。

但最终作业还是应以jar包形式在hadoop集群执行,有两种方式:

1) 方式一
用eclipse导出jar包,上传到hadoop集群平台后执行: hadoop jar XXX.jar YYY
其中的第三个参数为上传的jar包名称,而第四个参数为带有main方法的class名,通常XXX与YYY相同。
调试时,java文件可能经常修改,此方式会显得很费时。但在生产环境中,此方式是最适用的。

2) 方式二
将java文件上传到hadoop集群,先进行编译(事先创建classes子目录):
javac -classpath $HADOOP_HOME/share/hadoop/common/hadoop-common-2.6.1.jar: $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.6.1.jar: $HADOOP_HOME /share/hadoop/common/lib/commons-cli-1.2.jar -d ./classes XXX.java
然后将所有class文件组装成jar包:
$JAVA_HOME/bin/jar -cvf  XXX.jar -C ./classes/ . 最后是执行,与方式一相同: hadoop jar XXX.jar YYY
此方式在调试时相对更适用。