2016年11月27日日曜日

pythonとhdfsパッケージを使用してHDFSを操作する

pythonでHDFSを操作するのに、hdfsパッケージが使用できます。以下の様にpipでインストールできます。

pip install hdfs

また、Dockerでhdfsパッケージを使用できるコンテナを作成するには、以下のDockerfileを使用します。

Dokcerfile
FROM ubuntu:16.04

RUN locale-gen ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8

RUN apt-get update \
  && apt-get -y install python-pip \
  && pip install hdfs

CMD "/bin/bash"
・コンテナのビルド
docker build -t ub1604hdfs .
・コンテナに入る場合(変更は破棄される)
docker run -v `pwd`/dat:/dat --add-host hdfsserver:192.168.1.10 --rm -it ub1604hdfs

Ambariを使用している場合、 接続先は HDFS > Configs > Advanced > Advanced hdfs-site と辿って、dfs.namenode.http-addressを確認します

ファイルの列挙は以下のコードのようにlistメソッドを使用します。
from hdfs import InsecureClient

url = "http://hdfsserver:50070"
client = InsecureClient(url, user="hdfs")

for filename in client.list("/"):
  print(filename)
ローカルファイルをHDFSにアップロードするには、以下のコードのようにuploadメソッドを使用します。
from hdfs import InsecureClient

url = "http://hdfsserver:50070"
client = InsecureClient(url, user="hdfs")

hdfs_path = "/tmp"
local_path = "./test.txt"
client.upload(hdfs_path, local_path)
HDFS上のファイルを読み込むには、以下のコードのようにreadメソッドを使用します。
from hdfs import InsecureClient

url = "http://hdfsserver:50070"
client = InsecureClient(url, user="hdfs")

hdfs_path = "/tmp/test.txt"
with client.read(hdfs_path) as reader:
  print(reader.read())
HDFSのファイルをローカルにダウンロードするには、downloadメソッドを使用します。
from hdfs import InsecureClient

url = "http://hdfsserver:50070"
client = InsecureClient(url, user="hdfs")

hdfs_path = "/tmp/test.txt"
local_path = "/dat/download.txt"
client.download(hdfs_path, local_path)
HDFS上のファイルを削除するには、deleteメソッドを使用できます。
from hdfs import InsecureClient

url = "http://hdfsserver:50070"
client = InsecureClient(url, user="hdfs")

hdfs_path = "/tmp/test.txt"
client.delete(hdfs_path, recursive=True)