eclipse配置运行HDFS

前言
通常我们在运行HDFS都是编译源码并配置Hadoop环境变量,然后进入sbin目录中

1
start-dfs.sh

前言

通常我们在运行HDFS都是编译源码并配置Hadoop环境变量,然后进入sbin目录中

1
start-dfs.sh

用来启动hdfs的,如果想要看看NameNode的启动是不是需要配置远程调试了。(我以前弄过,但是之前没有写过博客)。

如果可以在本地就可以调试这些内容是不是更能了解内部是如何处理的。

实战

需要准备什么东东呢?
hadoop源码(我用的是2.7.0,你们随意)
IDEA或者eclipse等等用来导入源码,方便阅读。

假设以上内容已经齐全,现在开始进入主题。

1
2
mvn install -DskipTests
mvn eclipse:eclipse -DdownloadSources=true -DdownloadJavadocs=true

导入之后,找到hdfs项目的NameNode和DataNode运行即可。
项目图
NN
DT

你以为这就结束了???

接下来,我来说说在部署和启动遇到的问题吧。

1、webapps/hdfs not found in CLASSPATH
出现这个异常是在启动NameNode的时候出现的,下面是具体抛出异常的代码(hadoop-common项目http包下的HttpServer2)

1
2
3
4
5
6
7
8
protected String getWebAppsPath(String appName) throws FileNotFoundException {
URL url = getClass().getClassLoader().getResource("webapps/" + appName);
if (url == null)
throw new FileNotFoundException("webapps/" + appName
+ " not found in CLASSPATH");
String urlString = url.toString();
return urlString.substring(0, urlString.lastIndexOf('/'));
}

当我debug的时候,他一直找我的hadoop-common的jar的webapp中的hdfs目录,所以导致我一直出现
找不到的异常,后来我重写一个该类指定hdfs项目的路径解决可以运行(如果还有其他的解决方案请在评论下方说明一下,万分感谢!), 还有个datanode目录没有找到的异常是在运行DataNode出现的
具体出现的位置我给忘记了,😝😝😝😝

2、Exception in thread “main” java.lang.IllegalArgumentException: Invalid URI for NameNode address (check fs.defaultFS): file:/// has no authority.

出现此异常首先去stackoverflow找了下答案,如下:

1
2
3
4
5
6
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://10.100.20.168/</value>
</property>
</configuration>

但是对我是无效的,后来知道原因我使用的是core-default.xml的配置没有生效。
但是一开始我就是defualt的配置也能正常运行。。。(奇怪的问题)

如下代码是抛出异常的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static InetSocketAddress getAddress(URI filesystemURI) {
String authority = filesystemURI.getAuthority();
if (authority == null) {
throw new IllegalArgumentException(String.format(
"Invalid URI for NameNode address (check %s): %s has no authority.",
FileSystem.FS_DEFAULT_NAME_KEY, filesystemURI.toString()));
}
if (!HdfsConstants.HDFS_URI_SCHEME.equalsIgnoreCase(
filesystemURI.getScheme())) {
throw new IllegalArgumentException(String.format(
"Invalid URI for NameNode address (check %s): %s is not of scheme '%s'.",
FileSystem.FS_DEFAULT_NAME_KEY, filesystemURI.toString(),
HdfsConstants.HDFS_URI_SCHEME));
}
return getAddress(authority);
}

至于为什么会这样,在FileSystem类中有这么一段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static final String FS_DEFAULT_NAME_KEY =
CommonConfigurationKeys.FS_DEFAULT_NAME_KEY;
public static final String DEFAULT_FS =
CommonConfigurationKeys.FS_DEFAULT_NAME_DEFAULT;
/*
// CommonConfigura.java
public static final String FS_DEFAULT_NAME_KEY = "fs.defaultFS";
public static final String FS_DEFAULT_NAME_DEFAULT = "file:///";
*/
public static URI getDefaultUri(Configuration conf) {
// 这里就是创建URI对象, 各位可以单独写个Test来看看创建的对象数据。
// URI uri = new URI("file:///");
return URI.create(fixName(conf.get(FS_DEFAULT_NAME_KEY, DEFAULT_FS)));
}

至此,我这里就把我遇到的问题全部说完了。

最后,在给大家演示一下,我运行hadoop fs -put localPath hdfsPath是如何断点的。
put
put-d

链接

https://wiki.apache.org/hadoop/EclipseEnvironment

人生苦短,我要打赏!