【问题标题】:How to create a directory in HDFS on Google Cloud Platform via Java API如何通过 Java API 在 Google Cloud Platform 上的 HDFS 中创建目录
【发布时间】:2015-09-17 20:39:04
【问题描述】:

我在 Google Cloud Platform 上运行 Hadoop 集群,使用 Google Cloud Storage 作为持久数据的后端。我能够从远程机器 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 的任何限制?

谢谢!

【问题讨论】:

    标签: api hadoop google-hadoop


    【解决方案1】:

    您似乎正在本地计算机上运行该代码并尝试连接到 Google Compute Engine 虚拟机;默认情况下,GCE 具有严格的防火墙设置,以避免将您的外部 IP 地址暴露给任意入站连接。如果您使用默认值,那么您的 Hadoop 集群应该在“默认”GCE 网络上。您需要遵循adding a firewall instructions 以允许端口 8020 上的传入 TCP 连接以及其他 Hadoop 端口以及来自本地 IP 地址的传入 TCP 连接才能正常工作。它看起来像这样:

    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 地址。

    【讨论】:

    • 嗨丹尼斯,打开端口对我有用,但正如您已经指出的那样,可能还需要打开其他端口,特别是如果我想从 HDFS 加载一些数据文件我的本地机器,这是我的最终目标。我认为您是对的,我应该在主节点上运行 java 代码以避免将太多端口暴露给入站流量,但是将原始数据文件(以编程方式)推送到主节点的最佳做法是什么?谢谢!
    • 一般您可以使用gcloud compute copy-files,也可以先使用gsutil cp &lt;local file&gt; gs://&lt;your bucket&gt;/&lt;your GCS location&gt; 将文件暂存到Google Cloud Storage,然后通过SSH 连接到主服务器和gsutil cp gs://&lt;your bucket&gt;/&lt;your GCS location&gt; &lt;master local file&gt;。如果你说的是批量数据,你也可以先上传到谷歌云存储,然后在你的主节点上做hadoop fs -cp gs://your-bucket/your-location/data hdfs://&lt;master-hostname&gt;/&lt;hdfs-location&gt;
    • 如果数据量很大,您甚至可以使用“hadoop distcp”从 GCS 移动到 HDFS。或者,考虑直接在您的 hadoop 作业中从 GCS 读取文件;在任何你会使用“hdfs://”的地方继续使用你的 gs://bucket/location。
    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 2021-06-05
    • 1970-01-01
    • 2020-08-23
    • 2016-04-08
    • 2018-02-18
    • 2022-11-08
    • 2018-05-19
    相关资源
    最近更新 更多