我的目标:读取存储在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设置?我几乎可以肯定,在我可以远程连接之前,它与集群上的配置更改有关。。。
1条答案
按热度按时间im9ewurl1#
这可能与网络设置和无法从集群外部访问的数据节点端口有关(这通常是一种良好的安全实践)
您可以使用webhdfs从外部应用程序读取hdfs文件。这确实是一个restapi(http)文档https://bighadoop.wordpress.com/2013/06/02/hadoop-rest-api-webhdfs/ 这里呢https://hadoop.apache.org/docs/r1.2.1/webhdfs.html