Hadoop远程调试

本文主要分享一下在Hadoop远程调试的过程中遇到的问题及解决方法

1.环境:Win7下的Eclipse+Linux+Hadoop(Hadoop部署在Linux中)
2.客户端调试方法:网上很多介绍客户端的调试方法,本文不再赘述
3.Namenode等模块的远程调试方法:由于使用Eclipse进行客户端调试的时候无法看到服务器上的NameNode是如何工作的,
因此本文参考网上的一些文章进行了如下的实验:
(1)修改/home/hadoop/hadoop-1.0.0/bin/hadoop脚本,注意2是一行,不能换行,换行可能要加 "\"反斜杠
  1. #exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@"  
  2. exec "$JAVA" -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@"  
   意思是在启动namenode的时候开启调试功能,并且在8000端口监听
这样当start-all.sh的时候会在8000端口监听
(2)在Eclipse中配置远程调试: 回到开发端,在eclipse中右键选择NameNode.java->Debug As->Debug Configuration,进行如下配置:


点击Apply,然后Debug,就可以连接到name node上进行调试了。远程调试和本地调试区别不大,同样可以设置断点等操作。

         但是本人在第一次点Debug的时候Eclipse并没有自动跳转到调试界面,所以我看不到是否正在调试,于是以为没配置成功,后来自己打开调试界面才发现原来已经在调试了,发现配置成功。一下是Debug视图


重点说明:我一直在想调试的入口究竟在哪里呢?是从namenode启动还是从客户端走到了namenode再在断点处挂起还是直接从namenode处直接到断点处挂起,于是我做了一个实验,自己写了一个Mkdir.java类:



import java.io.IOException;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.DFSClient;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.server.datanode.DataNode;
import org.apache.hadoop.hdfs.server.namenode.JspHelper;
import org.apache.hadoop.hdfs.server.namenode.NameNode;
import org.apache.hadoop.ipc.Client;


public class Mkdir {


/**
* @param args
* @throws IOException 
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Configuration conf = new Configuration();
//conf.setQuietMode(false);
conf.set("mapred.job.tracker", "192.168.100.155:9001");
conf.set("fs.default.name", "hdfs://192.168.100.155:9000/");  
conf.set("hadoop.job.user","hadoop");    
//指定jobtracker的ip和端口号,master在/etc/hosts中可以配置  
conf.set("mapred.job.tracker","192.168.100.155:9001"); 
conf.set("dfs.web.ugi", "hadoop,hadoop");
FileSystem fs = FileSystem.get(conf);

fs.mkdirs(new Path("/user/hadoop/testFolder2/"));
fs.copyFromLocalFile(new Path("E:\\test.txt"), 
new Path("/user/hadoop/testFolder2/"));
/*fs.copyToLocalFile(new Path("/user/hadoop/testFolder2/test.txt"),
new Path("E:\\test2.txt"));*/
System.out.println("OK");
/*fs.open(new Path("/user/hadoop/testFolder2/test.txt"));
FileStatus[] fileStatus = fs.listStatus(new Path("/user/hadoop/testFolder2/"));
FileUtil fileUtil = new FileUtil();

for (int i = 0; i < fileStatus.length; i++) {
System.out.println(fileStatus[i].getPath());
}



FSDataInputStream fis = fs.open(new Path("/user/hadoop/testFolder/NOTICE.txt"));
byte[] chars = new byte[10];
fis.read(chars);
for (int i = 0; i < chars.length; i++) {
System.out.print(chars[i]);
}
System.out.println("run ok !");
*/
}


}

然后在本地调试:


一路走,就到了:


这个也证明了能够将客户端调试与远程调试结合在一起了。这也是我最终想要的效果,这样我们就可以很清晰的看到

从客户端(win7+Eclipse)到远程服务器(namenode)了。

调试datanode以及其他的模块的方法正在实验中



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值