データ管理 とI/O

コンテンツ :

イントロダクション

ストレージクラスタは、データの入出力に使用されます。各 Cosmos ユーザは、将来の分析のために大きなデータをアップロードする場所、または分析結果をダウンロードする場所から HDFS スペース(クォータによって制限されています)を所有します。このようなユーザ空間は、Unix ライクなファイルシステムとして管理できます。つまり、所有権とアクセス権を持つディレクトリやファイルを作成、削除、名前変更、移動することができます。

トップ

File System Shell

ストレージ・クラスタに ssh を有効にすると、コマンドラインから直接大きなデータを管理することができます。File System Shell という名前の HDFS 用の完全な一連のコマンドがあり、Unix ライクな操作を実行できます。使用可能なコマンドの詳細については、公式マニュアルを参照してください。

特定のローカル・ファイルを新しい HDFS フォルダの下に保存したいとします。ストレージ・クラスタのサービス・ノードにログインしたら、この hadoop fs コマンドの使用を開始できます。

まず、希望の名前のディレクトリがないことを確認するために、自分の Unix ユーザ名と一致するルート HDFS ユーザスペースの内容をリストすることができます :

$ hadoop fs -ls /user/myuserspace
Found 1 items
drwxr-----   - myuserspace myuserspace   0 2015-07-09 12:04 /user/frb/.staging

パスが指定されていない場合は結果が同じであることを確認してください。これは、File System Shell が、現在ログに記録されている Unix ユーザ名から HDFS ユーザスペース名を取得するためです :

$ hadoop fs -ls
Found 1 items
drwxr-----   - myuserspace myuserspace   0 2015-07-09 12:04 /user/myuserspace/.staging

今、フォルダを作成することができます :

$ hadoop fs -mkdir /user/myuserspace/myfolder

ファイルをアップロードするのは次のときです :

$ hadoop fs -put *.txt /user/myuserspace/myfolder

root ユーザ空間を確認しましょう。新しいフォルダが表示されます :

$ hadoop fs -ls /user/myuserspace
$ hadoop fs -ls
Found 2 items
drwxr-----   - myuserspace myuserspace   0 2015-07-09 12:04 /user/myuserspace/.staging
drwxr-xr-x   - myuserspace myuserspace   0 2015-08-10 11:05 /user/myuserspace/myfolder

新しいフォルダの内容と同じ操作を行います :

$ hadoop fs -ls /user/myuserspace/myfolder
Found 2 items
-rw-r--r--   3 myuserspace myuserspace   1234   2015-08-10 11:05 /user/myuserspace/myfolder/mydatafile1.txt
-rw-r--r--   3 myuserspace myuserspace   475688 2015-08-10 11:05 /user/myuserspace/myfolder/mydatafile2.txt

最後に、アップロードされたファイルの内容を一覧表示できます :

$ hadoop fs -cat /user/myuserspace/myfolder/mydatafile1.txt`\
Lorem ipsum ad his scripta blandit partiendo, eum fastidii accumsan euripidis in, eum liber hendrerit an. Qui ut wisi vocibus suscipiantur, quo dicit ridens inciderint id. Quo mundi lobortis reformidans eu, legimus senserit definiebas an eos. Eu sit tincidunt incorrupte definitionem, vis mutat affert percipit cu, eirmod consectetuer signiferumque eu per. In usu latine equidem dolores. Quo no falli viris intellegam, ut fugit veritus placerat per.

説明したようにに、次のシーケンスは同じ結果を生み出します :

$ hadoop fs -ls
$ hadoop fs -mkdir myfolder
$ hadoop fs -put *.txt myfolder
$ hadoop fs -ls
$ hadoop fs -ls myfolder
$ hadoop fs -cat myfolder/mydatafile1.txt

トップ

WebHDFS

WebHDFS は、データのリモート I/Oを目的としたアプリケーション用の API です。これは、File System Shell 内のすべての操作を含む REST API です。したがって、任意のプログラミング言語で使用可能な標準の REST クライアント・ライブラリは、HDFS と対話できます。API の詳細については、公式ドキュメントを参照してください。

観察 :

  • WebHDFS には、クラスタのすべてのノードが FQDN の IP アドレスでアクセス可能である必要があります。これは、書き込み操作が2段階のリクエストであるため、新しいファイルが作成されることを知らせるネーム・ノードに送信される最初のリクエストであるか、または新しいデータが既に存在するファイルに追加されることになり、第2のものは、第1のリクエストに対するレスポンス内の位置リダイレクション・ヘッダに現れるノードに送信されます。すべてのノードが IP アドレスまたは FQDN でアクセスできることを確認できない場合は、HttpFS の使用を検討してください。
  • この REST API は OAuth2 で保護されています。 そのような保護された API を OAuth2 で保護された REST API の使用方法のセクションで使用方法を確認してください。

特定のローカルファイルを新しい HDFS フォルダの下に保存したいとします。REST API を通じて実行される一連の操作は、コマンドライン REST クライアントとして [http://curl.haxx.se/curl] を使用しますが、その他の REST クライアントも使用できます。 かなりの出力目的のためだけに、python -m json.tool を使用してください:

まず、希望の名前のディレクトリがないことを確認するために、自分の Unix ユーザ名と一致するルート HDFS ユーザスペースの内容をリストすることができます :

$ curl -X GET "http://<services_node>:50070/webhdfs/v1/user/myuserspace?op=liststatus&user.name=myuserspace" | python -m json.tool
{
    "FileStatuses": {
        "FileStatus": [
            {
                "accessTime": 0,
                "blockSize": 0,
                "group": "myuserspace",
                "length": 0,
                "modificationTime": 1436436292075,
                "owner": "myuserspace",
                "pathSuffix": ".staging",
                "permission": "740",
                "replication": 0,
                "type": "DIRECTORY"
            }
        ]
    }
}

今、フォルダを作成することができます :

$ curl -X PUT "http://<services_node>:50070/webhdfs/v1/user/myuserspace/myfolder?op=mkdirs&user.name=myuserspace" | python -m json.tool
{
    "boolean": true
}

ファイルをアップロードするのは次のときです :

$ curl -L -X PUT "http://<services_node>:50070/webhdfs/v1/user/myuserspace/myfolder/mydatafile1.txt?op=create&user.name=myuserspace" -H "X-Auth-Token: QfS3FSluzvDKNg2ZyiJ1T9K9fmh73u" -H "Content-Type: application/octet-stream" -d@./mydatafile1.txt
$ curl -L -X PUT "http://<services_node>:50070/webhdfs/v1/user/myuserspace/myfolder/mydatafile2.txt?op=create&user.name=myuserspace" -H "X-Auth-Token: QfS3FSluzvDKNg2ZyiJ1T9K9fmh73u" -H "Content-Type: application/octet-stream" -d@./mydatafile2.txt

この場合、* ワイルドカードは使用できず、ファイルを1つずつアップロードする必要があります。この -L オプションの使用法も守ってください。これはサーバから返されたリダイレクションに従います。HDFS ファイルを作成することは WebHDFS の2ステップ操作ですので、ドキュメントをチェックしてください。

root ユーザ空間を確認しましょう。新しいフォルダが表示されます :

$ curl -X GET "http://<services_node>:50070/webhdfs/v1/user/myuserspace?op=liststatus&user.name=myuserspace" | python -m json.tool
{
    "FileStatuses": {
        "FileStatus": [
            {
                "accessTime": 0,
                "blockSize": 0,
                "group": "myuserspace",
                "length": 0,
                "modificationTime": 1436436292075,
                "owner": "myuserspace",
                "pathSuffix": ".staging",
                "permission": "740",
                "replication": 0,
                "type": "DIRECTORY"
            },
            {
                "accessTime": 0,
                "blockSize": 0,
                "group": "myuserspace",
                "length": 0,
                "modificationTime": 1439199172915,
                "owner": "myuserspace",
                "pathSuffix": "myfolder",
                "permission": "755",
                "replication": 0,
                "type": "DIRECTORY"
            }
        ]
    }
}

新しいフォルダの内容と同じ操作を行います :

$ curl -X GET "http://<services_node>:50070/webhdfs/v1/user/myuserspace/myfolder?op=liststatus&user.name=myuserspace" | python -m json.tool
{
    "FileStatuses": {
        "FileStatus": [
            {
                "accessTime": 1439197513371,
                "blockSize": 67108864,
                "group": "myuserspace",
                "length": 1234,
                "modificationTime": 1439197513446,
                "owner": "myuserspace",
                "pathSuffix": "mydatafile1.txt",
                "permission": "644",
                "replication": 3,
                "type": "FILE"
            },
            {
                "accessTime": 1439197513371,
                "blockSize": 67108864,
                "group": "myuserspace",
                "length": 475688,
                "modificationTime": 1439197513446,
                "owner": "myuserspace",
                "pathSuffix": "mydatafile2.txt",

                "replication": 3,
                "type": "FILE"
            }
        ]
    }
}

最後に、アップロードされたファイルの内容を一覧表示できます :

$ curl -X GET "http://<services_node>:50070/webhdfs/v1/user/myuserspace/myfolder/mydatafile1.txt?op=open&user.name=myuserspace"
 Lorem ipsum ad his scripta blandit partiendo, eum fastidii accumsan euripidis in, eum liber hendrerit an. Qui ut wisi vocibus suscipiantur, quo dicit ridens inciderint id. Quo mundi lobortis reformidans eu, legimus senserit definiebas an eos. Eu sit tincidunt incorrupte definitionem, vis mutat affert percipit cu, eirmod consectetuer signiferumque eu per. In usu latine equidem dolores. Quo no falli viris intellegam, ut fugit veritus placerat per.

トップ

HttpFS

WebHDFS REST API の代替実装における HttpFS。具体的には、2段階のリクエスト操作におけるリダイレクトの場所は、最初のリクエストを送信したのと同じ HttpFS サーバーを指しています。内部的には、2番目のリクエストを送信する必要がある実際のデータノードがどれであるかをサーバーが認識しているため、HttpFS はゲートウェイと呼ばれています。

観察 :

  • HttpFS REST API は WebHDFS と 100%等しいですが、唯一の変更は、HttpFSサーバーのIPアドレス/ FQDN、ネームノードのIPアドレス/ FQDN (特定の展開によって異なります) および TCPポート(WebHDFS が使用する 50070 の代わりに14000) と異なる場合があります
  • この REST API は OAuth2 で保護されています。そのような保護された API を OAuth2 で保護された REST APIの使用方法 のセクションで使用方法を確認してください

トップ

Cygnus で HDFS に保存

Cygnusは、Orion Context Broker と複数のストレージ・バックエンド(HDFS) 間のコネクタとして機能し、NGSI のようなコンテキスト・データを自動的に移動させて、そのようなデータの履歴ビューを構築します。NGSI モデルでは、すべての概念、オブジェクト、または物がエンティティに変換され、そのプロパティは属性としてモデル化されます。Orion Context Broker は各エンティティの属性の最後の値だけを処理するように設計されているため、時間の経過と共に属性値のリストを作成するには、Cygnus のようなツールが必要です。

HDFS をベースにした恒久的なストレージの場合、Cygnus は Internet of Things から貴重な(大きな)データをイネーブラーに与える優れたツールです。コンテキスト・データを HDFS に保存する方法に関する詳細は、Cygnus の Github の README、より具体的にはOrionHDFSSink クラスのドキュメントにあります。しかし、HDFS の一般的な Cygnus の設定は次のようになります :

  • NGSI のような通知を受け取る Http のソース
  • 1,000個のイベントを処理できる容量のメモリチャネル
  • OrionHDFSSink を、HDFS ベースの永続ストレージにデータを書き込むように正しく構成

上記の設定が完了したら、使用やプログラミングに関して、Cygnus で何もする必要はありません。通知されたコンテキスト・データを自動的に HDFS ファイルに保存し始めます。NGSI のような通知されたデータと HDFS ファイルの間のマッピングについてはここで説明しますが、高度なグループ化機能を使用しない限り、エンティティが属する FIWARE ServiceFIWARE Service Path、 エンティティ識別子とタイプ自体に依存するパスに、エンティティごとの HDFS ファイルが作成されます。

Cygnus が作成して提供する HDFS ファイルは、Hive でクエリできる JSON 形式の内部データ表現を持つ通常の HDFS ファイルで、JSON serialized-deserializer が必要であり、カスタム NGSI ライクの MapReduce アプリケーションで処理されます。

トップ