更新时间:2024-10-23 GMT+08:00

HDFS HTTP REST API接口介绍

功能简介

REST应用开发代码样例中所涉及的文件操作主要包括创建文件、读写文件、追加文件、删除文件。完整和详细的接口请参考官网上的描述以了解其使用:

http://hadoop.apache.org/docs/r3.1.1/hadoop-project-dist/hadoop-hdfs/WebHDFS.html

准备运行环境

  1. 安装客户端。在节点上安装客户端,如安装到“/opt/client”目录,可参考“安装客户端”。

    1. 在客户端目录准备文件“testFile”“testFileAppend”,文件内容分别“Hello, webhdfs user!”和“Welcome back to webhdfs!”,执行如下命令准备文件。

      touchtestFile

      vitestFile

      写入“Hello, webhdfs user!”保存退出。

      touchtestFileAppend

      vitestFileAppend

      写入“Welcome back to webhdfs!”保存退出。

  2. 在普通模式下,只支持使用HTTP服务访问。登录FusionInsight Manager页面,选择“集群 > 待操作集群的名称 > 服务 > HDFS > 配置 > 全部配置”,在“搜索”框里搜索“dfs.http.policy”,然后勾选“HTTP_ONLY”,单击“保存”,单击“确定”,重启HDFS服务。

    “HTTP_ONLY”默认是勾选的。

操作步骤

  1. 登录FusionInsight Manager页面,单击“集群 > 待操作集群的名称 > 服务”,选择“HDFS”,单击进入HDFS服务状态页面。

    由于webhdfs是http访问的,需要主NameNode的IP和http端口。

    1. 单击“实例”,找到“NameNode(hacluster,主)”的主机名(host)和对应的IP。
    2. 单击“配置”,在搜索框搜索“namenode.http.port”(9870)。

  2. 参考如下链接,创建目录。

    http://hadoop.apache.org/docs/r3.1.1/hadoop-project-dist/hadoop-hdfs/WebHDFS.html#Make_a_Directory

    单击链接,如图1所示。

    图1 创建目录样例命令

    进入到客户端的安装目录下,此处为“/opt/client”,创建名为“huawei”的目录。

    1. 执行下列命令,查看当前是否存在名为“huawei”的目录。

      hdfs dfs -ls /

      执行结果如下:

      linux1:/opt/client # hdfs dfs -ls /
      16/04/22 16:10:02 INFO hdfs.PeerCache: SocketCache disabled.
      Found 7 items
      -rw-r--r--   3 hdfs   supergroup          0 2016-04-20 18:03 /PRE_CREATE_DIR.SUCCESS
      drwxr-x---   - flume  hadoop              0 2016-04-20 18:02 /flume
      drwx------   - hbase  hadoop              0 2016-04-22 15:19 /hbase
      drwxrwxrwx   - mapred hadoop              0 2016-04-20 18:02 /mr-history
      drwxrwxrwx   - spark  supergroup          0 2016-04-22 15:19 /sparkJobHistory
      drwxrwxrwx   - hdfs   hadoop              0 2016-04-22 14:51 /tmp
      drwxrwxrwx   - hdfs   hadoop              0 2016-04-22 14:50 /user

      当前路径下不存在“huawei”目录。

    2. 执行图1中的命令创建以“huawei”为名的目录。其中,用1中查找到的主机名或IP和端口分别替代命令中的<HOST>和<PORT>,在<PATH>中输入想要创建的目录“huawei”

      用主机名或IP代替<HOST>都是可以的,要注意HTTP和HTTPS的端口不同。

      • 执行下列命令访问HTTP:
         curl -i -X PUT --negotiate -u: "http://linux1:9870/webhdfs/v1/huawei?user.name=test&op=MKDIRS"

        其中用linux1代替<HOST>,用9870代替<PORT>,test为执行操作的用户,此用户需与管理员确认是否有权限进行操作。

      • 运行结果:
        HTTP/1.1 200 OK
        Cache-Control: no-cache
        Expires: Thu, 14 Jul 2016 08:04:39 GMT
        Date: Thu, 14 Jul 2016 08:04:39 GMT
        Pragma: no-cache
        Expires: Thu, 14 Jul 2016 08:04:39 GMT
        Date: Thu, 14 Jul 2016 08:04:39 GMT
        Pragma: no-cache
        Content-Type: application/json
        X-FRAME-OPTIONS: SAMEORIGIN
        Set-Cookie: hadoop.auth="u=hdfs&p=hdfs&t=simple&e=1468519479514&s=/j/J+ZnVrN7NSz1yKnB2JVIwkj0="; Path=/; Expires=Thu, 14-Jul-2016 18:04:39 GMT; HttpOnly
        Transfer-Encoding: chunked
        {"boolean":true} 
        返回值{"boolean":true}说明创建成功。
        linux1:/opt/client # curl -i -k -X PUT --negotiate -u: "https://10.120.172.109:25003/webhdfs/v1/huawei?op=MKDIRS"
    3. 再执行下列命令进行查看,可以看到路径下出现“huawei”目录。
      linux1:/opt/client # hdfs dfs -ls /
      16/04/22 16:14:25 INFO hdfs.PeerCache: SocketCache disabled.
      Found 8 items
      -rw-r--r--   3 hdfs   supergroup          0 2016-04-20 18:03 /PRE_CREATE_DIR.SUCCESS
      drwxr-x---   - flume  hadoop              0 2016-04-20 18:02 /flume
      drwx------   - hbase  hadoop              0 2016-04-22 15:19 /hbase
      drwxr-xr-x   - hdfs  supergroup          0 2016-04-22 16:13 /huawei
      drwxrwxrwx   - mapred hadoop              0 2016-04-20 18:02 /mr-history
      drwxrwxrwx   - spark  supergroup          0 2016-04-22 16:12 /sparkJobHistory
      drwxrwxrwx   - hdfs   hadoop              0 2016-04-22 14:51 /tmp
      drwxrwxrwx   - hdfs   hadoop              0 2016-04-22 16:10 /user

  3. 创建请求上传命令,获取集群分配的可写入DataNode节点地址的信息Location。

    • 执行如下命令访问HTTP:
      linux1:/opt/client # curl -i -X PUT --negotiate -u: "http://linux1:9870/webhdfs/v1/huawei/testHdfs?user.name=test&op=CREATE"
    • 运行结果:
      HTTP/1.1 307 TEMPORARY_REDIRECT
      Cache-Control: no-cache
      Expires: Thu, 14 Jul 2016 08:53:07 GMT
      Date: Thu, 14 Jul 2016 08:53:07 GMT
      Pragma: no-cache
      Expires: Thu, 14 Jul 2016 08:53:07 GMT
      Date: Thu, 14 Jul 2016 08:53:07 GMT
      Pragma: no-cache
      Content-Type: application/octet-stream
      X-FRAME-OPTIONS: SAMEORIGIN
      Set-Cookie: hadoop.auth="u=hdfs&p=hdfs&t=simple&e=1468522387880&s=OIksfRJvEkh/Out9y2Ot2FvrxWk="; Path=/; Expires=Thu, 14-Jul-2016 18:53:07 GMT; HttpOnly
      Location: http://10-120-180-170:25010/webhdfs/v1/testHdfs?op=CREATE&user.name=hdfs&namenoderpcaddress=hacluster&createflag=&createparent=true&overwrite=false
      Content-Length: 0

  4. 根据获取的Location地址信息,可在HDFS文件系统上创建“/huawei/testHdfs”文件,并将本地“testFile”中的内容上传至“testHdfs”文件。

    • 执行如下命令访问HTTP:
      linux1:/opt/client # curl -i -X PUT -T testFile --negotiate -u: "http://10-120-180-170:25010/webhdfs/v1/testHdfs?op=CREATE&user.name=test&namenoderpcaddress=hacluster&createflag=&createparent=true&overwrite=false"
    • 运行结果:
      HTTP/1.1 100 Continue
      
      HTTP/1.1 201 Created
      Location: hdfs://hacluster/testHdfs
      Content-Length: 0
      Connection: close

  5. 打开“/huawei/testHdfs”文件,并读取文件中上传写入的内容。

    • 执行如下命令访问HTTP:
      curl -L --negotiate -u: "http://linux1:9870/webhdfs/v1/huawei/testHdfs?user.name=test&op=OPEN"
    • 运行结果:
      Hello, webhdfs user!

  6. 创建请求追加文件的命令,获取集群为已存在“/huawei/testHdfs”文件分配的可写入DataNode节点地址信息Location。

    • 执行如下命令访问HTTP:
      linux1:/opt/client # curl -i -X POST --negotiate -u: "http://linux1:9870/webhdfs/v1/huawei/testHdfs?user.name=test&op=APPEND"
    • 运行结果:
      HTTP/1.1 307 TEMPORARY_REDIRECT
      Cache-Control: no-cache
      Expires: Thu, 14 Jul 2016 09:18:30 GMT
      Date: Thu, 14 Jul 2016 09:18:30 GMT
      Pragma: no-cache
      Expires: Thu, 14 Jul 2016 09:18:30 GMT
      Date: Thu, 14 Jul 2016 09:18:30 GMT
      Pragma: no-cache
      Content-Type: application/octet-stream
      X-FRAME-OPTIONS: SAMEORIGIN
      Set-Cookie: hadoop.auth="u=hdfs&p=hdfs&t=simple&e=1468523910234&s=JGK+6M6PsVMFdAw2cgIHaKU1kBM="; Path=/; Expires=Thu, 14-Jul-2016 19:18:30 GMT; HttpOnly
      Location: http://10-120-180-170:25010/webhdfs/v1/testHdfs?op=APPEND&user.name=hdfs&namenoderpcaddress=hacluster
      Content-Length: 0

  7. 根据获取的Location地址信息,可将本地“testFileAppend”文件中的内容追加到HDFS文件系统上的“/huawei/testHdfs”文件。

    • 执行如下命令访问HTTP:
      linux1:/opt/client # curl -i -X POST -T testFileAppend --negotiate -u: "http://10-120-180-170:25010/webhdfs/v1/huawei/testHdfs?op=APPEND&user.name=hdfs&namenoderpcaddress=hacluster"
    • 运行结果:
      HTTP/1.1 100 Continue
      HTTP/1.1 200 OK
      Content-Length: 0
      Connection: close

  8. 打开“/huawei/testHdfs”文件,并读取文件中全部的内容。

    • 执行如下命令访问HTTP:
      linux1:/opt/client # curl -L --negotiate -u: "http://linux1:9870/webhdfs/v1/huawei/testHdfs?user.name=test&op=OPEN"
    • 运行结果:
      Hello, webhdfs user!
      Welcome back to webhdfs!

  9. 可列出文件系统上“huawei”目录下所有目录和文件的详细信息。

    LISTSTATUS将在一个请求中返回所有子文件和文件夹的信息。
    • 执行如下命令访问HTTP:
      linux1:/opt/client # curl --negotiate -u: "http://linux1:9870/webhdfs/v1/huawei/testHdfs?user.name=test&op=LISTSTATUS"
    • 运行结果:
      {"FileStatuses":{"FileStatus":[
      {"accessTime":1462425245595,"blockSize":134217728,"childrenNum":0,"fileId":17680,"group":"supergroup","length":70,"modificationTime":1462426678379,"owner":"test","pathSuffix":"","permission":"755","replication":3,"storagePolicy":0,"type":"FILE"}
      ]}}

    带有大小参数和startafter参数的LISTSTATUS将有助于通过多个请求获取子文件和文件夹信息,从而避免获取大量子文件和文件夹信息时,用户界面变慢。

    • 执行如下命令访问HTTP:
      linux1:/opt/client # curl --negotiate -u: "http://linux1:9870/webhdfs/v1/huawei/?user.name=test&op=LISTSTATUS&startafter=sparkJobHistory&size=1"
    • 运行结果:
      {"FileStatuses":{"FileStatus":[
      {"accessTime":1462425245595,"blockSize":134217728,"childrenNum":0,"fileId":17680,"group":"supergroup","length":70,"modificationTime":1462426678379,"owner":"test","pathSuffix":"testHdfs","permission":"755","replication":3,"storagePolicy":0,"type":"FILE"}
      ]}}

  10. 删除HDFS上的文件“/huawei/testHdfs”

    • 执行如下命令访问HTTP:
      linux1:/opt/client # curl -i -X DELETE  --negotiate -u: "http://linux1:25002/webhdfs/v1/huawei/testHdfs?user.name=test&op=DELETE"
    • 运行结果:
      HTTP/1.1 200 OK
      Cache-Control: no-cache
      Expires: Thu, 14 Jul 2016 10:27:44 GMT
      Date: Thu, 14 Jul 2016 10:27:44 GMT
      Pragma: no-cache
      Expires: Thu, 14 Jul 2016 10:27:44 GMT
      Date: Thu, 14 Jul 2016 10:27:44 GMT
      Pragma: no-cache
      Content-Type: application/json
      X-FRAME-OPTIONS: SAMEORIGIN
      Set-Cookie: hadoop.auth="u=hdfs&p=hdfs&t=simple&e=1468528064220&s=HrvUEd72+V5L4GwCLC/sG3xTI0o="; Path=/; Expires=Thu, 14-Jul-2016 20:27:44 GMT; HttpOnly
      Transfer-Encoding: chunked
      {"boolean":true}

密钥管理系统通过HTTP REST API对外提供密钥管理服务,接口请参考官网:

http://hadoop.apache.org/docs/r3.1.1/hadoop-kms/index.html

由于REST API接口做了安全加固,防止脚本注入攻击。通过REST API的接口,无法创建包含 "<script ", "<iframe", "<frame", "javascript:" 这些关键字的目录和文件名。