読者です 読者をやめる 読者になる 読者になる

PythonからHDFSを操作する

HadoopHDFS(分散ファイルシステム)にはWebHDFSというREST APIがあり、HTTPで操作できる。
WebHDFS REST API
Pythonからこれを簡単に使うためのモジュールを探したところ、PyPIでWebHDFS、pywebhdfsの2つを見つけた。

WebHDFSという名前のモジュールは、RENAMEとAPPENDの操作に対応してなくてコードもイマイチ。
pywebhdfsのほうはrequestsモジュールを使ってきれいに作られていて、ドキュメントもある。これが良さそう。
pywebhdfs 0.2.2 documentation — pywebhdfs 0.2.2 documentation

pywebhdfsによるファイル操作

pywebhdfsを使って、ファイルの作成、追記、名前変更、削除の操作を試してみる。
Python2.7, pywebhdfs0.2, WebHDFSのホスト名はmaster.hadoop.nullpobug.comとした。

example.py
# coding: utf-8
from pprint import pprint
from pywebhdfs.webhdfs import PyWebHdfsClient


def main():
    hdfs = PyWebHdfsClient(
        host='master.hadoop.nullpobug.com',
        user_name='tokibito')
    # ディレクトリの作成
    hdfs.make_dir('user/tokibito/tmp/')
    # ファイルの作成
    hdfs.create_file('user/tokibito/tmp/test.txt', 'spam ham')
    # ファイルの追記
    hdfs.append_file('user/tokibito/tmp/test.txt', ' egg')
    # ディレクトリの一覧
    print "---- /user/tokibito/tmp/ ----"
    pprint(hdfs.list_dir('user/tokibito/tmp/'))
    # ファイルの読み込み
    print "---- /user/tokibito/tmp/test.txt ----"
    print hdfs.read_file('user/tokibito/tmp/test.txt')
    # ファイルの削除
    hdfs.delete_file_dir('user/tokibito/tmp/test.txt')
    # ディレクトリの削除
    hdfs.delete_file_dir('user/tokibito/tmp/')

if __name__ == '__main__':
    main()
実行結果
$ python example.py
---- /user/tokibito/tmp/ ----
{u'FileStatuses': {u'FileStatus': [{u'accessTime': 1381674163776,
                                    u'blockSize': 134217728,
                                    u'group': u'tokibito',
                                    u'length': 12,
                                    u'modificationTime': 1381674163929,
                                    u'owner': u'tokibito',
                                    u'pathSuffix': u'test.txt',
                                    u'permission': u'644',
                                    u'replication': 3,
                                    u'type': u'FILE'}]}}
---- /user/tokibito/tmp/test.txt ----
spam ham egg

ファイルパスの指定は、先頭のスラッシュの除いたものを指定する必要があるのが少し気持ち悪い感じがするが、それ以外は特に気になる点は今のところない。
ちなみにClouderaのHueにもWebHDFSを使うコードが含まれているのだが、単体で使うために依存するHueの共通モジュールを切り離すのは面倒だったのであきらめた。