前一篇博文我们搭建了好了运行环境,这篇小文我们开始搭建开发调试环境。这才是真正的精华,是无数血泪铸就的!
4、eclipse,又见eclipse
这个我想只要是做java的没有不熟悉,因此我就不再多说了,一切向http://www.eclipse.org索取。
注意,这里的eclipse环境安装在虚拟机中哦,别装错地方了!
5、安装maven环境
去maven.apache.org上下载maven3,解压到/home(因为/home一般是数据盘,装在这里不占系统盘的空间)。配置~/.bash_profile,修改PATH
PATH=$PATH:/home/maven3/bin/
然后 source ~/.bash_profile,使环境变量生效。
执行mvn -version,看看是否配置成功了。
因为repo.maven.org/maven2在国外访问太慢,最后设置一个本地镜像,我使用的是oschina的镜像,请参考:http://maven.oschina.net/help.html
二、调试mapreduce代码
1、搞一个简单的Hadoop MapReduce例子
首先我们在eclipse中创建一个maven工程,直接用简单模板就可以,修改pom.xml添加依赖:
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.5.1</version> </dependency>
然后参考:http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html来写一个简单的mapreduce程序。当然,他用了hadoop-eclipse-plugin,这个东东配置起来狂复杂,不建议大家使用,直接使用命令行方式,不但可以锻炼对hadoop命令的熟练度,而且还会省很多事情。我是为了省事,直接使用了他的第一个Dedup例子,两个输入文件样本和一个Dedup类。
先用bin/hadoop fs -mkdir /user/root/dedup_in 创建HDFS上的目录。
两个样本数据可以放在两个txt文件中,比如in.txt和in1.txt,名字随意,放在/home/temp/目录中,然后用bin/hadoop dfs -copyFromLocal /home/temp /user/root/dedup_in上传到HDFS中,数据准备完成。
在命令行执行mvn install 编译打包这个程序到jar,然后在命令行输入:
bin/hadoop jar 工程目录/target/xxx.jar [package].Dedup
就可以运行一个mapreduce了,当然,你要先用sbin/start-all.sh启动hadoop才行。
2、修改Dedup类
为了本地追踪调试mapreduce,我们还需要改造一下Dedup类,主要是修改main函数,在Configuration conf = new Configuration()之后增加几行代码:
Configuration conf = new Configuration(); conf.addResource("classpath:mapred-site.xml"); conf.set("fs.defaultFS", "hdfs://虚拟机IP:8020"); conf.set("mapreduce.framework.name", "yarn"); conf.set("yarn.resourcemanager.address", "虚拟机IP:8032"); conf.set("mapred.remote.os", "Linux"); conf.set("hadoop.job.ugi", "hadoop,hadoop");
3、创造一个本地运行时配置
在src/main/resources下增加一个mapred-site.xml文件,用于配置运行时的hadoop参数:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapred.child.java.opts</name> <value>-Xmx800m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000</value> </property> <property> <name>mapreduce.jobtracker.staging.root.dir</name> <value>/tmp</value> </property> <property> <name>yarn.app.mapreduce.am.staging-dir</name> <value>/tmp</value> </property> <property> <name>mapreduce.framework.name</name> <value>local</value> </property> <property> <name>mapreduce.jobtracker.address</name> <value>local</value> </property> <property> <name>mapred.job.tracker</name> <value>local</value> </property> </configuration>
注意:-Xmx800m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000中的address=8000可以配置一个不被占用的端口号,以防此端口已被占用。
4、增加一个LocalJob类
这个类是为了在本地模式下,帮助hadoop-mapreduce-client发布jar用的,代码如下:
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapreduce.Job; /** * @author root * */ public class LocalJob extends Job { public LocalJob() throws IOException { super(); } public LocalJob(Configuration conf, String jobName) throws IOException { super(conf, jobName); } public LocalJob(Configuration conf) throws IOException { super(conf); } public static LocalJob getInstance(Configuration conf, String jobName) throws IOException{ JobConf jobConf = new JobConf(conf); LocalJob job=new LocalJob(jobConf); return job; } public void setJarByClass(Class<?> clazz){ super.setJarByClass(clazz); conf.setJar("file:///工程目录/target/xxx.jar"); } }
修改Dedup类main函数Job job=new Job(conf,"Data Deduplication")这一行为:
Job job = LocalJob.getInstance(conf, "Data Deduplication");
5、在eclipse的Debug配置中增加一个Remote Java Application实例debug8000,远程端口号设为8000,这就是我们前面在mapred-site.xml中配置那个。然后再在命令行中执行一次mvn install,用于编译jar文件。
6、在Dedup类的map或reduce代码中设置断点,以application形式runDedup类,注意不是Debug方式,而是Run方式。如果这时报dedup_out目录已经存在,就用 bin/hadoop fs -rm -r /user/root/dedup_out删除输出目录
7、如果看到Dedup类正常启动了,没有报错,但停止不动了,这时不要奇怪,因为你刚才设置的那个断点生效了。这时,你要在运行debug8000这个Remote Java Application,在Eclipse Debug透视图中就能看到我们刚才设置的断点,并且直接跳到我们设置的那一行!
如果你一步一步都完成了,祝贺你!你已经打开了Hadoop开发的大门了!