【发布时间】:2018-06-14 13:49:37
【问题描述】:
我的目标:读取存储在 HDFS 集群中的文件的 InputStream(在我本地机器的网络之外)
我的本地机器上有一个 Java 应用程序,并且集群位于不同的网络中。我对 Hadoop 完全陌生,所以我有几个问题:
1) 我如何知道我应该连接到主节点的 IP 地址和端口?我可以访问 Hadoop 集群的配置文件
2) 我应该将此解决方案理解为 WebHDFS 解决方案,因为应用程序位于集群的网络之外,或者 WebHDFS 一词是指仅通过 Hadoop 文件系统的 Http 协议进行通信的 Hadoop 应用程序?
hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/data01/hadoop-data/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data01/hadoop-data/datanode</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>ipc.maximum.data.length</name>
<value>134217728</value>
</property>
</configuration>
core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop-master:9000/</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>
从 Java 本地应用程序连接到另一个网络中的集群
String testURI = "hdfs://<MASTER_NODE_EXTERNAL_IP>:9000/user/ubuntu/testfolder/fileA.xml";
Configuration conf = new Configuration();
conf.set("fs.defaultFS", testURI);
//conf.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName());
System.setProperty("HADOOP_USER_NAME", "ubuntu");
System.setProperty("hadoop.home.dir", "/");
FileSystem fs = FileSystem.get(URI.create(testURI), conf);
InputStream is = null;
try{
is = fs.open(new Path(testURI));
IOUtils.copyBytes(is, System.out, 4096, false);
} finally {
IOUtils.closeStream(is);
}
我已经为主节点尝试了一堆不同的端口,但似乎都没有返回任何文件内容,都在集群外抛出异常。
部署在集群内的同一个应用程序并指定主节点的内部 IP 导致主节点将应用程序定向到包含我正在查找的文件的从站,并且 InputStream 完美地打印到 System.out.. .
原谅我的无知,我在 HDFS 设置中是否缺少一些基本的东西?我几乎可以肯定它与集群上的配置更改有关,然后我才能远程连接......
【问题讨论】:
-
快速提问 - 集群在 AWS 上吗?由于 AWS 如何实施 VPC(虚拟专用网络),AWS 上的 Hadoop 集群存在一个已知问题。您可以看到名称节点并查看文件系统 + 文件属性,但如果您尝试实际访问数据(读取或写入),名称节点将返回数据节点的不可访问 IP 地址。应该有一个 HDFS 配置值来返回 FQDN,而不是 IP 地址,但我上次尝试时它在 AWS 上不起作用。