我在Google云端平台上运行Hadoop群集,使用Google云端存储作为持久数据的后端。我能够从远程机器ssh到主节点并运行hadoop fs命令。无论如何,当我尝试执行以下代码时,我收到超时错误。
代码
FileSystem hdfs =FileSystem.get(new URI("hdfs://mymasternodeip:8020"),new Configuration());
Path homeDir=hdfs.getHomeDirectory();
//Print the home directory
System.out.println("Home folder: " +homeDir);
// Create a directory
Path workingDir=hdfs.getWorkingDirectory();
Path newFolderPath= new Path("/DemoFolder");
newFolderPath=Path.mergePaths(workingDir, newFolderPath);
if(hdfs.exists(newFolderPath))
{
hdfs.delete(newFolderPath, true); //Delete existing Directory
}
//Create new Directory
hdfs.mkdirs(newFolderPath);
执行hdfs.exists()命令时,出现超时错误。
错误
org.apache.hadoop.net.ConnectTimeoutException:从套接字超时异常调用gl051-win7 / 192.xxx.1.xxx到111.222.333.444.bc.googleusercontent.com:8020失败:org.apache .hadoop.net.ConnectTimeoutException:等待通道准备连接时超时20000毫秒。 ch:java.nio.channels.SocketChannel [connection-pending remote = 111.222.333.444.bc.googleusercontent.com / 111.222.333.444:8020]
您是否了解在Google Cloud Platform上使用针对Hadoop的Java Hadoop API的任何限制?
谢谢!
答案 0 :(得分:0)
您好像在本地计算机上运行该代码并尝试连接到Google Compute Engine VM;默认情况下,GCE具有严格的防火墙设置,以避免将外部IP地址暴露给任意入站连接。如果您使用的是默认值,那么您的Hadoop集群应该位于“默认”GCE网络上。您需要按照adding a firewall instructions允许端口8020上的传入TCP连接以及其他Hadoop端口上的连接以及本地IP地址才能使用。它看起来像这样:
gcloud compute firewall-rules create allow-http \
--description "Inbound HDFS." \
--allow tcp:8020 \
--format json \
--source-ranges your.ip.address.here/32
请注意,确实希望避免打开0.0.0.0/0
源范围,因为Hadoop没有对这些传入请求进行身份验证或授权。您希望尽可能地将其限制为仅计划拨入的入站IP地址。您可能还需要打开其他几个端口,具体取决于您使用哪种功能连接到Hadoop。
更一般的建议是,只要有可能,您应该尝试在Hadoop集群本身上运行代码;在这种情况下,您将使用主主机名本身作为HDFS权限而不是外部IP:
hdfs://<master hostname>/foo/bar
这样,您可以将端口暴露限制在SSH端口22,SSH端口守护程序正确地控制传入流量,然后您的代码不必担心哪些端口是打开的,甚至不需要处理完全是IP地址。