データ構造と共通メソッド

以下のデータ構造とメソッドは各サーバで利用可能である。

データ構造

message datum

Jubatus で機械学習の対象となるデータを表す。 詳細は データ変換 を参照すること。

datumは以下の様なインターフェースを通して、内部情報の更新を行う。

datum add_string(0: string key, 1: string value)
パラメータ:
  • key -- 追加するデータのキーを指定する。"$" 記号を含めることはできない。
  • value -- 追加するデータの値を指定する。
戻り値:

自分自身に対する参照を返す。

文字列データの追加を行う。

datum add_number(0: string key, 1: double value)
パラメータ:
  • key -- 追加するデータのキーを指定する。
  • value -- 追加するデータの値を指定する。
戻り値:

自分自身に対する参照を返す。

数値データの追加を行う。

datum add_binary(0: string key, 1: raw value)
パラメータ:
  • key -- 追加するデータのキーを指定する。
  • value -- 追加するデータの値を指定する。
戻り値:

自分自身に対する参照を返す。

バイナリデータの追加を行う。

なお、datumの内部表現は以下のようになっている。

0: list<tuple<string, string>> string_values

文字列で表現される入力データである。 データのキーと値のペアの集合として表現される。 キーの名前に "$" 記号を含めることはできない。

1: list<tuple<string, double>> num_values

数値で表現される入力データである。 データのキーと値のペアの集合として表現される。

2: list<tuple<string, raw>> binary_values

バイナリデータで表現される入力データである。 データのキーと値のペアの集合として表現される。

message datum {
  0: list<tuple<string, string> > string_values
  1: list<tuple<string, double> > num_values
  2: list<tuple<string, raw> > binary_values
}

Constructor

constructor(string host, int port, string name, int timeout_sec)

新しい RPC クライアントのインスタンスを作成する。 name には、タスクを識別する ZooKeeper クラスタ内でユニークな名前である。 スタンドアロン構成では、空文字列 ("") を指定する。 timeout_sec には RPC メソッドの実行からレスポンスまでのタイムアウト時間を指定する。

コンストラクタの利用方法を以下に示す:

// C++
#include <jubatus/client.hpp>
using jubatus::classifier::client::classifier;
// ...
classifier client("localhost", 9199, "cluster", 10);
# Python
from jubatus.classifier.client import Classifier
# ...
client = Classifier("localhost", 9199, "cluster", 10);
// Ruby
require 'jubatus/classifier/client'
include Jubatus::Classifier::Client
// ...
client = Classifier.new("localhost", 9199, "cluster", 10)
// Java
import us.jubat.classifier.ClassifierClient;
// ...
ClassifierClient client = new ClassifierClient("localhost", 9199, "cluster", 10);

Methods

map<string, string> save(0: string id)
パラメータ:
  • id -- 保存されるファイル名
戻り値:

それぞれのサーバの、 保存されたモデルファイルのパス。map のキーは IPアドレス_ポート番号 形式である。

すべて のサーバで学習モデルをローカルディスクに保存する。

bool load(0: string id)
パラメータ:
  • id -- 読み出すファイル名
戻り値:

すべてのサーバで読み出しに成功したらTrue

すべて のサーバで、保存された学習モデルをローカルディスクから読み出す。

bool clear()
戻り値:モデルの削除に成功した場合 True

すべて のサーバで、モデルを完全に消去する。

string get_config()
戻り値:初期化時に設定した設定情報

サーバの設定を取得する。 取得される設定情報内容については、各サービスの API リファレンスを参照のこと。

map<string, map<string, string>> get_status()
戻り値:それぞれのサーバの内部状態。最上位の map のキーは IPアドレス_ポート番号 形式である。

すべての サーバの内部状態を取得する。 サーバはIPアドレス、ポート番号で識別する。

bool do_mix()
戻り値:Mix が成功した場合 True

Update回数や経過時間に関係なく、Mixを強制的に一度実行させる。 このメソッドは サーバ に対して使用する。 プロキシに対して使用すると、RPCエラーが返却される。

map<string, map<string, string>> get_proxy_status()
戻り値:プロキシの内部状態。最上位の map のキーは IPアドレス_ポート番号 形式である。

プロキシの内部状態を取得する。

このメソッドは、 プロキシ に対して使用する。 サーバに対して使用すると、RPCエラーが返却される。

string get_name()
戻り値:ターゲットに指定されているクラスタの名前

このクライアントインスタンスが参照している先のクラスタの name を獲得する。 name とは、タスクを識別する ZooKeeper クラスタ内でユニークな名前である。 これは RPC メソッドではない。

void set_name(0: string new_name)
パラメータ:
  • new_name -- 新しくターゲットに指定したいクラスタの名前

このクライアントインスタンスがターゲットとして参照する name を設定する。 name とは、タスクを識別する ZooKeeper クラスタ内でユニークな名前である。 このメソッドを使う事で、一つのクライアントインスタンスを使って異なるタスクのクラスタに接続することができる。 これは RPC メソッドではない。

mprpc_client get_client()
戻り値:MessagePack-RPC クライアントインスタンス

Jubatus クライアントライブラリが利用している内部の MessagePack-RPC クライアントインスタンスに対する参照を返却する。 これは RPC メソッドではない。

このメソッドは、主に TCP 接続を明示的に切断したり、タイムアウトを変更したりするために使用する。

mprpc_client は MessagePack-RPC クライアントの型で、言語により異なる (C++ / Python / Ruby / Java)。

言語固有の機能

Python / Ruby クライアントには言語固有の機能が存在する。

Python

embedded_jubatus モジュール (embedded-jubatus-python) を使用すると、Jubatus Core ライブラリで提供される機械学習アルゴリズムを Python から直接呼び出すことができる。 インストールを行うには、 pip install embedded_jubatus を実行する。 インストールするマシン上に Jubatus および Jubatus Core がインストールされている必要がある。

以下の例のように、 embedded_jubatus は RPC クライアントと同様のインタフェースで使用することができる。

from jubatus.anomaly.types import *

# Use RPC:
from jubatus.anomaly.client import Anomaly
client = Anomaly('127.0.0.1', 9199, '', 0)

# Use Embedded
from jubatus.embedded import Anomaly
client = Anomaly({
    'method': 'lof',
    'parameter': { ... },
    'converter': { ... },
})

# Use Embedded (using JSON config file instead of dict)
from jubatus.embedded import Anomaly
client = Anomaly('/path/to/config.json')

# Both Embedded/RPC client supports the same API:
client.add( ... )

また、以下の補助関数が利用可能である。

jubatus.commmon.connect(cls, host, port, name, timeout=10)

cls で指定されたクラスのクライアントを作り、 host, port, name で指定されたサーバーに接続する。 コンテキストマネージャーが作成されるため、 with 文中で利用する。 ターゲットとして作成されたクライアントオブジェクトを受け取れる。 with から抜けるときに、このクライアントオブジェクトはサーバーとの接続を切断する。

with jubatus.common.connect(jubatus.classifier.client.Classifier, 'localhost', 9199, 'cluster_name', 10) as client:
    client.get_status()

Ruby

以下の補助関数が利用可能である。

class Jubatus::Common::ClientBase

全てのクライアントオブジェクトは、 ClientBase クラスの派生クラスとして定義されている。

classmethod ClientBase.connect(host, port, name, timeout_sec, &block)

各アルゴリズムのクライアントクラスの connect メソッドを呼び出すことで、安全にクライアントのコネクションを閉じることができる。 connect メソッドは、接続先ホスト名、ポート番号、クラスタ名、タイムアウト時間とブロックを渡すと、クライアントオブジェクトを作製し指定のサーバーに接続する。 そして、渡されたブロックにクライアントオブジェクトを引き渡す。 ブロックを抜ける際に、このクライアントオブジェクトはサーバーとの接続を切断する。

Jubatus::Classifier::Client::Classifier.connect('localhost', 9199, 'cluster_name', 10) { |client|
  client.get_status()
}