本文主要分享一下在Hadoop远程调试的过程中遇到的问题及解决方法
- #exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@"
- exec "$JAVA" -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@"
点击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以及其他的模块的方法正在实验中