Hadoop(集成)开发环境

1. 命令行下编译、运行Hadoop程序

编译java代码

编译Hadoop java程序只需要hadoop-core.jar包,使用javac命令编译:

javac -cp /somedir/hadoop-0.*.*-core.jar:/otherdir/other.jar Demo.java Demo2.java

技巧:

  • -cp-classpath的简称,如果依赖多个jar包,用冒号:隔开

  • 如果同时编译多个java代码,可以使用兼容linux的通配符,如*

执行class可执行程序

一次只能运行一个可执行class程序,假设文件名为Demo.class:

hadoop Demo args

其中args是参数列表。必须将Demo的依赖class或jar包放在和Demo.class同一文件夹下。

Bug

  1. 当执行多个文件的class或jar包时,会出现找不到类的异常。
  2. 使用package的话也会出现ZipException异常

临时解决:暂时不要使用package,将所有class文件或jar包拷贝至HADOOP_HOME目录底下,并到该目录下执行class程序或jar包即不会出现异常。原因未明。

写了个shell脚本完成这件事,将它放在$HADOOP_HOME/bin目录下,并添加执行权限,hadoop-run:

#!/usr/bin/env bash

CLASS_FILES=`ls -l | awk '/^-/{printf("%s ",$NF)}'`
HADOOP_HOME=$(dirname $(dirname $(which hadoop)))

cp $CLASS_FILES $HADOOP_HOME
cd $HADOOP_HOME
hadoop $*
rm -f $CLASS_FILES

将class文件打包成jar包

将class文件放在新建的文件夹classes中,注意class文件的位置必须和它的package一致,执行:

jar -cvf jarfile.jar -C classes/ .

执行jar包

jar包分为可执行jar包(包含可执行主类)和不可执行jar包两种。hadoop自带的examples.jar包属于可执行jar包。

执行可执行jar包:

hadoop jar jarfile.jar args

执行不可执行jar包:

hadoop jar jarfile.jar classname args

其中classname是jar包中某个可执行类的名称。

2. 使用Eclipse编译、运行Hadoop程序

使用Eclipse编译Hadooop程序

编译hadoop程序不需要hadoop的eclipse插件,可以在Windows和Linux下进行,一般只需要导入hadoop的core.jar包,但最好导入hadoop的lib目录下所有jar包。它的作用等同于命令行下编译java代码。

导入jar包之后,就可以在eclipse中新建类,写Hadoop程序,会自动编译成class文件,也可以导出为jar文件。导出jar包步骤:在eclipse的若干个jave文件上点右键-Export,选择导出为jar包。

编译后的class文件或jar包可以安装命令行的方式运行,推荐使用这种方式进行开发。

在Eclipse中运行Hadoop程序

这需要Hadoop的eclipse插件支援,请先参照安装Hadoop Eclipse插件安装好Eclipse插件。

在Hadoop Java文件上点右键,选择Run - Run on Hadoop,然后选择配置好的Hadoop master就可以运行。执行过程需要打包,耗时几十秒,而且目前无法设置运行参数,因此不推荐这种执行方式。从这个角度看,目前不是特别需要用到Hadoop eclipse插件。

安装Hadoop Eclipse插件

接下来的Eclipse+插件开发方式必须在Linux下进行,或者在安装了Cygwin的Windows平台上进行。Hadoop的Eclipse插件一直有各种问题,推荐使用Hadoop-0.20.2版本,并使用修复过的插件。

将该插件点击下载复制到eclipse的plugins目录下。

1) 启动eclipse,菜单栏Window - Perference,选择Hadoop Map/Reduce,设置hadoop安装目录。

2) 菜单栏Window - Show View里面选择Map/Reduce Locations,然后在该View里新建一个Location,名称自取,DFS设置为fs.default.name的IP和端口,M/R master设置为jobtracker的IP的端口,这些和配置文件一致。

3) 在右上角Prospective View里选择Hadoop View,左边栏会出现DFS Locations,可以查看、上传、下载、删除DFS上的文件。

3. 在Eclipse中查看Hadoop源代码

网上大部分介绍著用ant eclipse-files命令输出eclipse项目,但0.20.x以后版本均不成功。

目前找到的方式是手动进行,新建一个Java Project,导入Hadoop目录的lib下所有jar包,包括jsp的两个jar包,此外还需要ant.jar包。然后对于hadoop目录的src文件夹下的这些目录:ant、core、examples、hdfs、mapred、tools,在eclipse新建一个同名的source folder,然后将对应文件夹下所有文件拷贝到eclipse对应的source folder下。

对于Access42 restriction错误:菜单栏Window - Preferences,Java–>Compiler–>Error/Warnings,选择Deprecated and Restricted API. 全部设置为warning。如果正常的话,项目应该没有任何错误。

4. 调试

最简单土著的方法是打日志,更简单一点可以将信息直接打印到标淮输入,Java程序:

System.out.println("[myinfo] your information");

标准输出将会被重定向到文件中,位置:$HADOOP_HOME/logs/userlogs/JOB_ID/ATTEMP_ID/stdout中。

推荐在打出信息中加入一个个性化单词,如myinfo,然后这样查看所有日志:

grep myinfo /somedir/logs/userlogs/JOB_ID -R
文档更新时间: 2018-11-10 18:59   作者:nick