Как вывести список содержимого каталога HDFS с помощью webhdfs?

Можно ли проверить содержимое каталога в HDFS с помощью webhdfs?

Это будет работать как обычно hdfs dfs -ls, но вместо этого будет использоваться webhdfs.

Как мне указать каталог webhdfs с помощью Python 2.6 для этого?


person DPEZ    schedule 23.06.2016    source источник


Ответы (1)


Вы можете использовать глагол LISTSTATUS. Документы находятся по адресу Список каталогов, и следующий код может можно найти в документах WebHDFS REST API:

С curl это выглядит так:

curl -i  "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=LISTSTATUS"

Ответ представляет собой объект JSON FileStatuses:

{
  "name"      : "FileStatuses",
  "properties":
  {
    "FileStatuses":
    {
      "type"      : "object",
      "properties":
      {
        "FileStatus":
        {
          "description": "An array of FileStatus",
          "type"       : "array",
          "items"      : fileStatusProperties
        }
      }
    }
  }
}

fileStatusProperties (для поля items) имеет следующую схему JSON:

var fileStatusProperties =
{
  "type"      : "object",
  "properties":
  {
    "accessTime":
    {
      "description": "The access time.",
      "type"       : "integer",
      "required"   : true
    },
    "blockSize":
    {
      "description": "The block size of a file.",
      "type"       : "integer",
      "required"   : true
    },
    "group":
    {
      "description": "The group owner.",
      "type"       : "string",
      "required"   : true
    },
    "length":
    {
      "description": "The number of bytes in a file.",
      "type"       : "integer",
      "required"   : true
    },
    "modificationTime":
    {
      "description": "The modification time.",
      "type"       : "integer",
      "required"   : true
    },
    "owner":
    {
      "description": "The user who is the owner.",
      "type"       : "string",
      "required"   : true
    },
    "pathSuffix":
    {
      "description": "The path suffix.",
      "type"       : "string",
      "required"   : true
    },
    "permission":
    {
      "description": "The permission represented as a octal string.",
      "type"       : "string",
      "required"   : true
    },
    "replication":
    {
      "description": "The number of replication of a file.",
      "type"       : "integer",
      "required"   : true
    },
   "type":
    {
      "description": "The type of the path object.",
      "enum"       : ["FILE", "DIRECTORY"],
      "required"   : true
    }
  }
};

Вы можете обрабатывать имена файлов в Python, используя pywebhdfs, например:

import json
from pprint import pprint
from pywebhdfs.webhdfs import PyWebHdfsClient

hdfs = PyWebHdfsClient(host='host',port='50070', user_name='hdfs')  # Use your own host/port/user_name config

data = hdfs.list_dir("dir/dir")  # Use your preferred directory, without the leading "/"

file_statuses = data["FileStatuses"]
pprint file_statuses   # Display the dict

for item in file_statuses["FileStatus"]:
    print item["pathSuffix"]   # Display the item filename

Вместо того, чтобы print обрабатывать каждый объект, вы можете работать с элементами так, как вам нужно. Результатом file_statuses является просто Python dict, поэтому его можно использовать как любой другой dict, при условии, что вы используете правильные ключи.

person Michael Gaskill    schedule 23.06.2016
comment
Можно ли это использовать для получения имен файлов внутри каталога? - person DPEZ; 23.06.2016
comment
Это полностью и полностью зависит от того, какой язык вы пытаетесь использовать для этого. Поскольку вы не включили это в первоначальный вопрос, я предположил, что это не имеет значения для вас, и что вы решите это, как только узнаете глагол, который нужно использовать. Если вы обновите вопрос, указав сведения о том, какой язык (C++, Python, Ruby, PHP, Fortran и т. д.) вы используете, это позволит ответить на этот вопрос. Пожалуйста, будьте максимально подробны (например, Python 2.7 отличается от Python 3.0, Ruby 1.8.7 отличается от Ruby 2.3.1, C отличается от C++ и т. д.). - person Michael Gaskill; 23.06.2016
comment
Конечно, язык, который мы используем в данный момент, — это python. - person DPEZ; 23.06.2016
comment
Я обновил вопрос для вас. (обратите внимание, что я уже просил вас обновить вопрос). Пожалуйста, подтвердите, что вы на самом деле спрашиваете. - person Michael Gaskill; 23.06.2016