0
0

More than 5 years have passed since last update.

Kubernetes+s3+RDSを使ったファイルの分散処理の仕組みを作ってみた[詳細編]

Last updated at Posted at 2016-10-02

概要

前回の記事(概要編)の続きです。
この記事では各コンテナの動作について説明します。

フローチャート

各コンテナは以下のフローチャートのように連携して動きます。
コンテナ名と処理内容を示しています。
myfile_fc.png

サンプルコード

各コンテナのコードはGithub上で公開しています。
よろしければ御覧ください。

init-pod

初期化処理と終了処理をするコンテナです。
(当初はinit container機能を利用して初期化処理のみを行う予定でしたが)

コンテナ起動後etcdサーバーに接続し処理要求とs3、mysqlの設定を読み込みます。
処理要求のジョブ数と起動中のコンテナの数を見てファイルの処理範囲(ファイル名が16進であると仮定しているので0x00~0xFFの間で)を決定しetcdサーバーに書き込みます。

その後conf.jsonを生成し、他のコンテナの終了を待ちます。(正確にはファイルの生成を待ちます)
他のコンテナが終了時に生成するファイル(s3finとhashfin)が生成されるのを待って、終了情報をetcdに書き込み、設定ファイルなどを削除します。

なお、podが動いているノード上のetcdに問い合わせを行うためkubernetesのmasterサーバーに接続し情報を取得しています。

init-pod/init.py L82

with urllib.request.urlopen(os.environ["API"]+"api/v1/namespaces/"\
    +os.environ["NAMESPACE"]+"/pods/"+os.environ["HOSTNAME"]) as res:
    j = res.read().decode('utf-8')
    data = json.loads(j)
nodeIP = data['status']['hostIP']

ソースコード:init-pod/init.py

s3-fetch-tool2

s3からファイルをダウンロードし共用でマウントしているフォルダーに保存します。
最初にinit-podが生成されたファイルに含まれているファイルの処理範囲を利用し、s3のファイル一覧から保存するファイルを選択します。
その後は、保存されているファイル数が上限10になるようにダウンロードし、全ファイルをダウンロードするとs3finファイルを生成しinit-podが終了するのを待ちます。(ちょっとこの処理が汚いです。)

ソースコード:s3-fetch-tool_2/s3-fetch-tool.py

file-hasher2

s3-fetch-toolが保存したファイルに対してハッシュ値を求めてその結果をmysqlに保存します。
s3finファイルが存在しフォルダー内のファイルが空になるまで動かし、hashfinファイルを生成します。
その後はinit-podが終了するまで待ちます。

ソースコード:file-hasher_2/file-hasher.py

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0