Windows环境下Hadoop开发环境配置
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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安装包解压后的目录。
3)配置Map/Reduce Locations
打开"Window"--"Perspectives"--"Open Perspective"--"Other ...",在弹出窗口中选择"Map/Reduce",点击"OK"。
此时在下部中间的框内会有个"Map/Reduce Locations"的图标,点击上部右侧的小象图标,进入Map/Reduce Locations配置窗口:
其中的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(或)一致。
点击"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,将来会报“ng.UnsatisfiedLinkError: org. apache.hadoop.io.nativeio.NativeIO$Window s.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"。
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),需指定项目的编译环境,否则将来可能会报“ng.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。
如忽略此步骤,会报告“ng.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
此方式在调试时相对更适用。