Oracle® Big Data Spatial and Graph

ユーザーズ・ガイドおよびリファレンス

リリース2.4

E70114-06(原本部品番号:E67958-14)

2017年10月

Oracle Big Data Spatial and Graphユーザーズ・ガイドおよびリファレンス, リリース2.4

E70114-06

Copyright © 2015, 2017, Oracle and/or its affiliates. All rights reserved.

原本著者: Chuck Murray

原本協力者: Bill Beauregard、Hector Briseno、Hassan Chafi、Zazhil Herena、Sungpack Hong、Roberto Infante、Hugo Labra、Gabriela Montiel-Moreno、Siva Ravada、Carlos Reyes、Korbinian Schmid、Jane Tao、Zhe (Alan) Wu

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXはThe Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

図一覧

表一覧

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

Oracle Big Data Spatial and Graphのこのリリースの変更点

- インメモリー・アナリスト(PGX) - 関連する変更

- サイクル検出用の新しいPGX組込みアルゴリズム

- PGXでの一時的なデータ型のサポート

- PGX Java APIの改良

- PGQLの新機能

- PGXローダーの改良

- PGX分散エンジンの改良

- PGXの非推奨

- Spark Vector APIの変更

- Vector REST APIの追加

- SpatialViewerの変更

1 Big Data Spatial and Graphの概要

- 1.1 Big Data Spatial and Graphについて

- 1.2 空間機能

- 1.3 プロパティ・グラフ機能

- 1.3.1 プロパティ・グラフのサイズ変更の推奨事項

- 1.4 マルチメディア分析機能

- 1.5 Oracle Big Data Appliance上でのOracle Big Data Spatial and Graphのインストール

- 1.6 Big Data Spatial Image Processing Frameworkのインストールおよび構成

- 1.6.1 Cartographic Projections Libraryの取得およびコンパイル

- 1.6.2 Oracle Big Data ApplianceディストリビューションのImage Processing Frameworkのインストール

- 1.6.3 その他のディストリビューション(Oracle Big Data Appliance以外)のImage Processing Frameworkのインストール

- 1.6.3.1 その他のディストリビューションのImage Processing Frameworkをインストールするための前提条件

- 1.6.3.2 その他のディストリビューションのImage Processing Frameworkのインストール

- 1.6.4 Image Processing Frameworkのインストール後の検証

- 1.6.4.1 イメージ・ロードのテスト・スクリプト

- 1.6.4.2 Image Processorテスト・スクリプト(モザイク化)

- 1.6.4.3 単一Image Processorテスト・スクリプト

- 1.6.4.4 Image Processor DEMテスト・スクリプト

- 1.6.4.5 複数のラスター操作テスト・スクリプト

- 1.7 Big Data Spatial Image Serverのインストールおよび構成

- 1.7.1 Oracle Big Data ApplianceのImage Serverのインストールおよび構成

- 1.7.1.1 手動インストールを実行するための前提条件

- 1.7.1.2 Oracle Big Data ApplianceでのImage Server Webの依存関係のインストール

- 1.7.1.3 Big Data Applianceの環境の構成

- 1.7.2 その他システム(Big Data Appliance以外)のImage Server Webのインストールおよび構成

- 1.7.2.1 その他システムでImage Serverをインストールするための前提条件

- 1.7.2.2 その他システムでのImage Server Webのインストール

- 1.7.2.3 その他システムの環境の構成

- 1.7.3 Image Serverコンソールのインストール後の検証の例

- 1.7.3.1 ローカル・サーバーからHDFS Hadoopクラスタへのイメージのロード

- 1.7.3.2 モザイク・イメージとカタログの作成

- 1.7.3.3 地球からのモザイクの直接作成

- 1.7.3.4 地球からの傾斜イメージの直接作成

- 1.7.3.5 複数のラスター代数演算の作成

- 1.7.3.6 同一ラスターの削除

- 1.7.4 用意されているImage Server Webサービスの使用

- 1.8 Oracle Big Data SpatialViewer Webアプリケーションのインストール

- 1.8.1 SpatialViewerの前提

- 1.8.2 Oracle Big Data ApplianceでのSpatialViewerのインストール

- 1.8.3 その他システム(Big Data Appliance以外)のSpatialViewerのインストール

- 1.8.4 Oracle Big Data ApplianceでのSpatialViewerの構成

- 1.8.5 その他システム(Big Data Appliance以外)のSpatialViewerの構成

- 1.9 CDHクラスタまたはその他ハードウェアでのプロパティ・グラフ・サポートのインストール

- 1.9.1 Apache HBaseの前提条件

- 1.9.2 プロパティ・グラフのインストール手順

- 1.9.3 プロパティ・グラフのインストール・ディレクトリについて

- 1.9.4 インメモリー・アナリスト使用のオプションのインストール・タスク

- 1.9.4.1 Hadoopのインストールと構成

- 1.9.4.2 Hadoopでのインメモリー・アナリストの実行

- 1.10 マルチメディア分析サポートのインストールおよび構成

- 1.10.1 マルチメディア分析の前提およびライブラリ

- 1.10.2 トランスコーディング・ソフトウェア(オプション)

2 Big Data Spatial and Graphおよび空間データの使用

- 2.1 空間データに対するBig Data Spatial and Graphのサポートについて

- 2.1.1 Big Data Spatial and Graph on Apache Hadoopとは

- 2.1.2 Oracle Big Data Spatial and Graphの利点

- 2.1.3 Oracle Big Data Spatialの機能

- 2.1.4 Oracle Big Data Spatialのファイル、形式、およびソフトウェア要件

- 2.2 Oracle Big Dataベクトル・データおよびラスター・データの処理

- 2.2.1 Oracle Big Data Spatialラスター・データの処理

- 2.2.2 Oracle Big Data Spatialベクトル・データの処理

- 2.3 ラスター・データ処理のためのOracle Big Data Spatial Hadoop Image Processing Framework

- 2.3.1 Image Loader

- 2.3.2 Image Processor

- 2.3.3 Image Server

- 2.4 Image Loaderを使用したHadoopへのイメージのロード

- 2.4.1 イメージ・ロード・ジョブ

- 2.4.2 入力パラメータ

- 2.4.3 出力パラメータ

- 2.5 Oracle Spatial Hadoop Image Processorを使用したイメージの処理

- 2.5.1 イメージ処理ジョブ

- 2.5.1.1 デフォルトのイメージ処理ジョブ・フロー

- 2.5.1.2 複数のラスター・イメージ処理ジョブ・フロー

- 2.5.2 入力パラメータ

- 2.5.2.1 カタログXML構造

- 2.5.2.2 モザイク定義XML構造

- 2.5.3 ジョブ実行

- 2.5.4 処理クラスおよびImageBandWritable

- 2.5.4.1 クラスおよびJarファイルの位置

- 2.5.5 地図代数演算

- 2.5.6 複数のラスター代数演算

- 2.5.6.1 基本的な複数のラスター代数演算

- 2.5.6.2 複雑な複数のラスター代数演算

- 2.5.7 出力

- 2.6 Oracle Spatial Hadoop Raster Processing APIを使用したイメージのロードおよび処理

- 2.7 Oracle Spatial Hadoop Raster Simulator Frameworkを使用したラスター処理のテスト

- 2.8 Oracle Big Data Spatial Raster Processing for Spark

- 2.8.1 Sparkラスター・ローダー

- 2.8.1.1 Sparkラスター・ローダーへの入力パラメータ

- 2.8.1.2 Sparkラスター・ローダーの予想出力

- 2.8.2 Spark SQLラスター・プロセッサ

- 2.8.2.1 Spark SQLラスター・プロセッサへの入力パラメータ

- 2.8.2.2 Spark SQLラスター・プロセッサの予想出力

- 2.8.3 Sparkラスター処理APIの使用

- 2.8.3.1 Sparkラスター・ローダーAPIの使用

- 2.8.3.2 Spark SQLプロセッサAPIを使用するための構成

- 2.8.3.3 DataFrameの作成

- 2.8.3.4 ラスター代数演算用のSpark SQLの使用

- 2.9 Oracle Big Data Spatial Vector Analysis

- 2.9.1 複数のHadoop APIのサポート

- 2.9.2 空間の索引付け

- 2.9.2.1 空間の索引付けクラスの構造

- 2.9.2.2 空間索引を作成する構成

- 2.9.2.3 空間索引メタデータ

- 2.9.2.4 空間索引の入力形式

- 2.9.2.5 GeoJSONおよびShapefile形式のサポート

- 2.9.2.6 空間索引の削除

- 2.9.3 MVSuggestの使用

- 2.9.4 空間のフィルタ処理

- 2.9.4.1 レコードのフィルタ処理

- 2.9.4.2 入力形式の使用のフィルタ処理

- 2.9.5 データの階層分類

- 2.9.5.1 階層レベル範囲の変更

- 2.9.5.2 検索階層の制御

- 2.9.5.3 データを分類するためのMVSuggestの使用

- 2.9.6 バッファの生成

- 2.9.7 空間のビニング

- 2.9.8 空間のクラスタ化

- 2.9.9 空間の結合

- 2.9.10 空間のパーティション化

- 2.9.11 RecordInfoProvider

- 2.9.11.1 サンプルRecordInfoProvider実装

- 2.9.11.2 LocalizableRecordInfoProvider

- 2.9.12 HierarchyInfo

- 2.9.12.1 サンプルHierarchyInfo実装

- 2.9.13 MapReduceジョブでのJGeometryの使用

- 2.9.14 異なるデータ・ソースのサポート

- 2.9.15 ジョブ・レジストリ

- 2.9.16 Vector Analysis APIを使用したジョブ実行時間のパフォーマンス・データのチューニング

- 2.10 Oracle Big Data Spatial Vector Analysis for Spark

- 2.10.1 空間RDD (Resilient Distributed Dataset)

- 2.10.2 空間の変換

- 2.10.2.1 フィルタ変換

- 2.10.2.2 FlatMap変換

- 2.10.2.3 結合変換

- 2.10.2.4 空間評価の制御

- 2.10.2.5 空間的に有効な変換

- 2.10.3 空間アクション(MBRおよびNearestNeighbors)

- 2.10.4 空間RDDの空間索引付け

- 2.10.4.1 空間RDDの空間のパーティション化

- 2.10.4.2 空間RDDのローカル空間索引付け

- 2.10.5 入力形式のサポート

- 2.10.6 空間Spark SQL API

- 2.10.7 空間RDDのJDBCデータ・ソース

- 2.11 Oracle Big Data Spatial Vector Hive Analysis

- 2.11.1 HiveRecordInfoProvider

- 2.11.2 Hive Spatial APIの使用

- 2.11.3 Hive内の空間索引の使用

- 2.12 Oracle Big Data SpatialViewer Webアプリケーションの使用

- 2.12.1 SpatialViewerを使用したHadoop空間索引の作成

- 2.12.2 Hadoop索引付き空間データの検索

- 2.12.3 SpatialViewerを使用したSpark空間索引の作成

- 2.12.4 Spark索引付き空間データの検索

- 2.12.5 SpatialViewerを使用したカテゴリ化ジョブの実行

- 2.12.6 カテゴリ化結果の表示

- 2.12.7 ファイルへのカテゴリ化結果の保存

- 2.12.8 テンプレートの作成および削除

- 2.12.9 テンプレートの構成

- 2.12.10 SpatialViewerを使用したクラスタ化ジョブの実行

- 2.12.11 クラスタ化結果の表示

- 2.12.12 ファイルへのクラスタ化結果の保存

- 2.12.13 SpatialViewerを使用したビニング・ジョブの実行

- 2.12.14 ビニング結果の表示

- 2.12.15 ファイルへのビニング結果の保存

- 2.12.16 コマンドラインを使用した索引作成ジョブの実行

- 2.12.17 カテゴリ化結果を作成するジョブの実行

- 2.12.18 クラスタ化結果を作成するジョブの実行

- 2.12.19 ビニング結果を作成するジョブの実行

- 2.12.20 空間をフィルタ処理するジョブの実行

- 2.12.21 場所の提案を取得するジョブの実行

- 2.12.22 空間結合を実行するジョブの実行

- 2.12.23 パーティション化を実行するジョブの実行

- 2.12.24 複数の入力の使用

- 2.12.25 ローカル・サーバーからHDFS Hadoopクラスタへのイメージのロード

- 2.12.26 地球でのラスターの視覚化

- 2.12.27 単一のラスターまたは同じMBRを持つ複数のラスターの処理

- 2.12.28 地球からのモザイクの直接作成

- 2.12.29 ラスター処理に対する演算の追加

- 2.12.30 地球からの傾斜イメージの直接作成

- 2.12.31 地球からのイメージ・ファイル形式の変更

- 2.13 Oracle Big Data Spatial and Graph Image Serverコンソールの使用

- 2.13.1 モザイクを作成するためのHDFS Hadoopクラスタへのイメージのロード

3 Big Data Spatial and GraphとOracle Databaseとの統合

- 3.1 区切りテキスト・ファイルを使用したOracle SQL Connector for HDFSの使用

- 3.2 Hive表を使用したOracle SQL Connector for HDFSの使用

- 3.3 Oracle Loader for Hadoopによって生成されたファイルを使用したOracle SQL Connector for HDFSの使用

- 3.3.1 HDFSデータ・ポンプ・ファイルまたは区切りテキスト・ファイルの作成

- 3.3.2 SQL Connector for HDFSの作成

- 3.4 Oracle Big Data SQLを使用したOracle DatabaseとのHDFS空間データの統合

- 3.4.1 Big Data SQLを使用したHDFSファイル用のOracle外部表の作成

- 3.4.2 Big Data SQLを使用したHive表の使用によるOracle外部表の作成

4 プロパティ・グラフ・サポートの構成

- 4.1 プロパティ・グラフと併用するためのApache HBaseのチューニング

- 4.1.1 Apache HBase構成の変更

- 4.1.2 Javaメモリー設定の変更

- 4.2 プロパティ・グラフと併用するためのOracle NoSQL Databaseのチューニング

5 ビッグ・データ環境でのプロパティ・グラフの使用

- 5.1 プロパティ・グラフについて

- 5.1.1 プロパティ・グラフとは

- 5.1.2 プロパティ・グラフのビッグ・データ・サポートとは

- 5.1.2.1 インメモリー・アナリスト

- 5.1.2.2 データ・アクセス・レイヤー

- 5.1.2.3 ストレージ管理

- 5.1.2.4 RESTful Webサービス

- 5.2 プロパティ・グラフのデータ形式について

- 5.2.1 GraphMLデータ形式

- 5.2.2 GraphSONデータ形式

- 5.2.3 GMLデータ形式

- 5.2.4 Oracleフラット・ファイル形式

- 5.3 プロパティ・グラフの開始

- 5.4 プロパティ・グラフ・データ用のJava APIの使用

- 5.4.1 Java APIの概要

- 5.4.1.1 Oracle Big Data Spatial and Graph Java API

- 5.4.1.2 TinkerPop Blueprints Java API

- 5.4.1.3 Apache Hadoop Java API

- 5.4.1.4 Oracle NoSQL Database Java API

- 5.4.1.5 Apache HBase Java API

- 5.4.2 グラフ・データのパラレル・ロード

- 5.4.2.1 パーティションを使用したパラレル・データ・ロード

- 5.4.2.2 ファインチューニングを使用したパラレル・データ・ロード

- 5.4.2.3 複数のファイルを使用したパラレル・データ・ロード

- 5.4.2.4 グラフ・データのパラレル取得

- 5.4.2.5 サブグラフ抽出のための要素フィルタ・コールバックの使用

- 5.4.2.6 プロパティ・グラフ・データの読取りでの最適化フラグの使用

- 5.4.2.7 プロパティ・グラフのサブグラフの属性の追加および削除

- 5.4.2.8 プロパティ・グラフ・メタデータの取得

- 5.4.3 プロパティ・グラフ・インスタンスのオープンおよびクローズ

- 5.4.3.1 Oracle NoSQL Databaseの使用

- 5.4.3.2 Apache HBaseの使用

- 5.4.4 頂点の作成

- 5.4.5 エッジの作成

- 5.4.6 頂点およびエッジの削除

- 5.4.7 データベースから埋込みインメモリー・アナリストへのグラフの読込み

- 5.4.8 頂点のラベルの指定

- 5.4.9 インメモリー・グラフの構築

- 5.4.10 プロパティ・グラフの削除

- 5.4.10.1 Oracle NoSQL Databaseの使用

- 5.4.10.2 Apache HBaseの使用

- 5.5 プロパティ・グラフ・データのテキスト索引付けの管理

- 5.5.1 プロパティ・グラフ・データのテキスト索引の構成

- 5.5.2 プロパティ・グラフ・データの自動索引の使用

- 5.5.3 プロパティ・グラフ・データの手動索引の使用

- 5.5.4 プロパティ・グラフ・テキスト索引に対する検索問合せの実行

- 5.5.5 データ型の処理

- 5.5.5.1 Apache Luceneでのデータ型識別子の追加

- 5.5.5.2 SolrCloudでのデータ型識別子の追加

- 5.5.6 ZookeeperへのコレクションのSolrCloud構成のアップロード

- 5.5.7 プロパティ・グラフ・データのテキスト索引の構成設定の更新

- 5.5.8 プロパティ・グラフ・データのテキスト索引でのパラレル問合せの使用

- 5.5.9 プロパティ・グラフ・データのテキスト索引に対するネイティブ問合せオブジェクトの使用

- 5.5.10 プロパティ・グラフ・データのテキスト索引に対するネイティブ問合せ結果の使用

- 5.6 PGQLを使用したプロパティ・グラフ・データに対する問合せ

- 5.7 プロパティ・グラフ・データを使用したApache Sparkの使用

- 5.7.1 Apache HBase内のプロパティ・グラフ・データを使用したApache Sparkの使用

- 5.7.2 Oracle NoSQL Databaseに格納されているプロパティ・グラフ・データとApache Sparkとの統合

- 5.8 セキュアなOracle NoSQL Databaseのサポート

- 5.9 Apache HBaseに格納されているグラフでのセキュリティの実装

- 5.10 プロパティ・グラフ・データでのGroovyシェルの使用

- 5.11 プロパティ・グラフ・データのRESTサポート

- 5.11.1 REST Webアプリケーション・アーカイブ(WAR)ファイルの構築

- 5.11.2 RESTfulプロパティ・グラフWebサービスのデプロイ

- 5.11.2.1 RESTfulプロパティ・グラフ・サービス構成ファイル(rexster.xml)

- 5.11.3 プロパティ・グラフREST API操作の情報

- 5.11.3.1 GET操作(プロパティ・グラフ)

- 5.11.3.2 POST操作(プロパティ・グラフ)

- 5.11.3.3 PUT操作(プロパティ・グラフ)

- 5.11.3.4 DELETE操作(プロパティ・グラフ)

- 5.12 サンプル・プログラムの探索

- 5.12.1 サンプル・プログラムについて

- 5.12.2 サンプル・プログラムのコンパイルおよび実行

- 5.12.3 出力の例について

- 5.12.4 例: プロパティ・グラフの作成

- 5.12.5 例: プロパティ・グラフの削除

- 5.12.6 例: 頂点およびエッジの追加と削除

- 5.13 Oracleフラット・ファイル形式の定義

- 5.13.1 プロパティ・グラフ記述ファイルについて

- 5.13.2 頂点ファイル

- 5.13.3 エッジ・ファイル

- 5.13.4 特殊文字のエンコーディング

- 5.13.5 Oracleフラット・ファイル形式でのプロパティ・グラフの例

- 5.13.6 Oracle Database表のOracle定義のプロパティ・グラフ・フラット・ファイルへの変換

- 5.13.7 頂点およびエッジのCSVファイルのOracle定義のプロパティ・グラフ・フラット・ファイルへの変換

- 5.13.7.1 頂点: CSVファイルのOracle定義のフラット・ファイル形式(.opv)への変換

- 5.13.7.2 エッジ: CSVファイルのOracle定義のフラット・ファイル形式(.ope)への変換

- 5.13.7.3 頂点およびエッジ: 頂点とエッジの両方のデータが含まれる単一のCSVファイルのグラフ・フラット・ファイルのペアへの変換

- 5.14 Pythonユーザー・インタフェースの例

- 5.15 iPython Notebookユーザー・インタフェースの例

6 インメモリー・アナリスト(PGX)の使用

- 6.1 グラフのメモリーへの読込み

- 6.1.1 インメモリー・アナリスト・サーバー・インスタンスへの接続

- 6.1.2 シェル・ヘルプの使用

- 6.1.3 構成ファイルでのグラフ・メタデータの指定

- 6.1.4 グラフ・データのメモリーへの読込み

- 6.1.4.1 Apache HBaseに格納されているグラフのメモリーへの読込み

- 6.1.4.2 Oracle NoSQL Databaseに格納されているグラフのメモリーへの読込み

- 6.1.4.3 ローカル・ファイル・システムに格納されているグラフのメモリーへの読込み

- 6.2 インメモリー・アナリストの構成

- 6.2.1 インメモリー・アナリストの構成ファイルの指定

- 6.3 カスタム・グラフ・データの読取り

- 6.3.1 単純なグラフ・ファイルの作成

- 6.3.2 頂点プロパティの追加

- 6.3.3 頂点識別子としての文字列の使用

- 6.3.4 エッジ・プロパティの追加

- 6.4 グラフ・データのディスクへの格納

- 6.4.1 頂点プロパティへの分析結果の格納

- 6.4.2 エッジリスト形式でのグラフのディスクへの格納

- 6.5 組込みアルゴリズムの実行

- 6.5.1 インメモリー・アナリストについて

- 6.5.2 Triangle Countingアルゴリズムの実行

- 6.5.3 Pagerankアルゴリズムの実行

- 6.6 サブグラフの作成

- 6.6.1 フィルタ式について

- 6.6.2 簡易エッジ・フィルタを使用したサブグラフの作成

- 6.6.3 簡易頂点フィルタを使用したサブグラフの作成

- 6.6.4 複合フィルタを使用したサブグラフの作成

- 6.6.5 式フィルタの結合

- 6.6.6 式フィルタを使用した一連の頂点またはエッジの作成

- 6.6.7 頂点集合を使用した2部サブグラフの作成

- 6.7 グラフを使用したパターンマッチング問合せの使用

- 6.7.1 例: 敵の敵は味方である

- 6.7.2 例: 協力者の最も多い上位10人

- 6.7.3 例: 電気装置間の推移的な接続性

- 6.8 インメモリー・アナリスト・サーバーの起動

- 6.8.1 インメモリー・アナリスト・サーバーの構成

- 6.9 Jettyへのデプロイ

- 6.10 Apache Tomcatへのデプロイ

- 6.11 Oracle WebLogic Serverへのデプロイ

- 6.11.1 Oracle WebLogic Serverのデプロイ

- 6.11.2 インメモリー・アナリストのデプロイ

- 6.11.3 サーバーが動作していることの確認

- 6.12 インメモリー・アナリスト・サーバーへの接続

- 6.12.1 インメモリー・アナリスト・シェルによる接続

- 6.12.1.1 HTTPリクエストのロギングについて

- 6.12.2 Javaによる接続

- 6.12.3 JavaScriptによる接続

- 6.13 分散モードのインメモリー・アナリストの使用

- 6.14 HDFSでのデータの読取りおよび格納

- 6.14.1 HDFSからのデータの読込み

- 6.14.2 グラフ・スナップショットのHDFSへの格納

- 6.14.3 HadoopでのJavaアプリケーションのコンパイルおよび実行

- 6.15 YARNアプリケーションとしてのインメモリー・アナリストの実行

- 6.15.1 インメモリー・アナリスト・サービスの開始および停止

- 6.15.1.1 インメモリー・アナリストYARNクライアントの構成

- 6.15.1.2 新規インメモリー・アナリスト・サービスの開始

- 6.15.1.3 長期実行インメモリー・アナリスト・サービスについて

- 6.15.1.4 インメモリー・アナリスト・サービスの停止

- 6.15.2 インメモリー・アナリスト・サービスへの接続

- 6.15.3 インメモリー・アナリスト・サービスの監視

- 6.16 Oracleの2つの表リレーショナル形式の使用

- 6.17 インメモリー・アナリストを使用したApache Spark内のグラフ・データの分析

- 6.17.1 Apache Spark内の並列度の制御

- 6.18 インメモリー・アナリストZeppelinインタプリタの使用

- 6.19 インメモリー・アナリスト・エンタープライズ・スケジューラの使用

- 6.19.1 実行環境でのラムダ構文の使用

7 マルチメディア分析の使用

- 7.1 マルチメディア分析について

- 7.2 マルチメディア分析フレームワークを使用したHDFSに格納されたビデオおよびイメージの処理

- 7.3 マルチメディア分析フレームワークを使用したストリーミング・ビデオの処理

- 7.4 マルチメディア分析フレームワークを使用した顔認識

- 7.4.1 顔を検出するためのトレーニング

- 7.4.2 トレーニングに使用する顔の選択

- 7.4.3 ビデオでの顔の検出

- 7.4.4 イメージでの顔の検出

- 7.4.5 Oracle NoSQL Databaseの操作

- 7.4.6 Apache HBaseの操作

- 7.4.7 顔検出の例およびトレーニング資料

- 7.5 マルチメディア分析の構成プロパティ

- 7.5.1 格納されたビデオおよびイメージの処理用のプロパティの構成

- 7.5.2 ストリーミング・ビデオの処理用のプロパティの構成

- 7.5.3 トレーニング・イメージおよび顔認識用のプロパティの構成

- 7.6 サードパーティ・ソフトウェアとマルチメディア分析フレームワークの併用

- 7.7 出力のイメージの表示

A 同梱されているソフトウェアのサード・パーティ・ライセンス

- A.1 Apache Licensed Code

- A.2 ANTLR 3

- A.3 AOP Alliance

- A.4 Apache Commons CLI

- A.5 Apache Commons Codec

- A.6 Apache Commons Collections

- A.7 Apache Commons Configuration

- A.8 Apache Commons IO

- A.9 Apache Commons Lang

- A.10 Apache Commons Logging

- A.11 Apache Commons VFS

- A.12 Apache fluent

- A.13 Apache Groovy

- A.14 Apache htrace

- A.15 Apache HTTP Client

- A.16 Apache HTTPComponents Core

- A.17 Apache Jena

- A.18 Apache Log4j

- A.19 Apache Lucene

- A.20 Apache Tomcat

- A.21 Apache Xerces2

- A.22 Apache xml-commons

- A.23 Argparse4j

- A.24 check-types

- A.25 Cloudera CDH

- A.26 cookie

- A.27 Fastutil

- A.28 functionaljava

- A.29 GeoNames Data

- A.30 Geospatial Data Abstraction Library (GDAL)

- A.31 Google Guava

- A.32 Google Guice

- A.33 Google protobuf

- A.34 int64-native

- A.35 Jackson

- A.36 Jansi

- A.37 JCodec

- A.38 Jettison

- A.39 JLine

- A.40 Javassist

- A.41 json-bignum

- A.42 Jung

- A.43 Log4js

- A.44 MessagePack

- A.45 Netty

- A.46 Node.js

- A.47 node-zookeeper-client

- A.48 OpenCV

- A.49 rxjava-core

- A.50 Slf4j

- A.51 Spoofax

- A.52 Tinkerpop Blueprints

- A.53 Tinkerpop Gremlin

- A.54 Tinkerpop Pipes

B Hive空間関数

- B.1 ST_AnyInteract

- B.2 ST_Area

- B.3 ST_AsWKB

- B.4 ST_AsWKT

- B.5 ST_Buffer

- B.6 ST_Contains

- B.7 ST_ConvexHull

- B.8 ST_Distance

- B.9 ST_Envelope

- B.10 ST_Geometry

- B.11 ST_Inside

- B.12 ST_Length

- B.13 ST_LineString

- B.14 ST_MultiLineString

- B.15 ST_MultiPoint

- B.16 ST_MultiPolygon

- B.17 ST_Point

- B.18 ST_Polygon

- B.19 ST_Simplify

- B.20 ST_SimplifyVW

- B.21 ST_Volume

図一覧

- 5-1 単純なプロパティ・グラフの例

- 5-2 Oracleプロパティ・グラフのアーキテクチャ

- 5-3 iPython Notebookから生成されるイメージの例

- 6-1 sample.adjデータからレンダリングされたプロパティ・グラフ

- 6-2 単純なカスタム・プロパティ・グラフ

- 6-3 サンプル・グラフ

- 6-4 簡易エッジ・フィルタで作成されたサブグラフ

- 6-5 outDegreeフィルタと一致するエッジ

- 6-6 outDegreeフィルタで作成されたグラフ

- 6-7 2つのフィルタの結合

- 6-8 2つのフィルタの交差

- 6-9 電気ネットワークのグラフ

表一覧

- -1 PGXでの一時的なデータ型のサポート

- 1-1 プロパティ・グラフのサイズ変更の推奨事項

- 2-1 ImageBandWritableプロパティ

- 2-2 tileInfo列データ

- 2-3 userRequest列データ

- 2-4 Vector Analysis APIを使用したジョブ実行のパフォーマンス時間

- 5-1 プロパティ・グラフで頂点またはエッジを処理するための最適化フラグ

- 5-2 Apache Luceneデータ型識別子

- 5-3 SolrCloudデータ型識別子

- 5-4 プロパティ・グラフのプログラム例(一部)

- 5-5 プロパティ・グラフのデータ型の略称

- 5-6 頂点ファイルのレコードの形式

- 5-7 エッジ・ファイルのレコードの形式

- 5-8 Oracleフラット・ファイル形式での特殊文字コード

- 6-1 インメモリー・アナリストの構成パラメータ

- 6-2 インメモリー・アナリスト・サーバーの構成オプション

- 6-3 2つの表形式の追加フィールド

- 6-4 2つの表の例のノード表値

- 6-5 2つの表の例のエッジ表値

はじめに

このドキュメントでは、ビッグ・データ環境で空間およびグラフのベクトル、ラスタおよびプロパティ・グラフ・データを作成、格納および操作することを可能にする、Oracle Big Data Spatial and Graphの概念と使用方法に関する情報を提供します。

- 対象読者

- ドキュメントのアクセシビリティ

- 関連ドキュメント

- 表記規則

対象読者

このドキュメントは、ビッグ・データ環境におけるデータベース開発者とアプリケーション開発者を対象としています。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracle Supportへのアクセス

サポート契約がある場合には、My Oracle Supportを通して電子支援をご利用いただけます。詳細情報はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoか、聴覚に障害のあるお客様はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trsを参照してください。

関連ドキュメント

詳細は、Oracle Big Data Spatial and Graphが含まれるBig Data Applianceライブラリのタイトルとともに、次の他のドキュメントを参照してください。

- 『Oracle Big Data Connectorsユーザーズ・ガイド』

- Oracle Big Data Applianceサイト・チェックリスト

- 『Oracle Big Data Applianceオーナーズ・ガイド』

- Oracle Big Data Appliance安全およびコンプライアンス・ガイド

表記規則

このマニュアルでは次の表記規則を使用します。

表記規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

Oracle Big Data Spatial and Graphのこのリリースの変更点

Big Data Spatial and Graphのリリース2.4の製品には次の変更が含まれています。

- インメモリー・アナリスト(PGX) - 関連する変更

- Spark Vector APIの変更

- Vector REST APIの追加

- SpatialViewerの変更

インメモリー・アナリスト(PGX) - 関連する変更

次の変更は、Big Data Spatial and Graphのインメモリー・アナリスト(PGX)機能に関連しています。

- サイクル検出用の新しいPGX組込みアルゴリズム

- PGXでの一時的なデータ型のサポート

- PGX Java APIの改良

- PGQLの新機能

- PGXローダーの改良

- PGX分散エンジンの改良

- PGXの非推奨

サイクル検出用の新しいPGX組込みアルゴリズム

インメモリー・アナリスト(PGX)のリリース2.4では、サイクルを検出するために次の2つのインメモリー・アルゴリズムが導入されています。強力なバージョンは、いくつかのDFSトラバースを実行して常にグラフ全体をスキャンし、軽量なバージョンは、タスクに対して1度だけDFSトラバースを実行します。軽量なバージョンの方が高速ですが、グラフ全体が検索されない場合があるため、一部のサイクルの検出に失敗する可能性があります。

analyst.findCycle() APIを介して新しいアルゴリズムを使用できます。

PGXでの一時的なデータ型のサポート

リリース2.4のインメモリー・アナリスト(PGX)では、SQLの5つの一時的なタイプおよび新しいJava 8の日時タイプに直接マップされる5つの一時的なデータ型のサポートによって、時間に関連するプロパティをより正確に制御できます。dateプロパティ・タイプは非推奨になり、local_date、time、timestamp、time_with_timezoneおよびtimestamp_with_timezoneに置き換えられました。次の表にまとめるように、新しいタイプはPGX APIとPGQLの両方でサポートされます。

表-1 PGXでの一時的なデータ型のサポート

型

PGXプロパティ・タイプ

例のプレーン・テキスト

例のPGQLリテラル

PGQL ResultSet API

TIMESTAMP WITH TIMEZONE

timestamp_with_timezone

"2017-08-18 20:15:00+08"

TIMESTAMP '2017-08-18 20:15:00+08'

java.time.OffsetDateTime getTimestampWithTimezone(..)

TIMESTAMP

timestamp

"2017-08-18 20:15:00"

TIMESTAMP '2017-08-18 20:15:00'

java.time.LocalDateTime getTimestamp(..)

TIME WITH TIMEZONE

time_with_timezone

"20:15:00+08"

TIME '20:15:00+08'

java.time.OffsetTime getTimeWithTimezone(..)

TIME

time

"20:15:00"

TIME '20:15:00'

java.time.LocalTime getTime(..)

DATE

local_date

"2017-08-18"

DATE '2017-08-18'

java.time.LocalDate getDate(..)

PGX Java APIの改良

リリース2.4では、PGX Java APIにいくつかの追加および改良が加えられました。

- セッションでプライベートに使用されるすべてのグラフの取得、および名前によるグラフの取得のためのJava APIが追加されました(PgxSession#getGraphs()、PgxSession#getGraph(String))。

- グラフに頂点/エッジ・ラベルがあるかどうかを確認するためのAPIが追加されました(PgxGraph#hasVertexLabels、PgxGraph#hasEdgeLabel)。

- GraphConfigビルダーは、既存のGraphConfigsから値をコピーできるようになり、GraphConfigビルダーからプロパティを削除できるようになりました。(copyFrom(GraphConfig)、copyBaseFrom(GraphConfig)、removeVertexProperty(String)、removeEdgeProperty(String))。

- ランダムなエッジを取得するためのAPIが追加されました(PgxGraph#getRandomEdge))。

PGQLの新機能

リリース2.4では、次を含むPGQLのいくつかの新機能が導入されています。

準備済の文

準備済の文によって、アプリケーションを問合せインジェクションから保護する方法が提供されます。また、準備済の文を使用すると、バインド値が変更されるたびに問合せを再コンパイルする必要がないため、問合せの実行が高速になります。PGQLでは、バインド変数を示すために疑問符記号(?)を使用します。バインド変数の値は、PreparedStatement APIを介して割り当てられます

方向のないエッジ問合せ

PGQLで、方向のないエッジ問合せがサポートされるようになりました。これは、方向のないグラフの問合せや、方向のあるグラフでのエッジ方向を無視した問合せに使用できます。これらの2つのユースケースを次の2つの問合せに示します。

SELECT d1.name WHERE (d1:Device) -[:connects_to]- (d2:Device), d1.name = 'LoadTransformer 2533'
SELECT m.name WHERE (n:Person) -[:follows]- (m:Person) , n.name = 'Bono'

最初の問合せは、connects_toというラベルが付けられた方向のないエッジと一致し、2番目の問合せは、'Bono'という名前の人の前または後のすべての人と一致します。

PGQLのその他の追加および改良

- PGQLにall_different(a, b, c, ...)関数が導入されました。これは、値のセット(通常は頂点またはエッジ)がすべて互いに異なることを指定できます。

- 文字列値の比較に対する、次より大きい、次以上、次より小さいおよび次以下がサポートされます(Java APIのフィルタ式に対しても機能します)。

- 次の例のように、PATHパターンでの頂点に関する制約のサポートが追加されました。以前は、PATHパターンのエッジに関する制約のみがサポートされていました。次に例を示します。

PATH connects_to_high_volt_dev := (:Device) -> (:Device WITH voltage > 35000) SELECT ...

PGXローダーの改良

リリース2.4のPGXグラフ・ローダーには次の拡張機能があります。

- Apache Sparkローダーで、oracle.pgx.api.spark2.PgxSparkContextクラスを介してSpark 2.Xがサポートされるようになりました。oracle.pgx.api.spark1のクラスを使用すると、引き続きSpark 1.xからロードできます。

- 2つの表形式のOracle RDBMSからのロード時に、列名を構成できるようになりました。

- 2つの表形式で、頂点IDタイプとしてstring、integerおよびlongがサポートされるようになりました。

- アーカイブを最初に解凍する必要がない、圧縮された(gzip)グラフ・データの直接ロードのサポートが追加されました。

PGX分散エンジンの改良

リリース2.4に含まれるインメモリー・アナリスト(PGX)の分散グラフ処理実行エンジンに、いくつかの改良が加えられました。

- PGX.Dで、stringプロパティに対するtop-kおよびbottom-kがサポートされるようになりました。

- NULL値に関するバグが修正されました(Oracleバグ25491165)。

- 頂点タイプのエッジ・プロパティのサポートが追加されました。

- クライアント/サーバーAPIでサポートされるエンドポイントが拡張されました: rename()、getNeighbours()、getEdges()、getRandomVertex()、getRandomEdge()、getSource()およびgetDestination()のサポートが追加されました。

PGXの非推奨

非推奨になったものは次のとおりです。

- oracle.pgx.apiのPgxSparkContextが非推奨になりました。かわりに、oracle.pgx.api.spark1パッケージでこのクラスを使用してください。

- RESTエンドポイント/core/graph/<graphname>/randomNodeが非推奨になりました。かわりに/core/graph/<graphname/randomEntityを呼び出してください

- Sparkのグラフ構成フィールドskip_nodesおよびskip_edgesが非推奨になりました。かわりに、グラフ・ロード構成フィールドloading.skip_verticesおよびloading.skip_edgesを使用してください。

- グラフ構成メソッドisSkipNodes()およびisSkipEdges()が非推奨になりました。かわりに、skipVertexLoading()およびskipEdgeLoading()メソッドを使用してください。

- SALSAアルゴリズムalgorithms/link_prediction/salsa_deprecated.gmが非推奨になりました。かわりに、algorithms/ranking_and_walking/salsa.gmを使用してください。

- CALLER_THREAD PoolTypeが非推奨になりました。

- targetPoolを指定したRESTエンドポイント/core/analysis/<analysisId>が非推奨になりました。かわりに、workloadCharacteristicsフィールドを使用してください

- パス検索フィルタ引数タイプの使用が非推奨になりました。

- プロパティ・タイプDATEが非推奨になりました。かわりに、LOCAL_DATE、TIME、TIMESTAMP、TIME_WITH_TIMEZONEまたはTIMESTAMP_WITH_TIMEZONEを使用してください。

- RESTエンドポイントGET /core/graph/<graphname>/queryが非推奨になりました。問合せでは/core/graph/<graphname>/queryへのPOST、およびJSONペイロードではセマンティック・オプションを使用してください

- PGQLでは、ユーザー定義のパターン一致セマンティック(つまり、ISOMORPHISM / HOMOMORPHSIM)が非推奨になりました。homomorphismはデフォルト・セマンティックのままですが、新しい組込みPGQL関数all_different(v1, v2, ...)または非等価制約(たとえば、v1 != v2)のいずれかを使用して、isomorphismの制約を指定する必要があります。非推奨は次のとおりです。

- メソッドPgxGraph.queryPgql(String, PatternMatchingSemantic) (かわりに、PgxGraph.queryPgql(String)を使用してください)

- メソッドPgxSession.setPatternMatchingSemantic(..)

- 構成フィールドpattern_matching_semantic

Spark Vector APIの変更

次の機能がSpark Vector APIに追加されました。

- Spark Streaming APIの空間の変換

- Filter、flatMap、nearestNeighbors

- Java APIおよびScala API

- 2つの空間索引を使用した空間の結合

- Streaming APIのGeoEnrich変換

Vector REST APIの追加

次のAPIを使用できます。

- 次の操作を使用できるVector Hadoop REST API:

- 空間索引のリスト/作成/削除

- 空間索引を使用したレコードの空間的フィルタ処理

- カテゴリ化、クラスタ化、ビニング

- 次の操作を使用できるVector Spark REST API:

- 空間索引のリスト/作成/削除

- 空間索引を使用したレコードの空間的フィルタ処理

SpatialViewerの変更

Big Data Spatial Image Serverは、Oracle Big Data SpatialViewer Webアプリケーションに統合されました。SpatialViewerは、豊富なUIコンポーネントのセットを提供するOracle JETを使用します。

1 Big Data Spatial and Graphの概要

この章では、Oracle Spatial and Graphの空間、プロパティ・グラフ、およびマルチメディア分析機能についてのOracle Big Dataサポートの概要について説明します。

- Big Data Spatial and Graphについて
Oracle Big Data Spatial and Graphでは、サポートされているApache HadoopおよびNoSQL Database Big Dataプラットフォームに高度な空間およびグラフ分析機能を提供します。

- 空間機能
空間場所情報は、Big Dataでは共通の要素です。

- プロパティ・グラフ機能
グラフは頂点、エッジ、および頂点とエッジのプロパティとしてリンクされたデータのネットワークを管理します。グラフは一般的に、ソーシャル・ネットワーキング、サイバー・セキュリティ、ユーティリティおよび通信、ライフ・サイエンスと臨床データ、ナレッジ・ネットワークで検出される関係のモデル化、格納、および分析に使用されます。

- マルチメディア分析機能
Oracle Big Data Spatial and Graphのマルチメディア分析機能は、Apache Hadoopでビデオおよびイメージ・データを処理するためのフレームワークを提供します。このフレームワークにより、ビデオおよびイメージ・データの分散処理が可能になります。

- Oracle Big Data Appliance上でのOracle Big Data Spatial and Graphのインストール
Oracle Big Data Applianceソフトウェアをインストールおよび構成するためのMammothコマンドライン・ユーティリティを使用して、空間、プロパティ・グラフおよびマルチメディアの機能を含むOracle Big Data Spatial and Graphオプションをインストールすることもできます。

- Big Data Spatial Image Processing Frameworkのインストールおよび構成
Image Processing Frameworkのインストールおよび構成は、使用しているディストリビューションに応じて異なります。

- Big Data Spatial Image Serverのインストールおよび構成
Oracle Big Data Spatial Image Serverから、イメージのロードおよび処理のためのWebインタフェースを提供するイメージ処理フレームワークにアクセスできます。

- Oracle Big Data SpatialViewer Webアプリケーションのインストール
Oracle Big Data SpatialViewer Webアプリケーション(SpatialViewer)をインストールするには、このトピックの手順を実行します。

- CDHクラスタまたはその他ハードウェアでのプロパティ・グラフ・サポートのインストール
プロパティ・グラフはOracle Big Data Appliance上、またはコモディティ・ハードウェア上で使用できます。

- マルチメディア分析サポートのインストールおよび構成
マルチメディア分析機能を使用するには、ビデオ分析フレームワークをインストールし、構成する必要があります。

1.1 Big Data Spatial and Graphについて

Oracle Big Data Spatial and Graphでは、サポートされているApache HadoopおよびNoSQL Database Big Dataプラットフォームに高度な空間およびグラフ分析機能を提供します。

空間機能では、場所に関する情報のデータ・エンリッチメント、距離と場所による分析に基づいた空間のフィルタ処理とびカテゴリ化、およびデジタル地図、センサー、衛星画像と航空画像の値のベクトルおよびラスター処理を行う空間データ処理、地図のビジュアル化のためのAPIをサポートしています。

プロパティ・グラフ機能では、グラフ操作、索引付け、問合せ、検索、およびインメモリー分析のためにApache Hadoop HBaseおよびOracle NoSQL Databaseをサポートしています。

マルチメディア分析機能では、OpenCVを使用する組込みの顔認識を含め、Apache Hadoopの動画や画像データを処理するフレームワークを提供します。

1.2 空間機能

空間場所情報は、Big Dataでは共通の要素です。

ビジネスでは、異なるデータ・セットの関連付けとリンクのベースとして、空間データを使用できます。場所に関する情報は、別の人物、場所、オブジェクトに基づいて、あるいは特定のエリアでの存在に基づくエンティティの追跡とカテゴリ化にも使用できます。場所に関する情報によって、特定の地理に進む顧客に場所固有のジオフェンシングと呼ばれる情報提供を促進します。ジオリファレンスされた画像データや知覚データの分析は、ビジネスに様々なメリットをもたらします。

Oracle Big Data Spatial and Graphの空間機能では、次の各種サービスでこのようなユースケースをサポートしています。

ベクトル・サービス:

- ドキュメントとデータを、デフォルトの管理階層用に空間オブジェクト定義の都市や州、またはベクトルおよびラスター処理を行う空間データ処理緯度/経度情報と関連付ける機能

- GeoJSONファイル、Shapefiles、GML、およびWKTを含むテキストベースの2次元および3次元の地理空間形式のサポート、またはGeospatial Data Abstraction Library (GDAL)を使用したOracle SDO_Geometry, ST_Geometry、その他のサポート対象の形式の一般的な地理空間エンコーディングの使用

- データを様々な形式と座標系で調べ、カテゴリ化し、表示するためのHTML5ベースのマップ・クライアントAPIとサンプル・コンソール

- 位相的操作および距離演算: Anyinteract、Inside、Contains、Within Distance、Nearest Neighborなど

- データ簡易取得用の空間索引付け

ラスター・サービス:

- GDALでサポートされている多数のイメージ・ファイル形式、およびHDFSに格納されているイメージ・ファイルのサポート

- 使用できる一連のイメージを表示するサンプル・コンソール

- ラスター操作、包括、サブセット、ジオリファレンス、モザイク、および形式変換

1.3 プロパティ・グラフ機能

グラフは頂点、エッジ、および頂点とエッジのプロパティとしてリンクされたデータのネットワークを管理します。グラフは一般的に、ソーシャル・ネットワーキング、サイバー・セキュリティ、ユーティリティおよび通信、ライフ・サイエンスと臨床データ、ナレッジ・ネットワークで検出される関係のモデル化、格納、および分析に使用されます。

標準的なグラフ分析には、グラフのトラバース、推奨、コミュニティおよびインフルエンサの検出、パターン一致などがあります。グラフは、通信、ライフ・サイエンスおよびヘルスケア、セキュリティ、メディアおよび出版などの業種に活用できます。

Oracle Big Data Spatial and Graphのプロパティ・グラフ機能では、次の機能でこのようなユースケースをサポートしています。

- Apache HBaseおよびOracle NoSQL Databaseでのスケーラブルなグラフ・データベース

- Tinkerpop Blueprintsに基づく開発者ベースのAPI、およびJavaグラフAPI

- Apache LuceneおよびSolrCloudとの相互作用によるテキスト検索および問合せ

- GroovyおよびPythonのスクリプト言語サポート

- 並列のインメモリーグラフ分析エンジン

- ランキング、中心性、レコメンダ、コミュニティ検出、パス検索など、簡単でスケーラブルな一連のソーシャル・ネットワーク分析機能

- Oracle定義のフラット・ファイル形式でのプロパティ・グラフ・データの並列バルク・ロードおよびエクスポート

- JavaおよびTinkerpop Gremlin APIを実行するためのGroovyベース・コンソールによる管理機能

- プロパティ・グラフのサイズ変更の推奨事項

1.3.1 プロパティ・グラフのサイズ変更の推奨事項

プロパティ・グラフのインストールについての推奨事項を次に示します。

表1-1 プロパティ・グラフのサイズ変更の推奨事項

グラフ・サイズ

推奨の専用物理メモリー

推奨のCPUプロセッサ数

10から100Mエッジ

14GB RAMまで

2から4プロセッサ、計算が集中するワークロードの場合は16プロセッサまで

100Mから1Bエッジ

14GBから100GB RAM

4から12プロセッサ、計算が集中するワークロードの場合は16から32プロセッサまで

1Bエッジ以上

100GB RAM以上

12から32プロセッサ、特に計算が集中するワークロードの場合はそれ以上

1.4 マルチメディア分析機能

Oracle Big Data Spatial and Graphのマルチメディア分析機能は、Apache Hadoopでビデオおよびイメージ・データを処理するためのフレームワークを提供します。このフレームワークにより、ビデオおよびイメージ・データの分散処理が可能になります。

主なユースケースとしては、ビデオとイメージでの顔認識の実行があります。

1.5 Oracle Big Data Appliance上でのOracle Big Data Spatial and Graphのインストール

Oracle Big Data Applianceソフトウェアをインストールおよび構成するためのMammothコマンドライン・ユーティリティを使用して、空間、プロパティ・グラフおよびマルチメディアの機能を含むOracle Big Data Spatial and Graphオプションをインストールすることもできます。

このオプションは、初期ソフトウェア・インストール時、またはbdacliユーティリティの使用後に有効にできます。

Oracle NoSQL Databaseをグラフ・リポジトリとして使用するには、Oracle NoSQL Databaseクラスタが必要です。

Apache HBaseをグラフ・リポジトリとして使用するには、Apache Hadoopクラスタが必要です。

関連項目:

ソフトウェア構成手順の詳細は、『Oracle Big Data Applianceオーナーズ・ガイド』を参照してください。

1.6 Big Data Spatial Image Processing Frameworkのインストールおよび構成

Image Processing Frameworkのインストールおよび構成は、使用しているディストリビューションに応じて異なります。

- Oracle Big Data Applianceクラスタのディストリビューションは、設定があらかじめインストールされていますが、これを有効にするには、「Oracle Big Data ApplianceディストリビューションのためのImage Processing Frameworkのインストール」の手順の一部を実行する必要があります。

- 製品のディストリビューションについては、「その他のディストリビューション(Oracle Big Data Appliance以外)のImage Processing Frameworkのインストール」の手順に従ってください。

両方のディストリビューションについて:

- 「Cartographic Projections Libraryの取得およびコンパイル」で説明されているように、PROJライブラリをダウンロードおよびコンパイルする必要があります。

- インストール後は、これを検証します(「Image Processing Frameworkのインストール後の検証」を参照)。

- クラスタのセキュリティが有効である場合、ジョブを実行するユーザーがprincsリストに含まれており、有効なKerberosチケットを所有していることを確認してください。

- Cartographic Projections Libraryの取得およびコンパイル

- Oracle Big Data Applianceディストリビューション用のImage Processing Frameworkのインストール
Oracle Big Data Applianceディストリビューションには、事前にインストールされた構成が用意されていますが、イメージ処理フレームワークがインストールされていることを確認する必要があります。

- その他のディストリビューション(Oracle Big Data Appliance以外)のImage Processing Frameworkのインストール
Big Data Appliance以外の環境のBig Data Spatial and Graphでは、このセクションの手順を実行します。

- Image Processing Frameworkのインストール後の検証
次の検証操作を実行するために複数のテスト・スクリプトが用意されています。

1.6.1 Cartographic Projections Libraryの取得およびコンパイル

Image Processing Frameworkをインストールする前に、Cartographic Projections Libraryをダウンロードし、複数の関連操作を実行する必要があります。

1. PROJ.4ソース・コードおよびデータ・シフト・ファイルをダウンロードします。

$ wget http://download.osgeo.org/proj/proj-4.9.1.tar.gz
$ wget http://download.osgeo.org/proj/proj-datumgrid-1.5.tar.gz

2. ソース・コードを解凍し、データ・シフト・ファイルをnadサブディレクトリに抽出します。

$ tar xzf proj-4.9.1.tar.gz
$ cd proj-4.9.1/nad
$ tar xzf ../../proj-datumgrid-1.5.tar.gz
$ cd ..

3. PROJ.4を構成、作成およびインストールします。

$ ./configure
$ make
$ sudo make install
$ cd ..

これで、libproj.soが/usr/local/lib/libproj.soで使用可能になりました。

4. libproj.soファイルをspatialインストール・ディレクトリにコピーします。

cp /usr/local/lib/libproj.so /opt/oracle/oracle-spatial-graph/spatial/raster/gdal/lib/libproj.so

5. libproj.soライブラリの読取りおよび実行権限をすべてのユーザーに与えます

sudo chmod 755 /opt/oracle/oracle-spatial-graph/spatial/raster/gdal/lib/libproj.so

1.6.2 Oracle Big Data ApplianceディストリビューションのImage Processing Frameworkのインストール

Oracle Big Data Applianceディストリビューションには、事前にインストールされた構成が用意されていますが、イメージ処理フレームワークがインストールされていることを確認する必要があります。

「Cartographic Projections Libraryの取得およびコンパイル」で説明されているアクションが実行されていることにより、libproj.so (PROJ.4)がすべてのユーザーからアクセス可能であり、正しく設定されていることを確認してください。

OBDAの場合、次のディレクトリが存在することを確認してください。

- SHARED_DIR (クラスタ内のすべてのノードの共有ディレクトリ): /opt/shareddir

- ALL_ACCESS_DIR (hadoopグループへの書込みアクセス権を持つクラスタ内のすべてのノードの共有ディレクトリ): /opt/shareddir/spatial

1.6.3 その他のディストリビューション(Oracle Big Data Appliance以外)のImage Processing Frameworkのインストール

Big Data Appliance以外の環境のBig Data Spatial and Graphでは、このセクションの次の手順を実行します。

- その他のディストリビューションのImage Processing Frameworkをインストールするための前提条件

- その他のディストリビューションのImage Processing Frameworkのインストール

1.6.3.1 その他のディストリビューションのImage Processing Frameworkをインストールするための前提条件

- HADOOP_LIB_PATHが/usr/lib/hadoopにあることを確認します。ない場合はパスを検索し、HADOOP_LIB_PATHとして使用します。

- NFSをインストールします。

- 1つ以上のフォルダを作成し、このドキュメントでSHARED_FOLDERとして参照し、リソース・マネージャ・ノードではNFSからすべてのノード・マネージャ・ノードにアクセス可能にします。

- ジョブ実行に関連するすべてのユーザー、およびyarnユーザーにこのSHARED_FOLDERへの書込みアクセス権を付与します

- oracle-spatial-graph-<version>.x86_64.rpmをOracle E-Delivery Webサイトからダウンロードします。

- rpmコマンドを使用してoracle-spatial-graph-<version>.x86_64.rpmを実行します。

- rpmの実行後は、/opt/oracle/oracle-spatial-graph/spatial/rasterで作成したディレクトリ構造にフォルダconsole、examples、jlib、gdalおよびtestsがあることを確認します。また、index.htmlはコンテンツを表し、javadoc.zipにはAPIのJavadocがあります。

1.6.3.2 その他のディストリビューションのImage Processing Frameworkのインストール

1. 「Cartographic Projections Libraryの取得およびコンパイル」で説明されているように、ユーザーがlibproj.so (Proj.4) Cartographic Projections Libraryにアクセスできるようにします。

2. リソース・マネージャ・ノードでは、/opt/oracle/oracle-spatial-graph/spatial/raster/gdalのdataフォルダを次のようにSHARED_FOLDERにコピーします。

cp -R /opt/oracle/oracle-spatial-graph/spatial/raster/gdal/data SHARED_FOLDER

3. このジョブ実行に関連するすべてのユーザーの書込みアクセス権とともに、ALL_ACCESS_FOLDERにディレクトリSHARED_FOLDERを作成します。ジョブ結果は書込みアクセス権を持つyarnユーザーによって書き込まれるため、このユーザーも考慮します。この構成には、グループ・アクセスを使用できます。

共有フォルダに移動します。

cd SHARED_FOLDER

新しいディレクトリを作成します。

mkdir ALL_ACCESS_FOLDER

書込みアクセス権を提供します。

chmod 777 ALL_ACCESS_FOLDER

4. /opt/oracle/oracle-spatial-graph/spatial/raster/examplesのdataフォルダをALL_ACCESS_FOLDERにコピーします。

cp -R /opt/oracle/oracle-spatial-graph/spatial/raster/examples/data ALL_ACCESS_FOLDER

5. 次のように、data/xmlsフォルダに書込みアクセス権を提供します。または、testsやexamplesなど、ジョブを実行するユーザーに書込みアクセスがあることを確認します。

chmod 777 ALL_ACCESS_FOLDER/data/xmls/

1.6.4 Image Processing Frameworkのインストール後の検証

次の検証操作を実行するために複数のテスト・スクリプトが用意されています。

- イメージ・ロード機能のテスト

- イメージ処理機能のテスト

- 地図代数演算およびDEMでの傾斜計算の処理クラスのテスト

- モザイク・プロセスのない単一のラスターのイメージ処理の検証(マッピング・フェーズ内の陰影起伏を計算するユーザー指定の機能が含まれます)。

- マスク操作を使用した2つのラスターの処理のテスト

これらのスクリプトを実行して、イメージ処理フレームワークが正常にインストールされたことを検証します。

クラスタのセキュリティが有効である場合、現在のユーザーがprincsリストに含まれており、有効なKerberosチケットを所有していることを確認してください。

ユーザーがALL_ACCESS_FOLDERへの書込みアクセス権を持ち、このディレクトリの所有者グループに属していることを確認してください。Big Data Applianceのリソース・マネージャ・ノードでジョブを実行することをお薦めします。ジョブを別のノードで実行する場合、デフォルトはhadoopグループになります。

GDALが適切に機能するように、$LD_LIBRARY_PATHを使用してライブラリを使用可能にする必要があります。ジョブを実行する前に、共有ライブラリ・パスがシェル・ウィンドウに適切に設定されていることを確認してください。次に例を示します。

export LD_LIBRARY_PATH=$ALLACCESSDIR/gdal/native

- イメージ・ロードのテスト・スクリプト

- Image Processorテスト・スクリプト(モザイク化)

- 単一Image Processorテスト・スクリプト

- Image Processor DEMテスト・スクリプト

- 複数のラスター操作テスト・スクリプト

1.6.4.1 イメージ・ロードのテスト・スクリプト

このスクリプトでは、6つのテスト・ラスターのセットをHDFSのohiftestフォルダにロードしますが、そのうち3つのラスターはバイト・データ型と3つの帯域、1つのラスター(DEM)はfloat32データ型と1つの帯域、および2つのラスターはint32データ型と1つの帯域です。OBDA環境にはパラメータは不要であり、OBDA以外の環境では、ALL_ACCESS_FOLDER値のあるパラメータが1つ必要です。

内部的には、ジョブによってロード対象のラスターごとに分割が作成されます。分割サイズはブロック・サイズ構成によって決まります。たとえば、ブロック・サイズが64MB以下と構成されると、4つのマッパーが実行されます。その結果、ラスターがHDFSでロードされ、対応するサムネイルが作成され、視覚化されます。サムネイルを視覚化するには外部イメージ・エディタが必要であり、これらのサムネイルの出力パスは、ジョブの完了時にユーザーに表示されます。

テスト・スクリプトは次の場所にあります。

/opt/oracle/oracle-spatial-graph/spatial/raster/tests/runimageloader.sh

ODBA環境の場合は、次を入力します。

./runimageloader.sh

ODBA以外の環境の場合は、次を入力します。

./runimageloader.sh ALL_ACCESS_FOLDER

実行が完了すると、ファイルのある場所を示すHDFS内のパス(このパスはALL_ACCESS_FOLDERの定義によって異なります)、およびHDFSに作成されたイメージとサムネイルのリストを示すメッセージGENERATED OHIF FILES ARE LOCATED IN HDFS UNDERが表示されます。出力には次が含まれます。

“THUMBNAILS CREATED ARE:
----------------------------------------------------------------------
total 13532
drwxr-xr-x 2 yarn yarn 4096 Sep 9 13:54 .
drwxr-xr-x 3 yarn yarn 4096 Aug 27 11:29 ..
-rw-r--r-- 1 yarn yarn 3214053 Sep 9 13:54 hawaii.tif.ohif.tif
-rw-r--r-- 1 yarn yarn 3214053 Sep 9 13:54 inputimageint32.tif.ohif.tif
-rw-r--r-- 1 yarn yarn 3214053 Sep 9 13:54 inputimageint32_1.tif.ohif.tif
-rw-r--r-- 1 yarn yarn 3214053 Sep 9 13:54 kahoolawe.tif.ohif.tif
-rw-r--r-- 1 yarn yarn 3214053 Sep 9 13:54 maui.tif.ohif.tif
-rw-r--r-- 1 yarn yarn 4182040 Sep 9 13:54 NapaDEM.tif.ohif.tif
YOU MAY VISUALIZE THUMBNAILS OF THE UPLOADED IMAGES FOR REVIEW FROM THE FOLLOWING PATH:

インストールと構成が正常に終了しなかった場合は、出力は生成されず、次のようなメッセージが表示されます。

NOT ALL THE IMAGES WERE UPLOADED CORRECTLY, CHECK FOR HADOOP LOGS

マッパーとリデューサの実行に必要なメモリーの量は、構成されているHDFSのブロック・サイズによって異なります。デフォルトでは、1GBのメモリーがJavaに割り当てられていますが、この値および他のプロパティは、このテスト・ディレクトリに含まれるimagejob.propファイル内で変更できます。

1.6.4.2 Image Processorテスト・スクリプト(モザイク化)

このスクリプトでは、ハワイ諸島の3つのソース・ラスターとその3つをすべて含む座標のいくつかを設定して、プロセッサ・ジョブを実行します。このジョブでは、これらの座標に基づいてモザイクを作成し、その結果のラスターには、3つのラスターが1つにまとめられます。

runimageloader.shが前提条件として実行されるため、ソース・ラスターはHDFSにあります。バイト・データ型の3つの帯域ラスターがあります。

OBDA環境にはパラメータは不要であり、OBDA以外の環境では、ALL_ACCESS_FOLDER値のある"-s"パラメータが1つ必要です。

また、出力をHDFSに格納する場合は、"-o"パラメータを使用して、モザイク出力を格納するHDFSフォルダを設定します。

内部的に、ジョブは構成入力のxmlで指定されている座標を使用して四角形をフィルタ処理し、必要な四角形のみをマッパー上で処理するためフェーズが減少し、そのすべてを最終的なモザイク・ラスターにまとめられます。

テスト・スクリプトは次の場所にあります。

/opt/oracle/oracle-spatial-graph/spatial/raster/tests/runimageprocessor.sh

ODBA環境の場合は、次を入力します。

./runimageprocessor.sh

ODBA以外の環境の場合は、次を入力します。

./runimageprocessor.sh -s ALL_ACCESS_FOLDER

実行が成功したら、EXPECTED OUTPUT FILE IS: ALL_ACCESS_FOLDER/processtest/hawaiimosaic.tifというメッセージが、出力モザイク・ファイルへのパスとともに表示されます。出力には次が含まれます。

EXPECTED OUTPUT FILE IS: ALL_ACCESS_FOLDER/processtest/hawaiimosaic.tif
total 9452
drwxrwxrwx 2 hdfs    hdfs    4096 Sep 10 09:12 .
drwxrwxrwx 9 zherena dba     4096 Sep  9 13:50 ..
-rwxrwxrwx 1 yarn    yarn 4741101 Sep 10 09:12 hawaiimosaic.tif

MOSAIC IMAGE GENERATED
----------------------------------------------------------------------
YOU MAY VISUALIZE THE MOSAIC OUTPUT IMAGE FOR REVIEW IN THE FOLLOWING PATH: ALL_ACCESS_FOLDER/processtest/hawaiimosaic.tif”

インストールと構成が正常に終了しなかった場合は、出力は生成されず、次のようなメッセージが表示されます。

MOSAIC WAS NOT SUCCESSFULLY CREATED, CHECK HADOOP LOGS TO REVIEW THE PROBLEM

HDFSでの出力記憶域をテストするには、次のコマンドを使用します

ODBA環境の場合は、次を入力します。

./runimageprocessor.sh -o hdfstest

ODBA以外の環境の場合は、次を入力します。

./runimageprocessor.sh -s ALL_ACCESS_FOLDER -o hdfstest

1.6.4.3 単一Image Processorテスト・スクリプト

このスクリプトは、単一ラスターのプロセッサ・ジョブを実行します。この場合は、ナパ・バレー北部のDEMソース・ラスターです。このジョブの目的は、マッピング・フェーズ用として構成されているユーザー処理クラスを使用して完全な入力を処理することです。このクラスは、DEMの陰影起伏を計算し、これが出力ファイルに設定されます。ここではモザイク操作は実行されません。

ソース・ラスターがHDFS内に存在するように、runimageloader.shを前提条件として実行する必要があります。これは、float 32データ型のDEMラスター1つの帯域です。

OBDA環境にはパラメータは不要であり、OBDA以外の環境では、ALL_ACCESS_FOLDER値のある"-s"パラメータが1つ必要です。

テスト・スクリプトは次の場所にあります。

/opt/oracle/oracle-spatial-graph/spatial/raster/tests/runsingleimageprocessor.sh

ODBA環境の場合は、次を入力します。

./runsingleimageprocessor.sh

ODBA以外の環境の場合は、次を入力します。

./runsingleimageprocessor.sh -s ALL_ACCESS_FOLDER

実行が成功したら、EXPECTED OUTPUT FILE: ALL_ACCESS_FOLDER/processtest/NapaSlope.tifというメッセージが、出力DEMファイルへのパスとともに表示されます。出力には次が含まれます。

EXPECTED OUTPUT FILE: ALL_ACCESS_FOLDER/processtest/NapaDEM.tif
total 4808
drwxrwxrwx 2 hdfs    hdfs    4096 Sep 10 09:42 .
drwxrwxrwx 9 zherena dba     4096 Sep  9 13:50 ..
-rwxrwxrwx 1 yarn    yarn 4901232 Sep 10 09:42 NapaDEM.tif
IMAGE GENERATED
----------------------------------------------------------------------

YOU MAY VISUALIZE THE OUTPUT IMAGE FOR REVIEW IN THE FOLLOWING PATH: ALL_ACCESS_FOLDER/processtest/NapaDEM.tif”

インストールと構成が正常に終了しなかった場合は、出力は生成されず、次のようなメッセージが表示されます。

IMAGE WAS NOT SUCCESSFULLY CREATED, CHECK HADOOP LOGS TO REVIEW THE PROBLEM

1.6.4.4 Image Processor DEMテスト・スクリプト

このスクリプトはナパ・バレー北部のDEMソース・ラスター、およびそれを取り囲む座標を使用してプロセッサ・ジョブを実行します。このジョブでは、これらの座標に基づいてモザイクを作成し、モザイク構成XMLで処理クラスを設定して、その傾斜も計算します。

runimageloader.shが前提条件として実行されるため、ソース・ラスターはHDFSにあります。これは、float 32データ型のDEMラスター1つの帯域です。

OBDA環境にはパラメータは不要であり、OBDA以外の環境では、ALL_ACCESS_FOLDER値のある"-s"パラメータが1つ必要です。

テスト・スクリプトは次の場所にあります。

/opt/oracle/oracle-spatial-graph/spatial/raster/tests/runimageprocessordem.sh

ODBA環境の場合は、次を入力します。

./runimageprocessordem.sh

ODBA以外の環境の場合は、次を入力します。

./runimageprocessordem.sh -s ALL_ACCESS_FOLDER

実行が成功したら、EXPECTED OUTPUT FILE: ALL_ACCESS_FOLDER/processtest/NapaSlope.tifというメッセージが、傾斜出力ファイルへのパスとともに表示されます。出力には次が含まれます。

EXPECTED OUTPUT FILE: ALL_ACCESS_FOLDER/processtest/NapaSlope.tif
total 4808
drwxrwxrwx 2 hdfs    hdfs    4096 Sep 10 09:42 .
drwxrwxrwx 9 zherena dba     4096 Sep  9 13:50 ..
-rwxrwxrwx 1 yarn    yarn 4901232 Sep 10 09:42 NapaSlope.tif
MOSAIC IMAGE GENERATED
----------------------------------------------------------------------

YOU MAY VISUALIZE THE MOSAIC OUTPUT IMAGE FOR REVIEW IN THE FOLLOWING PATH: ALL_ACCESS_FOLDER/processtest/NapaSlope.tif”

インストールと構成が正常に終了しなかった場合は、出力は生成されず、次のようなメッセージが表示されます。

MOSAIC WAS NOT SUCCESSFULLY CREATED, CHECK HADOOP LOGS TO REVIEW THE PROBLEM

また、“if”代数関数もテストして、このラスターで2500を超える値のあるピクセルすべてを、コマンドラインで“–c”フラグを使用して設定した値で置き換えます。次に例を示します。

ODBA環境の場合は、次を入力します。

./runimageprocessordem.sh –c 8000

ODBA以外の環境の場合は、次を入力します。

./runimageprocessordem.sh -s ALL_ACCESS_FOLDER –c 8000

出力ファイルを視覚化すると、単純な傾斜計算と変更後の出力に注目し、ピクセル値が2500を超えているエリアがより鮮明になることを確認できます。

1.6.4.5 複数のラスター操作テスト・スクリプト

このスクリプトは、米国カリフォルニア州ナパ・バレー北部の非常に小さい地域を網羅する2つのラスターのプロセッサ・ジョブを実行します。

これらのラスターは同じMBR、ピクセル・サイズ、SRIDおよびデータ型を持ち、これらはすべて、複雑な複数のラスター操作処理に必要です。このジョブの目的は、2番目のラスターの値がマスク・リストに含まれるかどうかを検証するためにこのラスター内のすべてのピクセルを確認するmask操作を使用して両方のラスターを処理することです。そうである場合、出力ラスターはこの出力セルの最初のラスターのピクセル値を持ちます。そうでない場合、ゼロ(0)値が設定されます。ここではモザイク操作は実行されません。

runimageloader.shが前提条件として実行されるため、ソース・ラスターはHDFSにあります。これらは、int32データ型のラスターの1つの帯域です。

OBDA環境にはパラメータは不要です。OBDA以外の環境では、ALL_ACCESS_FOLDER値のある-sパラメータが1つ必要です。

テスト・スクリプトは次の場所にあります。

/opt/oracle/oracle-spatial-graph/spatial/raster/tests/runimageprocessormultiple.sh

ODBA環境の場合は、次を入力します。

./runimageprocessormultiple.sh

ODBA以外の環境の場合は、次を入力します。

./runimageprocessormultiple.sh -s ALL_ACCESS_FOLDER

実行が成功したら、EXPECTED OUTPUT FILE: ALL_ACCESS_FOLDER/processtest/MaskInt32Rasters.tifというメッセージが、マスク出力ファイルへのパスとともに表示されます。出力には次が含まれます。

EXPECTED OUTPUT FILE: ALL_ACCESS_FOLDER/processtest/MaskInt32Rasters.tif
total 4808
drwxrwxrwx 2 hdfs    hdfs    4096 Sep 10 09:42 .
drwxrwxrwx 9 zherena dba     4096 Sep  9 13:50 ..
-rwxrwxrwx 1 yarn    yarn 4901232 Sep 10 09:42 MaskInt32Rasters.tif
IMAGE GENERATED
----------------------------------------------------------------------

YOU MAY VISUALIZE THE OUTPUT IMAGE FOR REVIEW IN THE FOLLOWING PATH: ALL_ACCESS_FOLDER/processtest/MaskInt32Rasters.tif”

インストールと構成が正常に終了しなかった場合は、出力は生成されず、次のようなメッセージが表示されます。

IMAGE WAS NOT SUCCESSFULLY CREATED, CHECK HADOOP LOGS TO REVIEW THE PROBLEM

1.7 Big Data Spatial Image Serverのインストールおよび構成

Oracle Big Data Spatial Image Serverから、イメージのロードおよび処理のためのWebインタフェースを提供するイメージ処理フレームワークにアクセスできます。

Spatial Image Serverのインストールおよび構成は、使用しているディストリビューションに応じて異なります。

インストールを実行した後、これを検証してください。

- Oracle Big Data ApplianceのImage Serverのインストールおよび構成

- その他システム(Big Data Appliance以外)のImage Server Webのインストールおよび構成

- Image Serverコンソールのインストール後の検証の例

- 用意されているImage Server Webサービスの使用

1.7.1 Oracle Big Data ApplianceのImage Serverのインストールおよび構成

用意されているスクリプトを使用して自動インストールを実行するには、次の手順を実行します。

1. 次のスクリプトを実行します。

sudo /opt/oracle/oracle-spatial-graph/spatial/configure-server/install-bdsg-consoles.sh

インストール後にアクティブ・ノードが変更された場合、Webコンソールで構成を更新してください。

2. サーバーを起動します。

cd /opt/oracle/oracle-spatial-graph/spatial/web-server
sudo ./start-server.sh

エラーが発生した場合、/opt/oracle/oracle-spatial-graph/spatial/configure-serverにあるREADMEファイルを参照してください。

前述の手順により、サーバー全体が構成されます。これ以上の構成が必要ない場合、「Image Serverコンソールのインストール後の検証例」に直接進むことができます。

追加情報が必要であったり他のアクションを実行したりする必要がある場合は、次のトピックを参照してください。

- 手動インストールを実行するための前提条件

- Oracle Big Data ApplianceでのImage Server Webの依存関係のインストール

- Big Data Applianceの環境の構成

1.7.1.1 手動インストールを実行するための前提条件

前提条件のソフトウェアがインストールされていることを確認してください。

1. JettyやTomcatなどのWebサーバーをOracle DBAリソース・マネージャ・ノードにダウンロードします。

2. 次のように、imageserver.warファイルをWebサーバーwebappsディレクトリに解凍します。

unzip /opt/oracle/oracle-spatial-graph/spatial/jlib/imageserver.war -d WEB_SERVER_HOME/webapps/imageserver

注意:

ファイルを解凍するディレクトリまたは場所は、この手順ではWEB_SERVER_HOMEとします。

3. Hadoopの依存関係を次のようにコピーします。

cp /opt/cloudera/parcels/CDH/lib/hadoop/client/* WEB_SERVER_HOME/webapps/imageserver/WEB-INF/lib/

注意:

WebサーバーのインストールがOracle以外のDBAクラスタ上で行われている場合、/opt/cloudera/parcels/CDH/lib/hadoop/を実際のHadoopライブラリ・パス(デフォルトでは/usr/lib/hadoop)に置き換えてください。

1.7.1.2 Oracle Big Data ApplianceでのImage Server Webの依存関係のインストール

1. /opt/oracle/oracle-spatial-graph/spatial/raster/jlib/asm-3.1.jarの下にあるasm-3.1.jarファイルをWEB_SDERVER_HOME/webapps/imageserver/WEB-INF/libにコピーします。

注意:

jersey-core* jarは、duplicated at WEB_SERVER_HOME/webapps/imageserver/WEB-INF/libで複製されます。次のステップの場合のように、必ず古いものを削除し、フォルダ内にjersey-core-1.17.1.jarのみを残してください。

2. 次のコマンドを入力します。

ls -lat jersey-core*

3. リストされているライブラリを削除しますが、jersey-core-1.17.1.jarは削除しないでください。

4. 同じディレクトリ(WEB_SERVER_HOME/webapps/imageserver/WEB-INF/lib)内で、xercesImplおよびservlet jarファイルを削除します。

rm xercesImpl*
rm servlet*

5. Webサーバーを起動します
ポートを変更する必要がある場合、ポートを指定します。たとえば、Jettyサーバーの場合は、jetty.http.port=8081を設定します。

次のような警告はすべて無視します。

java.lang.UnsupportedOperationException:  setXIncludeAware is not supported on this JAXP implementation or earlier: class oracle.xml.jaxp.JXDocumentBuilderFactory

1.7.1.3 Big Data Applianceの環境の構成

1. http://thehost:8045/imageserverのアドレスをブラウザのアドレス・バーに入力して、Webコンソールを開きます。

2. 「Hadoop Configuration Parameters」セクションの「Administrator」タブ、次に「Configuration」タブから、クラスタ構成に応じてこの3つのプロパティを変更します。

a. fs.defaultFS: ユーザーのクラスタで有効なnamenodeをhdfs://<namenode>:8020の形式で入力します(この情報については、管理者に確認してください)。

b. yarn.resourcemanager.scheduler.address: ユーザーのクラスタの有効なリソース・マネージャ。<shcedulername>:8030。これはスケジューラ・アドレスです。

c. yarn.resourcemanager.address: <resourcename>:8032形式の有効なリソース・マネージャ・アドレス

注意:

構成の他の部分については、デフォルト値のままにします。これらはOracle Big Data Applianceクラスタ環境にあらかじめロードされています。

3. 「Apply Changes」をクリックして、変更を保存します。

ヒント:

不足している構成情報については、コンソールの「Hadoop Loader」タブで確認できます。

1.7.2 その他システム(Big Data Appliance以外)のImage Server Webのインストールおよび構成

その他システム(Big Data Appliance以外)のImage Server Webをインストールおよび構成するには、次のトピックを参照してください。

- その他システムでImage Serverをインストールするための前提条件

- その他システムでのImage Server Webのインストール

- その他システムの環境の構成

1.7.2.1 その他システムでImage Serverをインストールするための前提条件

その他システムでImage Server Webをインストールする前に、「その他のディストリビューション(Oracle Big Data Appliance以外)のImage Processing Frameworkのインストール」に指定されているとおり、Image Processing Frameworkをインストールする必要があります。

1.7.2.2 その他システムでのImage Server Webのインストール

その他システムでImage Server Webをインストールするステップは、BDAでインストールする場合のステップと同じです。

- 「手動インストールを実行するための前提条件」に指定されている手順を実行します。

- 「Oracle Big Data ApplianceでのImage Server Webの依存性のインストール」に示す手順を実行します。

- 「その他システムの環境の構成」に示す手順を実行します。

1.7.2.3 その他システムの環境の構成

1. 「Big Data Applianceの環境の構成」で説明されているように、環境を構成します 次に、次の手順を続けます。

2. 「Global Init Parameters」セクションの「Configuration」タブから、クラスタ構成に応じてこの3つのプロパティを変更します。

a. shared.gdal.data: gdal共有データ・フォルダを指定します。「その他のディストリビューション(Oracle Big Data Appliance以外)のImage Processing Frameworkのインストール」の手順に従ってください。

b. gdal.lib: .soライブラリの場所。

c. start: イメージの参照を開始する共有フォルダを指定します。このフォルダはクラスタとNFSマウント・ポイント(SHARED_FOLDER)の間で共有する必要があります。

d. saveimages: start (SHARED-FOLDER)に完全な書込みアクセス権のあるsaveimagesという子フォルダを作成します。たとえば、start=/homeの場合はsaveimages=/home/saveimagesです。

e. nfs.mountpoint: クラスタにSHARED_FOLDERにアクセスするマウント・ポイントが必要な場合は、マウント・ポイントを指定します。たとえば、/net/homeです。それ以外の場合は、空のままにしてください。

3. 「Hadoop Configuration Parameters」セクションの「Configuration」タブから、次のプロパティを更新します。

a. yarn.application.classpath: 必要なjarと依存関係を検索するHadoopのクラスパス。これは通常、/usr/lib/hadoopにあります。次に例を示します。

/etc/hadoop/conf/,/usr/lib/hadoop/*,/usr/lib/hadoop/lib/*,/usr/lib/hadoop-hdfs/*,/usr/lib/hadoop-hdfs/lib/*,/usr/lib/hadoop-yarn/*,/usr/lib/hadoop-yarn/lib/*,/usr/lib/hadoop-mapreduce/*,/usr/lib/hadoop-mapreduce/lib/*

注意:

構成の他の部分については、デフォルト値のままにします。

4. 「Apply Changes」をクリックして、変更を保存します。

ヒント:

不足している構成情報については、コンソールの「Hadoop Loader」タブで確認できます。

1.7.3 Image Serverコンソールのインストール後の検証の例

この例では、次を実行します。

- ローカル・サーバーからHDFS Hadoopクラスタにイメージをロードします。

- モザイク・イメージ・ファイルおよび複数のイメージのあるカタログを作成するジョブを実行します。

- モザイク・イメージを表示します。

- ローカル・サーバーからHDFS Hadoopクラスタへのイメージのロード

- モザイク・イメージとカタログの作成

- 地球からのモザイクの直接作成

- 地球からの傾斜イメージの直接作成

- 複数のラスター代数演算の作成

- 同一ラスターの削除

1.7.3.1 ローカル・サーバーからHDFS Hadoopクラスタへのイメージのロード

1. コンソール: http://<oracle_big_data_spatial_vector_console>:8045を開きます。

2. 「Raster」タブをクリックします。

3. 「Select File or Path」をクリックし、一連のハワイのイメージを含むデモ・フォルダ(/opt/shareddir/spatial/data/rasters)を参照します。

4. rastersフォルダをクリックし、「Load images」をクリックします。

「Images loaded successfully」というメッセージが表示されるまで待ちます。

注意:

ラスター・ファイルが見つからない場合は、インストール中に作成される共有ディレクトリ・フォルダにそれらをコピーできます。「Admin」タブでディレクトリの場所を確認し、ラスター・ファイルをその場所にコピーします。

1.7.3.2 モザイク・イメージとカタログの作成

1. 「Raster Processing」タブに移動します。

2. 「Catalog」メニューから「Catalog」、「New Catalog」、「HDFS Catalog」の順に選択します。

新しいカタログが作成されます。

3. 「Imagery」メニューから「Imagery」、「Add hdfs image」の順に選択します。

4. HDFSホストを参照し、イメージを追加します。

ここでホストからロードしたすべてのイメージを使用して、新しいファイル・ツリーが作成されます。

5. hdfsの下にあるnewdataフォルダを参照し、イメージを確認します。

6. 事前ビジュアライザにリストされているイメージを選択し、「Add」をクリックします。

イメージが下部のサブ・パネルに追加されます。

7. 「Add images」をクリックします。

イメージがメイン・カタログに追加されます。

8. カタログを保存します。

9. 「Imagery」メニューから「Imagery」、「Mosaic」の順に選択します。

10. testFS.xmlファイルを/opt/shareddir/spatial/data/xmlsから$HOMEディレクトリにコピーします。

11. 「Load default configuration file」をクリックし、デフォルトのホーム・ディレクトリを参照し、testFS.xmlを選択します。

注意:

デフォルトの構成ファイルtestFS.xmlはデモに含まれています。

12. 「Create Mosaic」をクリックします。

イメージの作成が完了するまで待ちます。

13. オプションで、イメージをダウンロードして格納するには、「Download」をクリックします。

1.7.3.3 地球からのモザイクの直接作成

1. 「Hadoop Raster Viewer」タブに移動します。

2. 「Refresh Footprint」をクリックし、すべての足跡がパネルに表示されるまで待ちます。

3. 「Select Footprints」をクリックしてから、目的の領域を選択し、必要に応じてズームインまたはズームアウトします。

4. 必要に応じて、ラスターを削除または無視します。

結果内に同一のラスターがある場合、これらは黄色で表示されます

5. 地図を右クリックし、「Generate Mosaic」を選択します。

6. モザイクを配置する出力フォルダを指定するか、既存の構成ファイルをロードします。

7. モザイク内のすべてのピクセルに演算を追加するには、「Advanced Configuration」をクリックします。

8. 「Create Mosaic」をクリックし、結果を待ちます。

9. 選択を削除する必要がある場合、地図の左上隅にある赤い円をクリックします。

注意:

モザイクをHDFS上で作成することを要求した場合、HDFSにイメージがロードされるまで待ちます。

10. オプションで、イメージをダウンロードして表示するには、「Download」をクリックします。

1.7.3.4 地球からの傾斜イメージの直接作成

1. 「Hadoop Raster Viewer」タブに移動します(または留まります)。

2. 「Refresh Footprint」をクリックし、すべての足跡がパネルに表示されるまで待ちます。

3. 必要に応じて、ラスターを削除または無視します。

結果内に同一のラスターがある場合、これらは黄色で表示されます

4. イメージを右クリックし、「Process Image(No Mosaic)」を選択します。

5. 傾斜イメージを配置する出力フォルダを指定するか、既存の構成ファイルをロードします。

6. 6.正しいピクセル・タイプを選択します。(通常、これらのイメージはFloat 32ビットです。)

7. 7.「Add Process Class」をクリックし、プロセス・クラスを追加します。フレームワークには、傾斜用のデフォルトのプロセス・クラスoracle.spatial.hadoop.imageprocessor.process.ImageSlopeが用意されています。

8. モザイク内のすべてのピクセルに演算を追加するには、「Advanced Configuration」をクリックします。

9. 「Create Mosaic」をクリックし、結果を待ちます。

10. I10.別の傾斜を生成する必要がある場合、「Go Back」をクリックします。

注意:

モザイクをHDFS上で作成することを要求した場合、HDFSにイメージがロードされるまで待ちます。

11. オプションで、イメージをダウンロードして格納するには、「Download」をクリックします。

1.7.3.5 複数のラスター代数演算の作成

1. 「Hadoop Raster Viewer」タブに移動します(または留まります)。

2. 「Refresh Footprint」をクリックし、すべての足跡がパネルに表示されるまで待ちます。

3. 必要に応じて、ラスターを削除または無視します。

結果内に同一のラスターがある場合、これらは黄色で表示されます

4. 4.黄色い同一のラスターを処理のために右クリックします。

5. 「Process Rasters with Same MBR」をクリックします。

6. モザイクを配置する出力フォルダを指定するか、既存の構成ファイルをロードします。

7. 「Advanced Configuration」をクリックします。

8. 8.右側のパネルから「Multiple Complex Raster Operation」を選択します。(1つのオプションのみが許可されています。)

9. 「Create Mosaic」をクリックし、結果を待ちます。

10. I10.別のイメージを生成する必要がある場合、「Go Back」をクリックします。

注意:

モザイクをHDFS上で作成することを要求した場合、HDFSにイメージがロードされるまで待ちます。

11. オプションで、イメージをダウンロードして格納するには、「Download」をクリックします。

1.7.3.6 同一ラスターの削除

1. 「Raster Mapviewer Globe」タブに移動します。

2. 「Refresh Footprint」をクリックし、すべての足跡がパネルに表示されるまで待ちます。

結果内に同一のラスターがある場合、これらは黄色で表示されます。

3. 同一のラスターのペアごとに、これらの1つを選択して削除する場合、その黄色いボックスを右クリックします。

新しいダイアログ・ボックスが表示されます。

4. ラスターを削除するには、そのXボタンをクリックします。

5. サムネイルを表示するには、イメージ内でクリックします。

1.7.4 用意されているImage Server Webサービスの使用

Image Serverには、すぐに使用できるWebサービスが2つ用意されており、1つはHDFSローダー用、もう1つがHDFSモザイク・プロセッサ用です。

これらのサーバーは、Javaアプリケーションから呼び出すことができます。これらは現在、GET操作に対してのみサポートされています。これらを呼び出すための形式は、次のとおりです。

- ローダー: http://host:port/imageserver/rest/hdfsloader?path=string&overlap=string
path: 処理対象のイメージ。単一のファイルのパスである場合、または1つ以上のフォルダ全体のパスである場合もあります。複数のフォルダの場合、カンマを使用してフォルダ名を区切ります。

overlap (オプション): 大文字間の重複(デフォルト = 10)。

- モザイク: http://host:port/imageserver/rest/mosaic?mosaic=string&config=string
mosaic: 処理対象のイメージが含まれるXMLモザイク・ファイル。Image Server Webアプリケーションを使用している場合、XMLファイルが自動的に生成されます。モザイクXMLファイルの例は、次のとおりです。

<?xml version='1.0'?>
<catalog type='HDFS'>
<image>
<source>Hadoop File System</source>
<type>HDFS</type>
<raster> /hawaii.tif.ohif</raster>
<bands datatype='1' config='1,2,3'>3</bands>
</image>
<image>
<source>Hadoop File System</source>
<type>HDFS</type>
<raster>/ /kahoolawe.tif.ohif</raster>
<bands datatype='1' config='1,2,3'>3</bands>
</image>
</catalog>

config: 構成ファイル。Image Server Webアプリケーションを使用してモザイクが初めて処理されるときに作成されます。構成ファイルの例は、次のとおりです

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<mosaic>
<output>
<SRID>26904</SRID>
<directory type = "FS">/net/system123/scratch/user3/installers</directory>
<tempFsFolder>/net/system123/scratch/user3/installers</tempFsFolder>
<filename>test</filename>
<format>GTIFF</format>
<width>1800</width>
<height>1406</height>
<algorithm order = "0">1</algorithm>
<bands layers = "3"/>
<nodata>#000000</nodata>
<pixelType>1</pixelType>
</output>
<crop>
<transform>294444.1905688362,114.06068372059636,0,2517696.9179752027,0,-114.06068372059636</transform>
</crop>
<process/>
<operations>
<localnot/>
</operations>
</mosaic>

Javaの例: ローダーの使用

public class RestTest
public static void main(String args[]) {

try {
// Loader http://localhost:7101/imageserver/rest/hdfsloader?path=string&overlap=string
// Mosaic http://localhost:7101/imageserver/rest/mosaic?mosaic=string&config=string
String path = "/net/system123/scratch/user3/installers/hawaii/hawaii.tif";

URL url = new URL(
"http://system123.example.com:7101/imageserver/rest/hdfsloader?path=" +
path + "&overlap=2"); // overlap its optional

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
//conn.setRequestProperty("Accept", "application/json");

if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}

BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));

String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
System.out.println(output);
}

conn.disconnect();

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}
}
}

Javaの例: モザイク・プロセッサの使用

public class NetClientPost {
public static void main(String[] args) {

try {
String mosaic = "<?xml version='1.0'?>\n" +
"<catalog type='HDFS'>\n" +
"    <image>\n" +
"       <source>Hadoop File System</source>\n" +
"       <type>HDFS</type>\n" +
"       <raster>/user/hdfs/newdata/net/system123/scratch/user3/installers/hawaii/hawaii.tif.ohif</raster>\n" +
"       <url>http://system123.example.com:7101/imageserver/temp/862b5871973372aab7b62094c575884ae13c3a27_thumb.jpg</url>\n" +
"       <bands datatype='1' config='1,2,3'>3</bands>\n" +
"    </image>\n" +
"</catalog>";
String config = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n" +
"<mosaic>\n" +
"<output>\n" +
"<SRID>26904</SRID>\n" +
"<directory type=\"FS\">/net/system123/scratch/user3/installers</directory>\n" +
"<tempFsFolder>/net/system123/scratch/user3/installers</tempFsFolder>\n" +
"<filename>test</filename>\n" +
"<format>GTIFF</format>\n" +
"<width>1800</width>\n" +
"<height>1269</height>\n" +
"<algorithm order=\"0\">1</algorithm>\n" +
"<bands layers=\"3\"/>\n" +
"<nodata>#000000</nodata>\n" +
"<pixelType>1</pixelType>\n" +
"</output>\n" +
"<crop>\n" +
"<transform>739481.1311601736,130.5820811245199,0,2254053.5858749463,0,-130.5820811245199</transform>\n" +
"</crop>\n" +
"<process/>\n" +
"</mosaic>";
System.out.println ("asdf");
URL url2 = new URL("http://192.168.1.67:8080" );
HttpURLConnection conn2 = (HttpURLConnection) url2.openConnection();
conn2.setRequestMethod("GET");
if (conn2.getResponseCode() != 200 ) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn2.getResponseCode());
}
/*URL url = new URL("http://system123.example.com:7101/imageserver/rest/mosaic?" +("mosaic=" + URLEncoder.encode(mosaic, "UTF-8") + "&config=" +
URLEncoder.encode(config, "UTF-8")));
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");

if (conn.getResponseCode() != 200 ) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
String output;System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null)
System.out.println(output);
conn.disconnect();*/

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

1.8 Oracle Big Data SpatialViewer Webアプリケーションのインストール

Oracle Big Data SpatialViewer Webアプリケーション(SpatialViewer)をインストールするには、このトピックの手順を実行します。

- SpatialViewerの前提

- Oracle Big Data ApplianceでのSpatialViewerのインストール

- その他システム(Big Data Appliance以外)のSpatialViewerのインストール

- Oracle Big Data ApplianceでのSpatialViewerの構成

- その他システム(Big Data Appliance以外)のSpatialViewerの構成

関連項目:

Oracle Big Data SpatialViewer Webアプリケーションの使用

1.8.1 SpatialViewerの前提

次の前提がSpatialViewerのインストールと構成に適用されます。

- ここで説明するAPIおよびジョブを、Cloudera CDH5.7、Hortonworks HDP 2.4、または同様のHadoop環境で実行します。

- ユーザーの環境に、Java 8以降のバージョンを用意しておきます。

- Big Data Spatial Image Processing Frameworkのインストールおよび構成で説明されているように、イメージ処理フレームワークがインストールされています 。

1.8.2 Oracle Big Data ApplianceでのSpatialViewerのインストール

次のように、Big Data ApplianceにSpatialViewerをインストールできます

1. 次のスクリプトを実行します。

sudo /opt/oracle/oracle-spatial-graph/spatial/configure-server/install-bdsg-consoles.sh

2. 次のコマンドの1つを使用してWebアプリケーションを起動します(2番目のコマンドを使用すると、ログを表示できます)。

sudo service bdsg start
sudo /opt/oracle/oracle-spatial-graph/spatial/web-server/start-server.sh

エラーが発生した場合、/opt/oracle/oracle-spatial-graph/spatial/configure-serverにあるREADMEファイルを参照してください。

3. http://<oracle_big_data_spatial_vector_console>:8045/spatialviewer/を開きます

4. インストール後にアクティブ・ノードが変更された場合、またはKerberosが有効である場合、「Oracle Big Data ApplianceでのSpatialViewerの構成」で説明されているように、構成ファイルを更新します。

5. オプションで、サンプル・データ(他のトピックの例で使用されているもの)をHDFSにアップロードします。

sudo -u hdfs hadoop fs -mkdir /user/oracle/bdsg
sudo -u hdfs hadoop fs -put /opt/oracle/oracle-spatial-graph/spatial/vector/examples/data/tweets.json /user/oracle/bdsg/

1.8.3 その他システム(Big Data Appliance以外)のSpatialViewerのインストール

「Oracle Big Data ApplianceでのSpatialViewerのインストール」で説明されている手動構成の手順に従います。

次に、「その他システム(Big Data Appliance以外)のSpatialViewerの構成」で説明されているように、構成を変更します

1.8.4 Oracle Big Data ApplianceでのSpatialViewerの構成

Oracle Big Data ApplianceでSpatialViewerを構成するには、次の手順に従います。

1. コンソールhttp://<oracle_big_data_spatial_vector_console>:8045/spatialviewer/?root=swadminを開きます

2. 必要に応じて、一般構成を変更します。

- ローカル作業ディレクトリ: SpatialViewerローカル作業ディレクトリ。絶対パス。デフォルトのディレクトリ/usr/oracle/spatialviewerは、SpatialViewerのインストール時に作成されます。

- HDFS作業ディレクトリ: SpatialViewer HDFS作業ディレクトリ。デフォルトのディレクトリ/user/oracle/spatialviewerは、SpatialViewerのインストール時に作成されます。

- Hadoop構成ファイル: Hadoop構成ディレクトリ。デフォルトでは、/etc/hadoop/confです

- eLocation URL: eLocationの背景地図を取得するために使用されるURL。デフォルトでは、http://elocation.oracle.comです

- Kerberosキータブ: Kerberosが有効である場合、キータブ・ファイルが含まれるファイルへのフル・パスを入力します。

- ログの表示: 必要に応じて、「Spatial Jobs」画面でジョブの表示を無効にします。ログがデフォルトの形式でない場合、この表示を無効にします。デフォルトの形式は、Date LogLevel LoggerName: LogMessageです
日付は、デフォルトの形式(yyyy-MM-dd HH:mm:ss,SSS)である必要があります。たとえば、2012-11-02 14:34:02,781です。

ログが表示されず、「Display logs」フィールドが「Yes」に設定されている場合、yarn-site.xml内のyarn.log-aggregation-enableがtrueに設定されていることを確認します。また、Hadoopジョブ構成パラメータyarn.nodemanager.remote-app-log-dirおよびyarn.nodemanager.remote-app-log-dir-suffixがyarn-site.xmlの場合と同じ値に設定されていることも確認してください。

3. 必要に応じて、ラスター構成を変更します。

- 共有ディレクトリ: 別のノードとの間の読取りおよび書込みに使用するディレクトリ。共有され、最大の権限があるか、少なくともHadoopユーザー・グループに存在する必要があります。

- ネットワーク・ファイル・システム・マウント・ポイント: 共有フォルダを表示でき、個別にアクセスできるNFSマウント・ポイント。非分散環境を使用している場合、空白にできます。

- 共有GDALデータ・ディレクトリ: GDAL共有データ・フォルダ。共有ディレクトリである必要があります。(その他のディストリビューション(Oracle Big Data Appliance以外)のImage Processing Frameworkのインストールの手順を参照してください。)

4. 必要に応じて、Hadoop構成を変更します。

5. 必要に応じて、Spark構成を変更します。

6. Kerberosが有効である場合、次のパラメータを追加することが必要な場合があります。

- spark.authenticate: trueに設定する必要があります

- spark.authenticate.enableSaslEncryption: クラスタ構成に応じて値をtrueまたはfalseに設定します。

- spark.yarn.keytab: プリンシパルのキータブが含まれるファイルへのフル・パス

- spark.yarn.principal: Kerberosにログインするために使用されるプリンシパル。通常のKerberos V5プリンシパルの形式は、primary/instance@REALMです。

7. Linuxシステムでは、セキュアなコンテナ・エグゼキュータをLinuxContainerExecutorに変更する必要がある場合があります。そのためには、次のパラメータを設定します。

- yarn.nodemanager.container-executor.classをorg.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutorに設定します。

- yarn.nodemanager.linux-container-executor.groupをhadoopに設定します。

8. ユーザーがキータブ・ファイルを読み取ることができることを確認します。

9. クラスタのすべてのノード上の同じ場所にキータブ・ファイルをコピーします。

1.8.5 その他システム(Big Data Appliance以外)のSpatialViewerの構成

「Oracle Big Data ApplianceでのSpatialViewerの構成」で説明した手順を実行します。

また、Hadoopプロパティyarn.application.classpath値/opt/cloudera/parcels/CDH/lib/を実際のライブラリ・パス(デフォルトでは/usr/lib/)に置き換えることにより、Hadoop構成を変更します。

1.9 CDHクラスタまたはその他ハードウェアでのプロパティ・グラフ・サポートのインストール

プロパティ・グラフはOracle Big Data Appliance上、またはコモディティ・ハードウェア上で使用できます。

- Apache HBaseの前提条件

- プロパティ・グラフのインストール手順

- プロパティ・グラフのインストール・ディレクトリについて

- インメモリー・アナリスト使用のオプションのインストール・タスク

関連項目:

プロパティ・グラフ・サポートの構成

1.9.1 Apache HBaseの前提条件

HBaseでのプロパティ・グラフ・サポートのインストールには、次の前提条件が適用されます。

- Linuxオペレーティング・システム

- Cloudera's Distribution including Apache Hadoop (CDH)
ソフトウェアのダウンロードについては、次を参照してください: http://www.cloudera.com/content/cloudera/en/products-and-services/cdh.html

- Apache HBase

- Java Development Kit (JDK) (Java 8以上)

これらの製品のサポート・バージョンおよび相互依存性の詳細は、My Oracle Supportノートを参照してください。

1.9.2 プロパティ・グラフのインストール手順

プロパティ・グラフ・サポートをインストールするには、次の手順を実行します。

1. ソフトウェア・パッケージを解凍します。

rpm -i oracle-spatial-graph-<version>.x86_64.rpm

デフォルトでは、ソフトウェアはディレクトリ/opt/oracle/にインストールされます

インストールが完了すると、property_graphサブディレクトリのあるopt/oracle/oracle-spatial-graphディレクトリが作成されます。

2. JAVA_HOME環境変数を設定します。次に例を示します。

setenv JAVA_HOME  /usr/local/packages/jdk8

3. PGX_HOME環境変数を設定します。次に例を示します。

setenv PGX_HOME /opt/oracle/oracle-spatial-graph/pgx

4. HBaseを使用する場合は、Apache Hadoopクラスタ内のHBaseリージョン・サーバーすべてにHBASE_HOME環境変数を設定します。(HBASE_HOMEはhbaseインストール・ディレクトリの場所を示します。)次に例を示します。

setenv HBASE_HOME /usr/lib/hbase

Big Data Applianceの一部のインストールでは、Apache HBaseは次のようなディレクトリに置かれます: /opt/cloudera/parcels/CDH-5.3.3-1.cdh5.3.3.p0.5/lib/hbase/

5. HBaseを使用する場合は、データ・アクセス・レイヤー・ライブラリを$HBASE_HOME/libにコピーします。次に例を示します。

cp /opt/oracle/oracle-spatial-graph/property_graph/lib/sdopgdal*.jar $HBASE_HOME/lib

6. 他のチューニング・トピックに示すとおり、HBaseまたはOracle NoSQL Database構成を調整します。

7. adminユーザーとしてCloudera Managerにログインし、HBaseサービスを再起動します。再起動すると、Region Serverの新しい構成設定の使用が有効になります。

1.9.3 プロパティ・グラフのインストール・ディレクトリについて

Oracle Big Data Spatial and Graphプロパティ・グラフ機能のインストール・ディレクトリの構造は次のとおりです。

$ tree -dFL 2 /opt/oracle/oracle-spatial-graph/property_graph/
/opt/oracle/oracle-spatial-graph/property_graph/
|-- dal
|   |-- groovy
|   |-- opg-solr-config
|   `-- webapp
|-- data
|-- doc
|   |-- dal
|   `-- pgx
|-- examples
|   |-- dal
|   |-- pgx
|   `-- pyopg
|-- lib
|-- librdf
`-- pgx
|-- bin
|-- conf
|-- groovy
|-- scripts
|-- webapp
`-- yarn

1.9.4 インメモリー・アナリスト使用のオプションのインストール・タスク

プロパティ・グラフ・サポートがHadoopのないクライアントにインストールされている場合に、Hadoop Distributed File System (HDFS)に格納されているグラフ・データをインメモリー・アナリストに読み込んでその結果をHDFSに書き込み、インメモリー・アナリストの開始、監視および停止にHadoop NextGen MapReduce (YARN)スケジューリングを使用するには、このインストール・タスクを実行します。

- Hadoopのインストールと構成

- Hadoopでのインメモリー・アナリストの実行

1.9.4.1 Hadoopのインストールと構成

Hadoopをインストールして構成するには、次の手順を実行します。

1. Cloudera CDHのサポート対象のバージョン用に、tarballをダウンロードします。

2. 選択したディレクトリにtarballを解凍します。次に例を示します。

tar xvf hadoop-2.5.0-cdh5.2.1.tar.gz -C /opt

3. HADOOP_HOME環境変数がインストール・ディレクトリを指し示すよう指定します。次に例を示します。

export HADOOP_HOME=/opt/hadoop-2.5.0-cdh5.2.1

4. $HADOOP_HOME/binをPATH環境変数に追加します。次に例を示します。

export PATH=$HADOOP_HOME/bin:$PATH

5. HadoopクラスタのHDFS名前ノードを指し示すように、$HADOOP_HOME/etc/hadoop/hdfs-site.xmlを構成します。

6. Hadoopクラスタのリソース・マネージャ・ノードを指し示すように、$HADOOP_HOME/etc/hadoop/yarn-site.xmlを構成します。

7. HadoopクラスタのHDFS名前ノードを指し示すように、$HADOOP_HOME/etc/hadoop/core-site.xmlのfs.defaultFSフィールドを構成します。

1.9.4.2 Hadoopでのインメモリー・アナリストの実行

インメモリー分析およびHDFSを使用してJavaアプリケーションを実行する場合は、$HADOOP_HOME/etc/hadoopがクラスパス上にあり、構成がHadoopクライアント・ライブラリで選択されるようにします。ただし、インメモリー・アナリスト・シェルを使用する場合は、HADOOP_HOMEが設定されていれば自動的に$HADOOP_HOME/etc/hadoopがクラスパスに追加されるため、これは必要ありません。

その他のCloudera Hadoopライブラリ(JARファイル)をクラスパスに配置する必要はありません。YARNライブラリは、インメモリー・アナリストをYARNサービスとして起動する場合のみ必要です。これは、必要なJARファイルすべてがローカル・インストールからクラスパスに自動的に追加されるyarnコマンドを実行して行います。

これで、HDFSからデータをロードするか、インメモリー・アナリストをYARNサービスとして開始できるようになります。Hadoopの詳細は、CDH 5.x.xのドキュメントを参照してください。

1.10 マルチメディア分析サポートのインストールおよび構成

マルチメディア分析機能を使用するには、ビデオ分析フレームワークをインストールし、構成する必要があります。

- マルチメディア分析の前提およびライブラリ

- トランスコーディング・ソフトウェア(オプション)

1.10.1 マルチメディア分析の前提およびライブラリ

Oracle Big Data Spatial and GraphおよびOracle Big Data Applianceのライセンスが供与されている場合は、マルチメディア分析のビデオ分析フレームワークもインストールされ、構成されています。ただし、/opt/oracle/oracle-spatial-graph/multimediaを指し示すように$MMA_HOMEを設定する必要があります。

そうでない場合は、次のようにCloudera CDH 5または同様のHadoop環境でフレームワークをインストールできます。

1. クラスタの各ノード上で、次のコマンドを使用してフレームワークをインストールします。

rpm2cpio oracle-spatial-graph-<version>.x86_64.rpm | cpio -idmv

dcliユーティリティを使用できます(クラスタ全体でのdcliユーティリティを使用したコマンドの実行を参照してください)。

2. /opt/oracle/oracle-spatial-graph/multimediaを指し示すように$MMA_HOMEを設定します。

3. 次のライブラリの場所を特定します。

- Hadoop jarファイル($HADOOP_HOME/jarsで使用可能)

- ビデオ処理ライブラリ(「トランスコーディング・ソフトウェア(オプション)」を参照)

- OpenCVライブラリ(製品で使用可能)

4. $MMA_HOME/opencv_3.1.0/libのすべてのlib*ファイルを、ネイティブのHadoopライブラリの場所にコピーします。
Oracle Big Data Applianceでは、この場所は/opt/cloudera/parcels/CDH/lib/hadoop/lib/nativeです。

5. 必要であれば、ビデオ・データをトランスコーディングするために必要なビデオ処理ソフトウェアをインストールします(「トランスコーディング・ソフトウェア(オプション)」を参照)。

1.10.2 トランスコーディング・ソフトウェア(オプション)

ビデオ・データのトランスコーディングには、次のオプションを使用できます。

- JCodec

- FFmpeg

- サード・パーティ・トランスコーディング・ソフトウェア

製品に同梱されているJCodecでマルチメディア分析を使用するには、顔認識のHadoopジョブの実行中に、oracle.ord.hadoop.ordframegrabberプロパティをoracle.ord.hadoop.decoder.OrdJCodecFrameGrabberの値に設定します

FFmpegでマルチメディア分析を使用するには:

1. https://www.ffmpeg.org/からFFmpegをダウンロードします。

2. Hadoopクラスタ上でFFmpegをインストールします

3. oracle.ord.hadoop.ordframegrabberプロパティをoracle.ord.hadoop.decoder.OrdFFMPEGFrameGrabberの値に設定します

カスタム・ビデオ・デコーディング・ソフトウェアでマルチメディア分析を使用するには、抽象クラスoracle.ord.hadoop.decoder.OrdFrameGrabberを実装します。詳細は、Javadocを参照してください

2 Big Data Spatial and Graphおよび空間データの使用

この章では、ビッグ・データ環境での空間データのロード、格納、アクセス、および使用に関する概念と使用状況の情報について説明します。

- 空間データに対するBig Data Spatial and Graphのサポートについて
Oracle Big Data Spatial and Graphの機能では、位置情報に基づく意思決定のために、空間データを迅速かつ効率的に格納、アクセス、および分析できます。

- Oracle Big Dataベクトル・データおよびラスター・データの処理
Oracle Big Data Spatial and Graphでは、ベクトルおよびラスター空間データの両方の保管と処理をサポートしています。

- ラスター・データ処理のためのOracle Big Data Spatial Hadoop Image Processing Framework
Oracle Spatial Hadoop Image Processing Frameworkを使用すると、一連の並列処理フェーズの結果として生成される新しい結合イメージの作成が可能になります。

- Image Loaderを使用したHadoopへのイメージのロード
Oracle Spatial and Graph Hadoop Image Processing Frameworkを使用してイメージを処理するには、最初にイメージを実際にHDFSに保存し、次に各イメージをそれぞれ別のスマート・タイルに保存します。

- Oracle Spatial Hadoop Image Processorを使用したイメージの処理
イメージはHDFSにロードされると、Oracle Spatial Hadoop Image Processing Frameworkによって並列で処理されます。

- Oracle Spatial Hadoop Raster Processing APIを使用したイメージのロードおよび処理
このフレームワークでは、XMLを作成せずに、Javaアプリケーションを使用してラスターをロードし、処理するラスター処理APIが用意されています。このアプリケーションはクラスタ内またはリモート・ノード上で実行できます。

- Oracle Spatial Hadoop Raster Simulator Frameworkを使用したラスター処理のテスト
カスタム処理クラスを作成する場合、Oracle Spatial Hadoop Raster Simulator Frameworkを使用して、これらをOracle Raster Processing Frameworkにプラグインすることを「偽装」することにより、次を実行できます。

- Oracle Big Data Spatial Raster Processing for Spark
Oracle Big Data Spatial Raster Processing for Apache Sparkは、Spatial Raster Processing API for Javaです。

- Oracle Big Data Spatial Vector Analysis
Oracle Big Data Spatial Vector AnalysisはSpatial Vector Analysis APIであり、Hadoopジョブとして実行され、HDFSに格納されているデータの空間処理のためのMapReduceコンポーネントを提供します。

- Oracle Big Data Spatial Vector Analysis for Spark
Oracle Big Data Spatial Vector Analysis for Apache Sparkは、空間の変換およびアクション、空間のパーティショニングおよび索引付けをサポートしている空間対応のRDD (Resilient Distributed Datasets)が用意されたSpatial Vector Analysis API for Java and Scalaです。

- Oracle Big Data Spatial Vector Hive Analysis
Oracle Big Data Spatial Vector Hive Analysisには、Hiveを使用してデータを分析するために空間関数が用意されています。

- Oracle Big Data SpatialViewer Webアプリケーションの使用
Oracle Big Data SpatialViewer Webアプリケーション(SpatialViewer)を使用すると、様々なタスクを実行できます。

- Oracle Big Data Spatial and Graph Image Serverコンソールの使用
Oracle Big Data Spatial and Graph Image Serverコンソールを使用して、モザイクを作成するためのイメージのロードなどのタスクを実行できます。

2.1 空間データに対するBig Data Spatial and Graphのサポートについて

Oracle Big Data Spatial and Graphの機能では、位置情報に基づく意思決定のために、空間データを迅速かつ効率的に格納、アクセス、および分析できます。

空間データは、実際の空間または地理情報システム(GIS)やその他の位置情報アプリケーション上の概念的な空間に関連する実際、または概念的なオブジェクトの位置特性を表します。

空間機能を使用して、特定の位置の2次元および3次元の地理イメージに対して位置情報を付加、補完、視覚化、変換、ロード、処理を行い、GIS機能におけるジオメトリ形状を操作します。

- Big Data Spatial and Graph on Apache Hadoopとは

- Oracle Big Data Spatial and Graphの利点

- Oracle Big Data Spatialの機能

- Oracle Big Data Spatialのファイル、形式、およびソフトウェア要件

2.1.1 Big Data Spatial and Graph on Apache Hadoopとは

Oracle Big Data Spatial and Graph on Apache Hadoopとは、MapReduceプログラムとHadoopクラスタの分析機能を使用して空間データを格納し、データにアクセスし、分析するフレームワークです。空間機能によってスキーマが提供され、空間データ・コレクションの格納、取得、更新、および問合せが容易になります。Big Data Spatial and Graph on Hadoopでは、ジオメトリ形状、ラスターまたはベクトル・イメージのいずれかの空間イメージの格納と処理をサポートしており、サポート対象の数百種類の形式のいずれかで保存されます。

注意:

空間のコンセプト、データ、および操作の概要は、『Oracle Spatial and Graph開発者ガイド』を参照してください

2.1.2 Oracle Big Data Spatial and Graphの利点

Oracle Big Data Spatial and Graphの使用には、次の利点があります。

- 一部のGISを中心とした空間処理システムやエンジンとは異なり、Oracle Big Data Spatial and Graphでは、空間情報が構造化されていても、構造化されていなくても処理が可能です。

- 顧客の環境で保存するデータ形式が1つに限定されることはありません。空間データと空間以外のビジネスデータの両方が保存されていても、Oracle Big Dataで空間処理を実行できます。

- これはフレームワークであるため、顧客は提供されているAPIを使用して、アプリケーションや操作をカスタムで作成できます。

- Oracle Big Data Spatialでは、ベクトル・タイプとラスター・タイプの両方の情報やイメージを処理できます。

2.1.3 Oracle Big Data Spatialの機能

空間データはSpatialサーバーによって問合せと分析のためにロードされ、イメージはイメージ処理フレームワークによって保存され、処理されます。Oracle Big Data Spatial and Graphサーバーは、Hadoop上で次のために使用できます。

- 地勢図上の足跡、ジオメトリのリソースの可用性などの地理空間情報のカタロギング。

- 地図上の位置で最も近い距離などを計算する距離演算の位相処理。

- 地図要素内で人口統計の相関を作成することによって、階層型の地勢図を構築し、地図を補完するためのカテゴリ化。

Oracle Big Data Spatial and Graphには、次の機能が組み込まれています。

- 空間データをすばやく取得するための索引付け機能。

- 地図上に足跡を表示するマップ機能。

- 特定の地勢地域をズームインおよびズームアウトするズーム機能。

- モザイク操作またはサブセット操作の作成を処理するために一連のイメージ・ファイルをグループ化するモザイクおよびグループ機能。

- デカルトおよび測地座標系で、空間データを表すデカルトおよび測地座標の機能。

- 国、州、都市、郵便番号などのジオメトリック階層を構築し、関連付ける階層機能。この機能では、ドキュメントまたは緯度/経度座標の形式で入力データを処理できます。

2.1.4 Oracle Big Data Spatialのファイル、形式、およびソフトウェア要件

空間データやイメージは、サポートされている次のいずれかの形式で格納されています。

- GeoJSONファイル

- Shapefiles

- 測地およびデカルト・データ

- その他のGDALサポート形式

空間データを保管し、処理するには、次のソフトウェアが必要です。

- Java Runtime

- GCCコンパイラ - GDALサポート対象の形式が使用されている場合のみ

2.2 Oracle Big Dataベクトル・データおよびラスター・データの処理

Oracle Big Data Spatial and Graphでは、ベクトルおよびラスター空間データの両方の保管と処理をサポートしています。

- Oracle Big Data Spatialラスター・データの処理

- Oracle Big Data Spatialベクトル・データの処理

2.2.1 Oracle Big Data Spatialラスター・データの処理

ラスター・データの処理では、GDALローダーがラスター空間データまたはイメージをHDFS環境にロードします。ラスター空間データでは、次の基本操作を実行できます。

- モザイク: 複数のラスター・イメージを組み合せて単一のモザイク・イメージを作成します。

- サブセット: 個々のイメージに対してサブセット操作を実行します。

- ラスター代数演算: ラスター内のすべてのピクセルに対して代数演算を実行します(add、divide、multiply、log、pow、sine、sinhおよびacosなど)。

- ユーザー定義の処理: ラスター処理は、マッピング・フェーズおよびリデュース・フェーズで実行されるようユーザーが設定するクラスに基づいています。

この機能は、ラスター分析操作のためのMapReduceフレームワークをサポートしています。ユーザーは、ラスター・データの代数関数などの独自のラスター操作をカスタムで構築できます。たとえば、地形など、数値標高モデルや空間的表面の3次元の表現の各基盤の傾斜を計算します。詳細は、「ラスター・データ処理のためのOracle Big Data Spatial Hadoop Image Processing Framework」を参照してください。

2.2.2 Oracle Big Data Spatialベクトル・データの処理

この機能は、空間ベクトル・データの処理をサポートしています。

- Hadoop HDFS環境へのロードおよび格納

- デカルトまたは測地データとして格納

格納された空間ベクトル・データは次の問合せ操作などの実行に使用されます。

- ポイントインポリゴン

- 距離計算

- Anyinteract

- バッファ作成

空間ベクトル・データでは、複数のデータ・サービス操作がサポートされています。

- データ・エンリッチメント

- データ・カテゴリ化

- 空間の結合

また、HTML5形式にのみ限定されますが、Map Visualization APIもサポートされています。このようなAPIにアクセスして、カスタム操作を作成できます。詳細は、「Oracle Big Data Spatial Vector Analysis」を参照してください。

2.3 ラスター・データ処理のためのOracle Big Data Spatial Hadoop Image Processing Framework

Oracle Spatial Hadoop Image Processing Frameworkを使用すると、一連の並列処理フェーズの結果として生成される新しい結合イメージの作成が可能になります。

次の機能が含まれます。

- HDFSイメージ・ストレージでは、各ブロック・サイズ分割が個別の四角形として格納され、その後のそれぞれの処理に使用されます

- MapReduceフレームワークを使用した、サブセット操作、ユーザー定義操作、および地図代数演算の並列処理

- マッピング・フェーズまたはリデュース・フェーズで透過的に並列して実行されるカスタム処理クラスの追加機能

- ジオリファレンスされるイメージの高速処理

- GDAL形式、複数帯域イメージ、DEM (数値標高モデル)、複数ピクセル深度、およびSRIDのサポート

- Java APIでは、WebサービスまたはスタンドアロンJavaアプリケーションに使用できるフレームワーク操作にアクセスできます

- ローカル環境でユーザー処理クラスをテストおよびデバッグするためのフレームワーク

Oracle Spatial Hadoop Image Processing Frameworkは、LoaderとProcessorと呼ばれる2つのモジュールで構成されており、次の図に示すように、それぞれがHadoopクラスタ内の別のステージで実行されるHadoopジョブで表されます。また、Image Server Webアプリケーションを使用してイメージをロードおよび処理し、Java APIを使用してフレームワークの機能を公開できます。

インストールと構成について詳しくは、次を参照してください。

- Oracle Big Data Appliance上でのOracle Big Data Spatial and Graphのインストール

- Big Data Spatial Image Processing Frameworkのインストールおよび構成

- Big Data Spatial Image Serverのインストールおよび構成

- Image Loader

- Image Processor

- Image Server

2.3.1 Image Loader

Image Loaderは、特定のイメージまたはイメージ・グループをHDFSにロードするHadoopジョブの1つです。

- イメージはインポート中、HDFSブロックとして四角形処理され、格納されます。

- GDALはイメージの四角形処理に使用されます。

- それぞれの四角形は個々のマッパーによってロードされるため、並列で読み取られ、高速になります。

- それぞれの四角形は一定のバイト数(ユーザー入力)が重なっているため、隣接する四角形の領域にかかっています。

- MapReduceジョブでは、それぞれの四角形の情報をロードするマッパーを使用します。マッパーの数は、四角形の数、イメージ解像度、およびブロック・サイズに応じて'n'個になります。

- イメージごとのリデュース・フェーズでは、マッパーによってロードされた情報をすべてまとめ、そのイメージを解像度、帯域、オフセット、イメージ・データを含む特別な.ohif形式で格納します。これにより、それぞれの四角形を含むファイル・オフセットとノード場所が明らかになります。

- それぞれの四角形には、各帯域の情報が含まれます。これは、一部の四角形のみを処理し、それに対応するブロックのみをロードする場合に役立ちます。

次の図はImage Loaderの処理を示しています。

2.3.2 Image Processor

Image Processorは、ユーザー入力に基づいて処理対象の四角形をフィルタ処理し、並列処理によって新しい1つのイメージを作成するためのHadoopジョブです。

- ユーザーが識別した特定のイメージの四角形を処理します。識別できる処理クラスは1つ、ゼロ、または複数です。これらのクラスは、構成に応じてマッピング・フェーズまたはリデュース・フェーズで実行されます。マッピング・フェーズの場合、処理クラスの実行後、モザイク操作を実行し、ピクセルを調整してユーザーが要求した最終的な出力形式にします。モザイク操作が要求されなかった場合、入力ラスターがそのままリデュース・フェーズに送信されます。リデュース・フェーズの場合、ユーザー・リデュース処理クラス用として入力されるGDALデータ・セットにすべての四角形がまとめられます。これにより、ユーザーのニーズに応じて最終出力を変更または分析できるようになります。

- マッパーは、データのローカル性を保ちながら、1つの四角形に対応するデータをロードします。

- データがロードされると、マッパーはユーザーが要求した帯域をフィルタ処理します。

- フィルタされた情報は、リデュース・フェーズで各マッパーに送信され、そこでバイト数がまとめられ、ユーザーの要求に応じて最終的な処理イメージがHDFSまたは通常のファイル・システムに格納されます。

次の図はImage Processorジョブを示しています。

2.3.3 Image Server

Image Serverは、特にHadoop File System (HDFS)など、様々なソースのイメージをロードし、処理できるWebアプリケーションです。このOracle Image Serverには、複数の主なアプリケーションがあります。

- 地球全体のラスターの視覚化、および地図上で直接選択してモザイクを作成する機能。

- ソース・イメージからカタログを作成し、単一の単位に処理するラスター・イメージ処理。イメージのサムネイルも表示できます。

- クラスタ接続パラメータの設定、およびジョブの初期設定に使用するHadoopコンソール構成。

2.4 Image Loaderを使用したHadoopへのイメージのロード

Oracle Spatial and Graph Hadoop Image Processing Frameworkを使用してイメージを処理するには、最初にイメージを実際にHDFSに保存し、次に各イメージをそれぞれ別のスマート・タイルに保存します。

ここでは、四角形をそれぞれ使用してジョブを処理できます。Image Loaderでは、単一イメージ、またはイメージのコレクションを並列でHDFSにインポートできるため、ロード時間を短縮できます。

Image Loaderはファイル・システムのイメージをHDFSにインポートし、そこでブロックにイメージのすべての帯域のデータを含められるため、特定の位置でその後処理が必要になった場合、その情報を単一ノードで処理できます。

- イメージ・ロード・ジョブ

- 入力パラメータ

- 出力パラメータ

2.4.1 イメージ・ロード・ジョブ

イメージ・ロード・ジョブには、イメージを関連イメージに分割するカスタム入力形式があります。分割は、次の方法で特定される、定義済の領域をカバーするイメージの四角形のブロックを読み取るアルゴリズムに基づいて計算されます

領域 = ((ブロックサイズ - メタデータ・バイト数) / 帯域数) / 1ピクセル当たりのバイト数。

ブロック・サイズ全体を使用しない部分については、残りのバイト数がゼロで埋められます。

分割は複数のマッパーに割り当てられ、そこでImageSplit情報に基づき、割当て済の四角形がすべてGDALによって読み取られます。その結果、ImageDataWritableインスタンスが作成され、コンテキストに保存されます。

ImageDataWritableインスタンスのメタデータ・セットは、四角形処理したイメージを操作および処理できるように、処理クラスでの設定に使用されます。ソース・イメージは複数のマッパーから読み取られるため、並列ロードが高速で実行されます。

マッパーが読取りを完了すると、 リデューサがコンテキストから四角形を選択してまとめ、ファイルをHDFSに保存します。イメージを再度読み取るには、特殊な読取り処理が必要です。

2.4.2 入力パラメータ

次の入力パラメータをHadoopコマンドに指定します。

hadoop jar /opt/oracle/oracle-spatial-graph/spatial/raster/jlib/hadoop-imageloader.jar
-files <SOURCE_IMGS_PATH>
-out <HDFS_OUTPUT_FOLDER>
-gdal <GDAL_LIB_PATH>
-gdalData <GDAL_DATA_PATH>
[-overlap <OVERLAPPING_PIXELS>]
[-thumbnail <THUMBNAIL_PATH>]
[-expand <false|true>]
[-extractLogs <false|true>]
[-logFilter <LINES_TO_INCLUDE_IN_LOG>]

説明:

- SOURCE_IMGS_PATHはソース・イメージまたはフォルダのパスです。入力が複数の場合はカンマで区切ります。NFSを介してクラスタ内のすべてにアクセスできるパスを指定する必要があります。

- HDFS_OUTPUT_FOLDERはロードしたイメージを格納するHDFS出力フォルダです。

- OVERLAPPING_PIXELSはそれぞれの四角形の境界線上で重なるピクセルの任意の数であり、このパラメータが指定されていない場合、重なっている2つのピクセルのデフォルトが使用されます。

- GDAL_LIB_PATHはGDALライブラリの場所を示すパスです。

- GDAL_DATA_PATHはGDALデータ・フォルダの場所を示すパスです。NFSを介してクラスタ内のすべてにアクセスできるパスを指定する必要があります。

- THUMBNAIL_PATHはロードしたイメージのサムネイルを格納する任意のパスです。NFSを介してクラスタ内のすべてにアクセスでき、Yarnユーザーの書込みアクセス権のあるパスを指定する必要があります。

- -expandは、ロードされたラスターのHDFSパスによってソース・パス(すべてのディレクトリを含む)が拡張されるかどうかを制御します。これをfalseに設定すると、.ohifファイルは、(-oオプションを使用して指定された)出力ディレクトリに直接格納され、この場合、このラスター内のこのディレクトリのパスは含まれません。

- -extractLogsは、実行したアプリケーションのログをシステムの一時ディレクトリに抽出するかどうかを制御します。デフォルトでは有効ではありません。抽出には、Oracle Frameworkクラスの一部ではないログは含まれません。

- -logFilter <LINES_TO_INCLUDE_IN_LOG>は、たとえば、カスタム処理クラス・パッケージを含めるために、抽出したログに含めるすべてのパターンがリストされたカンマ区切りの文字列です。

たとえば、次のコマンドでは、imagesフォルダ内のジオリファレンスされたイメージすべてをロードし、該当するすべての境界線に重なる10ピクセルを追加します。HDFS出力フォルダはohiftestであり、ロードしたイメージのサムネイルがprocesstestフォルダに格納されます。

hadoop jar /opt/oracle/oracle-spatial-graph/spatial/raster/jlib/hadoop-imageloader.jar   -files /opt/shareddir/spatial/demo/imageserver/images/hawaii.tif -out ohiftest -overlap 10 -thumbnail /opt/shareddir/spatial/processtest –gdal /opt/oracle/oracle-spatial-graph/spatial/raster/gdal/lib –gdalData /opt/shareddir/data

デフォルトでは、マッパーとリデューサは2GBのJVMを取得できるよう構成されていますが、この設定、またはその他のジョブ構成プロパティは、コマンドを実行する同じフォルダの場所で、ユーザーがimagejob.propプロパティ・ファイルを追加することによってオーバーライドできます。このプロパティ・ファイルは、オーバーライドする構成プロパティをすべてリストできます。次に例を示します。

mapreduce.map.memory.mb=2560
mapreduce.reduce.memory.mb=2560
mapreduce.reduce.java.opts=-Xmx2684354560
mapreduce.map.java.opts=-Xmx2684354560

Javaヒープ・メモリー(java.optsプロパティ)は、マッパーとリデューサ(mapreduce.map.memoryとmapreduce.reduce.memory)に割り当てられたメモリーの合計以下である必要があります。したがって、Javaヒープ・メモリーを増やす場合、マッパーとリデューサのメモリーも増やすことが必要である場合があります。

GDALが適切に機能するように、$LD_LIBRARY_PATHを使用してライブラリを使用可能にする必要があります。ジョブを実行する前に、共有ライブラリ・パスがシェル・ウィンドウに適切に設定されていることを確認してください。次に例を示します。

export LD_LIBRARY_PATH=$ALLACCESSDIR/gdal/native

2.4.3 出力パラメータ

リデューサは、入力イメージごとに2つの出力ファイルを生成します。1つ目は、ソース・イメージのすべての四角形を集める.ohifファイルであり、それぞれの四角形は処理マッパーによって別のインスタンスとして処理されます。四角形は内部でHDFSブロックとして格納されます。ブロックは複数のノードに配置され、1つのノードには特定の.ohifファイルのブロックが1つ以上含まれます。.ohifファイルは、–expandが使用されなかった場合、/user/<USER_EXECUTING_JOB>/OUT_FOLDER/<PARENT_DIRECTORIES_OF_SOURCE_RASTER>フォルダの下にあるユーザー指定フォルダに、-outフラグを付けて格納されます。それ以外の場合、.ohifは/user/<USER_EXECUTING_JOB>/OUT_FOLDER/に配置され、このファイルはoriginal_filename.ohifとして識別できます。

2つ目の出力は、メタデータ・ファイルに関連しており、イメージのすべてのピースをリストし、それぞれがカバーする座標を示します。ファイルはメタデータの場所にあるHDFSに置かれており、その名前はohifファイルの名前を使用してハッシュ生成されます。このファイルはOracle内部専用であり、ソース・ラスターの重要なメタデータをリストします。メタデータ・ファイルのサンプル行の一部は次のとおりです。

srid:26904
datatype:1
resolution:27.90809458890406,-27.90809458890406
file:/user/hdfs/ohiftest/opt/shareddir/spatial/data/rasters/hawaii.tif.ohif
bands:3
mbr:532488.7648166901,4303164.583549625,582723.3350767174,4269619.053853762
0,532488.7648166901,4303164.583549625,582723.3350767174,4269619.053853762
thumbnailpath:/opt/shareddir/spatial/thumb/

-thumbnailフラグが指定されている場合、ソース・イメージのサムネイルが関連フォルダに格納されます。これは.ohifファイルの変換を視覚化する方法の1つです。ジョブ実行ログには、コマンドyarn logs -applicationId <applicationId>を使用してアクセスできます。

2.5 Oracle Spatial Hadoop Image Processorを使用したイメージの処理

イメージはHDFSにロードされると、Oracle Spatial Hadoop Image Processing Frameworkによって並列で処理されます。

出力を指定すると、フレームワークによって出力に適合するようフィルタおよび処理され、まとめて1つのファイルに格納されます。地図代数演算も可能であり、設定されていれば、処理フェーズの最初の部分になります。最終的な出力がフレームワークによって作成される前であれば、実行する処理クラスを追加で指定できます。

Image Processorは、入力(モザイク記述または単一のラスター)に基づいて特定のデータ・ブロックをロードし、最終的な出力に適合する帯域およびピクセルのみを選択します。指定した処理クラスはすべて実行され、最終的な出力は、ユーザーの要求に応じてHDFSまたはファイル・システムに格納されます。

- イメージ処理ジョブ

- 入力パラメータ

- ジョブ実行

- 処理クラスおよびImageBandWritable

- 地図代数演算

- 複数のラスター代数演算

- 出力

2.5.1 イメージ処理ジョブ

イメージ処理ジョブには、ユーザーによって要求された処理のタイプに応じて異なるフローがあります。

- デフォルトのイメージ処理ジョブ・フロー: モザイク操作、単一のラスター操作、または基本的な複数のラスター操作が含まれる処理に対して実行されます。

- 複数のラスター・イメージ処理ジョブ・フロー: 複雑な複数のラスター代数演算が含まれる処理に対して実行されます。

- デフォルトのイメージ処理ジョブ・フロー

- 複数のラスター・イメージ処理ジョブ・フロー

2.5.1.1 デフォルトのイメージ処理ジョブ・フロー

デフォルトのイメージ処理ジョブ・フローは、次の処理のいずれかが要求されたときに実行されます。

- モザイク操作

- 単一のラスター操作

- 基本的な複数のラスター代数演算

このフローには、独自のカスタムFilterInputFormatがあり、SRIDおよび座標に基づいて処理対象の四角形を決定します。モザイク入力のデータ型(ピクセル深度)と同じデータ型(モザイク深度)のイメージのみが該当します。ユーザーがモザイク出力に指定した座標と交差する四角形のみが含まれます。単一のラスター操作または基本的な複数のラスター代数演算(モザイクを除く)の場合、処理は完全なイメージに対して実行されるため、フィルタには、入力ラスターのすべての四角形が含まれます。四角形が選択されると、イメージごとにカスタムImageProcessSplitが作成されます。

マッパーがImageProcessSplitを受け取ると、ImageSplitの指定に基づいて情報が読み取られ、ユーザーが指定した帯域のみを選択するようフィルタ処理され、地図操作、および(要求に定義されていれば)処理クラスのリストが実行されます。

それぞれのマッパー処理は、データがあるノードで実行されます。地図代数演算および処理クラスが実行された後、検証により、ユーザーがモザイク操作を要求しているかどうか、または分析に完全なイメージが含まれるかどうかが検証されます。モザイク操作が要求されている場合、最終処理によってこの操作が実行されます。モザイク操作では、すべての四角形から出力に適合するピクセルのみを選択し、必要に応じて解像度を変更してモザイク出力に追加します。単一の処理操作では、前のラスターの四角形のバイトがそのままコピーされます。結果として得られたバイトは、リデューサによってリカバリされる対象としてNFSに格納されます。

1つのリデューサで複数の四角形を選択し、それをまとめます。基本的な複数のラスター代数演算を指定した場合、これは、四角形が最終出力にマージされるときに同時に実行されます。この操作は、モザイク出力内の交差ピクセルのみに影響するか、モザイク操作が要求されなかった場合はすべてのピクセルに影響します。リデューサ処理クラスを指定した場合、出力ラスターとともにGDALデータ・セットが分析および処理のためにこのクラスに送信されます。HDFS出力を選択した場合、ImageLoaderが呼び出され、結果がHDFSに格納されます。それ以外の場合、イメージはデフォルトでGDALによって用意され、ファイル・システム(NFS)に格納されます。

2.5.1.2 複数のラスター・イメージ処理ジョブ・フロー

複数のラスター・イメージ処理ジョブ・フローは、複雑な複数のラスター代数演算が要求されるときに実行されます。これは、同じMBR、ピクセル・タイプ、ピクセル・サイズおよびSRIDを持つラスターに適用されます。なぜなら、これらの操作は対応するセルにピクセル単位で適用され、この場合、すべてのピクセルが同じ座標を表します。

このフローには、独自のカスタムMultipleRasterInputFormatがあり、SRIDおよび座標に基づいて処理対象の四角形を決定します。同じMBR、ピクセル・タイプ、ピクセル・サイズおよびSRIDを持つイメージのみが考慮されます。カタログ内の最初のラスターによって指定された座標と一致するラスターのみが含まれます。入力ラスターのすべての四角形が考慮されますが、これは、処理が完全なイメージに対して実行されるからです。

四角形が選択されると、カスタムMultipleRasterSplitが作成されます。この分割には、ブロック・サイズに応じてすべての元の四角形の小さい領域が含まれますが、これは、小さい領域であってもすべてのラスターを分割に含める必要があるからです。これらはそれぞれIndividualRasterSplitと呼ばれ、これらは親MultipleRasterSplitに含まれます。

マッパーがMultipleRasterSplitを受け取ると、親分割に含まれるすべてのラスターの四角形の情報が読み取られ、ユーザーが指定した帯域のみ、およびこの特定のマッパーで処理する対応する小さい領域のみを選択するようフィルタ処理され、複雑な複数のラスター代数演算が実行されます。

同じノード内にない可能性がある単一のマッパーに複数のラスターが含まれるため、処理のこの部分ではデータのローカル性が失われる可能性があります。すべてのピクセルに関して結果として得られたバイトは、リデューサによってリカバリされる対象としてコンテキストに取り込まれます。

1つのリデューサでピクセル値を選択し、それをまとめます。リデューサ処理クラスを指定した場合、出力ラスターとともにGDALデータ・セットが分析および処理のためにこのクラスに送信されます。このシナリオではこのクラスの四角形のリストはnullを受け取り、このクラスは出力データ・セットのみを操作できます。HDFS出力を選択した場合、ImageLoaderが呼び出され、結果がHDFSに格納されます。それ以外の場合、イメージはデフォルトでGDALによって用意され、ファイル・システム(NFS)に格納されます。

2.5.2 入力パラメータ

次の入力パラメータをHadoopコマンドに指定できます。

hadoop jar /opt/oracle/oracle-spatial-graph/spatial/raster/jlib/hadoop-imageprocessor.jar
-config  <MOSAIC_CONFIG_PATH>
-gdal  <GDAL_LIBRARIES_PATH>
-gdalData  <GDAL_DATA_PATH>
[-catalog  <IMAGE_CATALOG_PATH>]
[-usrlib  <USER_PROCESS_JAR_PATH>]
[-thumbnail  <THUMBNAIL_PATH>]
[-nativepath  <USER_NATIVE_LIBRARIES_PATH>]
[-params  <USER_PARAMETERS>]
[-file  <SINGLE_RASTER_PATH>]

説明:

- MOSAIC_CONFIG_PATHは、出力の機能を定義するモザイク構成xmlへのパスです。

- GDAL_LIBRARIES_PATHはGDALライブラリの場所を示すパスです。

- GDAL_DATA_PATHはGDALデータ・フォルダの場所を示すパスです。NFSを介してクラスタ内のすべてにアクセスできるパスを指定する必要があります。

- IMAGE_CATALOG_PATHは、処理対象のHDFSイメージをリストするカタログxmlへのパスです。–fileフラグを使用して処理する単一のラスターも指定できるため、これはオプションです。

- USER_PROCESS_JAR_PATHは任意のユーザー定義jarファイルまたはjarファイルのカンマ区切りのリストであり、これらにはそれぞれ、ソース・イメージに適用される追加の処理クラスが含まれています。

- THUMBNAIL_PATHはロードしたイメージのサムネイル作成を有効化するための任意のフラグです。このパスは、クラスタ内のすべてのノードへのNFSを介してアクセスし、HDFS出力の場合のみ有効です。

- USER_NATIVE_LIBRARIES_PATHは、分析で使用する追加のネイティブ・ライブラリの任意のカンマ区切りのリストです。これはまた、アプリケーションにロードするすべてのネイティブ・ライブラリが含まれるディレクトリである場合もあります。

- USER_PARAMETERSは、ユーザー処理クラスの入力データを定義するために使用する任意のキー/値のリストです。セミコロンを使用して、パラメータを区切ります。たとえば、azimuth=315;altitude=45などです

- SINGLE_RASTER_PATHは、ジョブによって処理される.ohifファイルへの任意のパスです。これが設定されている場合、カタログを設定する必要はありません。

たとえば、次のコマンドは、testFS.xmlファイルに設定されているモザイク出力定義を使用して、カタログ・ファイルinput.xmlファイルにリストされるすべてのファイルを処理します。

hadoop jar /opt/oracle/oracle-spatial-graph/spatial/raster/jlib/hadoop-imageprocessor.jar -catalog /opt/shareddir/spatial/demo/imageserver/images/input.xml -config /opt/shareddir/spatial/demo/imageserver/images/testFS.xml -thumbnail /opt/shareddir/spatial/processtest –gdal /opt/oracle/oracle-spatial-graph/spatial/raster/gdal/lib –gdalData /opt/shareddir/data

デフォルトでは、マッパーとリデューサは2GBのJVMを取得できるよう構成されていますが、この設定、またはその他のジョブ構成プロパティは、コマンドを実行する同じフォルダの場所で、ユーザーがimagejob.propプロパティ・ファイルを追加することによってオーバーライドできます。

GDALが適切に機能するように、$LD_LIBRARY_PATHを使用してライブラリを使用可能にする必要があります。ジョブを実行する前に、共有ライブラリ・パスがシェル・ウィンドウに適切に設定されていることを確認してください。次に例を示します。

export LD_LIBRARY_PATH=$ALLACCESSDIR/gdal/native

- カタログXML構造

- モザイク定義XML構造

2.5.2.1 カタログXML構造

次の例は、イメージ処理ジョブによって生成されるモザイク操作に必要なすべてのソース・イメージをリストする入力カタログXMLを示します。

-<catalog>
-<image>
<raster>/user/hdfs/ohiftest/opt/shareddir/spatial/data/rasters/maui.tif.ohif</raster>
<bands datatype='1' config='1,2,3'>3</bands>
</image>
</catalog>

<catalog>要素には処理対象の<image>要素のリストが含まれています。

それぞれの<image>要素は、<raster>要素内にソース・イメージまたはソース・フォルダを定義します。フォルダ内のすべてのイメージが処理されます。

<bands>要素はイメージの帯域数を指定し、datatype属性には、ラスター・データ型があり、config属性はモザイク出力帯域の順序にどの帯域が表示されるかを指定します。たとえば、3,1,2はモザイク出力帯域番号1にはこのラスターの帯域番号3、モザイク帯域番号2にはソース帯域1、およびモザイク帯域番号3にはソース帯域2があることを示します。この順序はラスターからベクトルへ変更されることがあります。

2.5.2.2 モザイク定義XML構造

次の例は、イメージ処理ジョブで生成される出力の機能を定義する場合に必要なモザイク構成XMLを示します。

-<mosaic exec="false">
-<output>
<SRID>26904</SRID>
<directory type="FS">/opt/shareddir/spatial/processOutput</directory>
<!--directory type="HDFS">newData</directory-->
<tempFSFolder>/opt/shareddir/spatial/tempOutput</tempFSFolder>
<filename>littlemap</filename>
<format>GTIFF</format>
<width>1600</width>
<height>986</height>
<algorithm order="0">2</algorithm>
<bands layers="3" config="3,1,2"/>
<nodata>#000000</nodata>
<pixelType>1</pixelType>
</output>
-<crop>
-<transform>
356958.985610072,280.38843650364862,0,2458324.0825054757,0,-280.38843650364862 </transform>
</crop>
<process><classMapper params="threshold=454,2954">oracle.spatial.hadoop.twc.FarmTransformer</classMapper><classReducer params="plot_size=100400">oracle.spatial.hadoop.twc.FarmAlignment</classReducer></process>
<operations>
<localif operator="<" operand="3" newvalue="6"/>
<localadd arg="5"/>
<localsqrt/>
<localround/>
</operations>
</mosaic>

<mosaic>要素は処理出力の仕様を定義します。exec属性は、処理にモザイク操作が含まれるかどうかを指定します。“false”に設定されている場合、モザイク操作は実行されず、単一のラスターが処理されます。“true”に設定されているか一切設定されていない場合、モザイク操作は実行されます。次の要素の一部はモザイク操作に対してのみ必要であり、単一のラスター処理の場合は無視されます。

<output>要素は出力に使用される<SRID>などの機能を定義します。異なるSRIDのすべてのイメージは、モザイクSRIDに変換され、その四角形がモザイクに適合するかどうかが判断されます。出力ラスターが入力と同じSRIDを持つため、この要素は単一のラスター処理には必要ありません。

<directory>要素は出力の場所を定義します。これは、タグの型で指定される、通常のファイルシステム(FS)またはHDFSのいずれかです。

<tempFsFolder>要素はモザイク出力を一時的に格納するパスを設定します。属性delete=”false”を指定することにより、出力の出力をHDFSに格納するためにローダーが実行されていた場合でも、この出力を保持できます。

<filename>および<format>要素は、出力ファイル名を指定します。<filename>は、単一のラスター処理には必要ありません。これが指定されていない場合、(ジョブの呼出し時に-file属性によって決定される)入力ファイルの名前が出力ファイルに使用されます。出力ラスターが入力と同じ形式であるため、<format>は単一のラスター処理には必要ありません。

<width>および<height>要素はモザイク出力の解像度を設定します。出力ラスターが入力と同じ解像度を持つため、これらは単一のラスター処理には必要ありません。

<algorithm>要素はイメージの順序アルゴリズムを設定します。1はソースの最終変更日付順、2はイメージ・サイズ順を示します。順序タグは昇順モードまたは降順モードを表します。(これらのプロパティは、複数のラスターが重複する可能性があるモザイク操作用です。)

<bands>要素は出力モザイクの帯域数を指定します。この数より帯域の少ないイメージは破棄されます。config属性を単一のラスター処理に使用することにより、カタログがない場合に出力の帯域構成を設定できます。

<nodata>要素は、値のないモザイク出力のすべてのピクセルのうち、最初の3帯域の色を指定します。

<pixelType>要素はモザイク出力のピクセル・タイプを設定します。同じピクセル・サイズのないソース・イメージは処理段階で破棄されます。この要素は、単一のラスター処理には必要ありません。これが指定されていない場合、ピクセル・タイプは入力と同じものになります。

<crop>要素は、モザイク出力に含まれる座標を、startcoordinateX、pixelXWidth、RotationX、startcoordinateY、RotationY、pixelheightYの順に定義します。この要素は、単一のラスター処理には必要ありません。これが指定されていない場合、完全なイメージが分析用として考慮されます。

<process>要素はモザイク操作の前に実行するクラスをすべてリストします。

<classMapper>要素は、マッピング・フェーズ中に実行されるクラスに使用され、<classReducer>要素は、リデュース・フェーズ中に実行されるクラスに使用されます。両方の要素がparams属性を持ち、この場合、ニーズに応じて処理クラスに入力パラメータを送信できます。

<operations>要素は、この要求で処理される地図代数演算をすべてリストします。

2.5.3 ジョブ実行

ジョブの最初のステップは、出力に適合する四角形をフィルタ処理することです。最初に、四角形のメタデータを保持している位置ファイルがInputFormatに送信されます。

pixelTypeを抽出すると、フィルタにより、関連するソース・イメージが処理に有効かどうかが判別されます。カタログxmlで作成したユーザー定義に基づき、次のいずれかが実行されます。

- イメージが処理に有効な場合、次にSRIDが評価されます

- ユーザー定義と異なる場合、すべての四角形のMBR座標がユーザーSRIDに変換され、評価されます。

この方法では、すべての四角形が出力定義と交差するかどうかが評価されます。

- モザイク処理要求の場合、交差する四角形のみが選択され、これらの1つずつに分割が作成されます。

- 単一のラスター処理要求の場合、すべての四角形が選択され、これらの1つずつに分割が作成されます。

- 複雑な複数のラスター代数演算要求の場合、MBRおよびピクセル・サイズが同じであれば、すべての四角形が選択されます。選択したラスターの数およびブロックサイズに応じて、(完全な元のラスターの四角形が必ずしも含まれるわけではない)すべての四角形のラスターの特定の領域が単一の親分割に含まれます。

マッパーでは、格納先のノードでそれぞれの分割が処理されます。(複雑な複数のラスター代数演算の場合、分割に複数のラスターからのデータが含まれるため、データのローカル性が失われる可能性があります。)マッパーでは、ユーザーが定義した地図代数演算および処理クラスが順に実行され、次に、要求された場合、モザイク処理が実行されます。単一のリデューサにより、マッパーの結果がまとめられ、ユーザー指定のリデュース処理クラスの場合、これらのクラスに出力データ・セットが分析または処理のために設定されます。最後に、ユーザーの要求に応じてイメージがFSまたはHDFSに格納されます。ユーザーがHDFSへの出力の格納を要求した場合、ImageLoaderジョブが起動され、イメージが.ohifファイルとして格納されます。

デフォルトでは、マッパーとリデューサは1GBのJVMを取得できるよう構成されていますが、この設定、またはその他の構成プロパティは、コマンドを実行する同じフォルダの場所で、imagejob.propプロパティ・ファイルを追加することによってオーバーライドできます。

2.5.4 処理クラスおよびImageBandWritable

カタログXMLで指定した処理クラスは、ジョブで正しく処理できるように、次の一連のルールを遵守している必要があります。マッピング・フェーズのすべての処理クラスにImageProcessorInterfaceインタフェースが実装されている必要があります。リデューサ・フェーズの場合、ImageProcessorReduceInterfaceインタフェースが実装されている必要があります。

処理クラスを実装するには、そのオブジェクト表現ImageBandWritableを使用してラスターを操作する必要があります。処理クラスの例はフレームワークで提供され、DEMの傾斜を計算できます。関数によってピクセル値を別の値に変換する場合などは、マッピング操作を作成できます。ImageBandWritableインスタンスは、解像度、サイズ、ピクセルなど、四角形のコンテンツを定義します。これらの値は、四角形の定義を作成するプロパティに反映する必要があります。モザイク出力の整合性は、これらのプロパティの操作が正しいかどうかによって決まります。

ImageBandWritableインスタンスは、解像度、サイズ、ピクセルなど、四角形のコンテンツを定義します。これらの値は、四角形の定義を作成するプロパティに反映する必要があります。出力の整合性は、これらのプロパティの操作が正しいかどうかによって決まります。

表2-1 ImageBandWritableプロパティ

タイプ - プロパティ

説明

IntWritable dstWidthSize

四角形の幅のサイズ

IntWritable dstHeightSize

四角形の高さのサイズ

IntWritable bands

四角形の帯域数

IntWritable dType

四角形のデータ型

IntWritable offX

ソース・イメージに関連し、Xピクセルから開始

IntWritable offY

ソース・イメージに関連し、Yピクセルから開始

IntWritable totalWidth

ソース・イメージの幅のサイズ

IntWritable totalHeight

ソース・イメージの高さのサイズ

IntWritable bytesNumber

四角形のピクセルを含み、baseArrayに格納されるバイト数

BytesWritable[] baseArray

四角形のピクセルを表すバイト数を含む配列であり、それぞれのセルが1つの帯域を表します

IntWritable[][] basePaletteArray

四角形のパレットを表す整数値を含む配列であり、それぞれの配列が帯域を表します。それぞれの整数が色テーブルの各色のエントリを表し、色ごとに4つのエントリがあります

IntWritable[] baseColorArray

色の解釈を表す整数値を含む配列であり、それぞれのセルが1つの帯域を表します

DoubleWritable[] noDataArray

イメージのNODATA値を含む配列であり、それぞれのセルに関連する帯域の値が含まれます

ByteWritable isProjection

四角形にByte.MAX_VALUEの予測情報が含まれている場合に指定します

ByteWritable isTransform

四角形にByte.MAX_VALUEの地図変換配列情報が含まれている場合に指定します

ByteWritable isMetadata

四角形にByte.MAX_VALUEのメタデータ情報が含まれている場合に指定します

IntWritable projectionLength

予測情報の長さを指定します

BytesWritable projectionRef

予測情報のバイト数を指定します

DoubleWritable[] geoTransform

地理変換配列を含みます

IntWritable metadataSize

四角形の中のメタデータ値の数

IntWritable[] metadataLength

それぞれのメタデータ値の長さを指定する配列

BytesWritable[] metadata

四角形のメタデータの配列

GeneralInfoWritable mosaicInfo

モザイクxml内のユーザー定義情報。モザイク出力機能は変更しないでください。新しい名前で元のxmlファイルを変更し、その新しいxmlを使用して実行および処理します

MapWritable extraFields

分析のためにリデューサ・フェーズに渡されるすべての四角形に固有のパラメータのキー/値ペアがリストされた地図

処理クラスおよびメソッド

四角形のピクセルを変更する場合は、次のメソッドを使用して、最初に帯域情報を配列に取り込みます。

byte [] bandData1 =(byte []) img.getBand(0);

帯域1の四角形のピクセルを表すバイト数は、現在bandData1配列にあります。底の索引はゼロです。

getBand(int bandId)メソッドは指定したbandIdの位置のラスターの帯域を取得します。取得したオブジェクトをラスターの配列型へのキャストに使用できます。これはbyte、short (unsigned int 16ビット、int 16ビット)、int (unsigned int 32ビット、int 32ビット)、float (float 32ビット)、またはdouble (float 64ビット)のいずれかです。

配列でピクセルを使用できる場合は、この時点でユーザーの要求に応じて変換できます。

ピクセルの処理後、ImageBandWritableの同じインスタンスを使用する必要がある場合は、次のメソッドを実行します。

img.removeBands;

これにより、前の帯域のコンテンツが削除され、新しい帯域の追加を開始できます。新しい帯域を追加するには、次のメソッドを使用します。

img.addBand(Object band);

それ以外の場合は、次のメソッドを使用して特定の帯域を置き換えることもできます。

img.replaceBand(Object band, int bandId)

前述のメソッドでは、bandは、ピクセル情報が含まれる配列であり、bandIDは、置換対象の帯域の識別子です。処理操作の結果、影響を受けるインスタンス・サイズ、データ型、bytesNumberおよびその他のプロパティを必ず更新してください。各プロパティには、セッターを使用できます。

- クラスおよびJarファイルの位置

2.5.4.1 クラスおよびJarファイルの位置

Oracle Image Serverコンソールを使用している場合は、すべての処理クラスが単一のJARファイルに含まれます。コマンドライン・オプションを使用している場合、処理クラスはそれぞれ異なるJARファイルに配置されます。

クラスパス内に新しいクラスが表示されている場合、これらを<process><classMapper>または<process><classReducer>セクションのモザイクXMLに追加する必要があります。追加されたすべての<class>要素は、表示されている順序で実行されます。マッパーの場合は最終モザイク操作が実行される直前、リデューサの場合はすべての処理済四角形が単一のデータ・セットにまとめられる直後です。

2.5.5 地図代数演算

ローカル地図代数演算は入力ラスター上で処理でき、そこではピクセル数が操作に応じて変更されます。構成XMLの操作の順序によって、処理される操作の順序が決まります。すべての地図代数演算が処理されると、処理クラスが実行され、最後にモザイク操作が実行されます。

次の地図代数演算はモザイク構成XMLの<operations>要素に追加でき、演算名を要素名として使用できます。(各操作がサポートされているデータ型は、カッコで囲まれてリストされています。)

- localnot: 各ピクセルの否定を取得し、ビット・パターンを反転します。結果が負の値でデータ型が符号なしの場合、NODATA値が設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(バイト、Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット)

- locallog: ピクセルの自然対数(底e)を返します。結果がNaNの場合は元のピクセル値が設定され、結果が無限の場合はNODATA値が設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- locallog10: ピクセルの底10の対数が返されます。結果がNaNの場合は元のピクセル値が設定され、結果が無限の場合はNODATA値が設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localadd: 指定した値を引数としてピクセルに追加します。例: <localadd arg="5"/>。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localdivide: 各ピクセルの値を、引数として指定した値セットで除算します。例: <localdivide arg="5"/>。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localif: 各ピクセルの値を引数として指定した値および条件に基づいて変更します。有効な演算子: =、<、>、>=、< !=。例: <localif operator="<" operand="3" newvalue="6"/>、ここでは、値が3未満のピクセルがすべて変更され、新しい値が6に設定されます。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localmultiply: 各ピクセルの値に、引数として指定した値を乗算します。例: <localmultiply arg="5"/>。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localpow: 各ピクセルの値を、指定した引数の値のべき乗に切り上げます。例: <localpow arg="5"/>。結果が無限の場合、このピクセルにNODATA値が設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localsqrt: 各ピクセルを正しく四捨五入した正の値の平方根を返します。結果が無限またはNaNの場合、このピクセルにNODATA値が設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localsubstract: すべてのピクセル値から引数として指定した値を減算します。例: <localsubstract arg="5"/>。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localacos: ピクセルの逆余弦を計算します。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localasin: ピクセルの逆正弦を計算します。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localatan: ピクセルの逆正接を計算します。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localcos: ピクセルの余弦を計算します。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localcosh: ピクセルの逆双曲線余弦を計算します。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localsin: ピクセルの正弦を計算します。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localtan: ピクセルの正接を計算します。ピクセルの余弦が0の場合、このピクセルは変更されません。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localsinh: ピクセルの逆双曲線正弦を計算します。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localtanh: ピクセルの双曲線正接を計算します。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localdefined: セルの値がNODATAではない場合は整数型指定のピクセルが1にマップされ、それ以外の場合は0にマップされます。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット、Float 32ビット)

- localundefined: セルの値がNODATAではない場合は整数型指定のラスターが0にマップされ、それ以外の場合は1にマップされます。(Unsigned int 16ビット、Unsigned int 32ビット、Int 16ビット、Int 32ビット)

- localabs: 符号付きピクセルの絶対値を返します。結果が無限の場合、このピクセルにNODATA値が設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localnegate: 各ピクセルの値から1を引いた数を乗算します。(Int 16ビット、Int 32ビット、Float 32ビット、Float 64ビット)

- localceil: ピクセル値以上であり、ある数学的整数と等しい最小値を返します。結果が無限の場合、このピクセルにNODATA値が設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(Float 32ビット、Float 64ビット)

- localfloor: ピクセル値以下であり、ある数学的整数と等しい最小値を返します。結果が無限の場合、このピクセルにNODATA値が設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。(Float 32ビット、Float 64ビット)

- localround: 各ピクセルに最も近い整数値を返します。(Float 32ビット、Float 64ビット)

2.5.6 複数のラスター代数演算

複数のラスターが含まれるラスター代数演算を処理できます。この場合、操作に応じて、および同じセル内の関連するすべてのラスターのピクセルを考慮して、ピクセルが変更されます。

一度に処理できる操作は1つのみであり、この操作は、<multipleops>要素を使用して構成XMLに定義されます。その値は、処理対象の操作です。

操作には2つのタイプがあります。

- 基本的な複数のラスター代数演算は、ユーザーのリデュース処理クラスの直前のリデュース・フェーズで実行されます。

- 複雑な複数のラスター代数演算は、マッピング・フェーズで実行されます。

- 基本的な複数のラスター代数演算

- 複雑な複数のラスター代数演算

2.5.6.1 基本的な複数のラスター代数演算

基本的な複数のラスター代数演算は、ジョブのリデュース・フェーズで実行されます。

これらは、モザイク操作または単なる処理要求とともに要求できます。モザイク操作とともに要求された場合、入力ラスターは同じMBR、ピクセル・サイズ、SRIDおよびデータ型を持つ必要があります。

モザイク操作を実行する場合、交差するピクセル(両方のラスターで同一のピクセル)のみが影響を受けます。

この操作が処理されるのは、マッピング四角形が出力データ・セットにまとめられ、(モザイク操作が要求された場合は)交差するピクセル値、または(モザイクが要求されていない場合は)すべてのピクセルが要求された操作に応じて変更される場合です。

ラスターがデータ・セットに追加される順序は、モザイク操作が要求された場合はモザイク操作の順序であり、それ以外の場合は、カタログ内の表示の順序です。

次の基本的な複数のラスター代数演算が使用可能です。

- add: ラスター・シーケンスの同じセル内のすべてのピクセルを加算します。

- substract: ラスター・シーケンスの同じセル内のすべてのピクセルを減算します。

- divide: ラスター・シーケンスの同じセル内のすべてのピクセルを除算します。

- multiply: ラスター・シーケンスの同じセル内のすべてのピクセルを乗算します。

- min: ラスター・シーケンスの同じセル内のピクセルの最小値を割り当てます。

- max: ラスター・シーケンスの同じセル内のピクセルの最大値を割り当てます。

- mean: ラスター・シーケンスの同じセル内のすべてのピクセルの平均値を計算します。

- and: ラスター・シーケンスの同じセル内のすべてのピクセルのバイナリ“and”演算を処理し、“and“演算によって結果にビットがコピーされます(両方のオペランドに存在する場合)。

- or: ラスター・シーケンスの同じセル内のすべてのピクセルのバイナリ“or”演算を処理し、“or“演算によってビットがコピーされます(どちらかのオペランドに存在する場合)。

- xor: ラスター・シーケンスの同じセル内のすべてのピクセルのバイナリ“xor”演算を処理し、“xor“演算によってビットがコピーされます(1つのオペランドに存在するが両方には存在しない場合)。

2.5.6.2 複雑な複数のラスター代数演算

複雑な複数のラスター代数演算は、ジョブのマッピング・フェーズで実行され、ジョブはこの演算のみを処理できます。SRIDのサイズ変更、変更、またはカスタム・マッピングに対する要求は前に実行されている必要があります。このジョブの入力は、同じMBR、SRID、データ型およびピクセル・サイズを持つ一連のラスターです。

このジョブの四角形には、カタログ内のすべてのラスターの一部が含まれます。このため、すべてのマッパーがすべてのラスター内のセルの領域にアクセスでき、演算はそこで処理されます。結果として生成されたすべてのセルのピクセルはこのコンテキストで書き込まれるため、リデューサはリデューサ処理クラスを処理する前に結果を出力データ・セットに配置できます。

ラスターが演算を評価すると見なされる順序は、カタログ内に表示される順序です。

次の複雑な複数のラスター代数演算が使用可能です。

- combine: ラスター・シーケンスの同じセル内の入力値の一意の組合せごとに一意の出力値を割り当てます。

- majority: 最も多数のラスター・シーケンスの同じセル内の値を割り当てます。値が結合されている場合、右側の値が選択されます。

- minority: 最も少数のラスター・シーケンスの同じセル内の値を割り当てます。値が結合されている場合、右側の値が選択されます。

- variety: ラスター・シーケンスの同じセルごとに一意の値のカウントを割り当てます。

- mask: 最初のラスターの値を使用してラスターを生成しますが、シーケンスの残りのラスター内の対応するピクセルが特定のマスク値に設定されているピクセルのみが含まれます。それ以外の場合は、0が設定されます。

- inversemask: 最初のラスターの値を使用してラスターを生成しますが、シーケンスの残りのラスター内の対応するピクセルが特定のマスク値に設定されていないピクセルのみが含まれます。それ以外の場合は、0が設定されます。

- equals: バイト・データ型でラスターを作成します。この場合、すべての入力ラスターに対応するセルが同じ値を持つ場合、セル値は1です。それ以外の場合は、0が設定されます。

- unequal: バイト・データ型でラスターを作成します。この場合、すべての入力ラスターに対応するセルが異なる値を持つ場合、セル値は1です。それ以外の場合は、0が設定されます。

- greater: バイト・データ型でラスターを作成します。この場合、最初のラスター内のセル値が、すべての入力ラスターに対応する残りのセル値より大きい場合、セル値は1です。それ以外の場合は、0が設定されます。

- greaterorequal: バイト・データ型でラスターを作成します。この場合、最初のラスター内のセル値が、すべての入力ラスターに対応する残りのセル値以上である場合、セル値は1です。それ以外の場合は、0が設定されます。

- less: バイト・データ型でラスターを作成します。この場合、最初のラスター内のセル値が、すべての入力ラスターに対応する残りのセル値より小さい場合、セル値は1です。それ以外の場合は、0が設定されます。

- lessorequal: バイト・データ型でラスターを作成します。この場合、最初のラスター内のセル値が、すべての入力ラスターに対応する残りのセル値以下である場合、セル値は1です。それ以外の場合は、0が設定されます。

2.5.7 出力

構成XMLでHDFSディレクトリを指定すると、ImageLoaderジョブの場合は.ohifファイルの出力が生成されます。

構成XMLでユーザーがFSディレクトリを指定すると、指定したファイル名とタイプのイメージの出力が生成され、通常のファイル・システムに格納されます。

どちらのシナリオでも、出力は構成xmlに設定されている仕様に準拠する必要があります。ジョブ実行ログには、コマンドyarn logs -applicationId <applicationId>を使用してアクセスできます。

2.6 Oracle Spatial Hadoop Raster Processing APIを使用したイメージのロードおよび処理

このフレームワークでは、XMLを作成せずに、Javaアプリケーションを使用してラスターをロードし、処理するラスター処理APIが用意されています。このアプリケーションはクラスタ内またはリモート・ノード上で実行できます。

このAPIはフレームワーク操作へのアクセスが可能であり、WebサービスまたはスタンドアロンJavaアプリケーションに使用できます。

いずれかのジョブを実行するには、HadoopConfigurationオブジェクトを作成する必要があります。このオブジェクトは、ジョブの作成、ラスターの操作、およびジョブの実行に必要な構成情報(JARファイル名やGDALパスなど)の設定に使用されます。基本のロジックは次のとおりです。

//Creates Hadoop Configuration
HadoopConfiguration hadoopConf = new HadoopConfiguration();
//Assigns GDAL_DATA location based on specified SHAREDDIR, this data folder is required by gdal to look for data tables that allow SRID conversions
String gdalData = sharedDir + ProcessConstants.DIRECTORY_SEPARATOR + "data";
hadoopConf.setGdalDataPath(gdalData);
//Sets jar name for processor
hadoopConf.setMapreduceJobJar("hadoop-imageprocessor.jar");
//Creates the job
RasterProcessorJob processor = (RasterProcessorJob) hadoopConf.createRasterProcessorJob();

APIがリモート・ノードで使用されている場合は、Hadoop Configurationオブジェクトでプロパティを設定してクラスタに接続できます。次に例を示します。

//Following config settings are required for standalone execution. (REMOTE ACCESS)
hadoopConf.setUser("hdfs");
hadoopConf.setHdfsPathPrefix("hdfs://den00btb.us.oracle.com:8020");
hadoopConf.setResourceManagerScheduler("den00btb.us.oracle.com:8030");
hadoopConf.setResourceManagerAddress("den00btb.us.oracle.com:8032");
hadoopConf.setYarnApplicationClasspath("/etc/hadoop/conf/,/usr/lib/hadoop/*,/usr/lib/hadoop/lib/*," +
"/usr/lib/hadoop-hdfs/*,/usr/lib/hadoop-hdfs/lib/*,/usr/lib/hadoop-yarn/*," +
"/usr/lib/hadoop-yarn/lib/*,/usr/lib/hadoop-mapreduce/*,/usr/lib/hadoop-mapreduce/lib/* ");

ジョブは作成後、その実行のプロパティをジョブ・タイプに応じて設定する必要があります。ジョブ・クラスには、ラスターをHDFSにロードするRasterLoaderJob、およびそれを処理するRasterProcessorJobの2つがあります。

次の例では、ハワイのラスターをAPICALL_HDFSディレクトリにロードします。ここでは、共有フォルダにサムネイルを作成し、四角形のそれぞれの辺と重なる10ピクセルを指定します。

private static void executeLoader(HadoopConfiguration hadoopConf){
hadoopConf.setMapreduceJobJar("hadoop-imageloader.jar");
RasterLoaderJob loader = (RasterLoaderJob) hadoopConf.createRasterLoaderJob();
loader.setFilesToLoad("/net/den00btb/scratch/zherena/hawaii/hawaii.tif");
loader.setTileOverlap("10");
loader.setOutputFolder("APICALL");
loader.setRasterThumbnailFolder("/net/den00btb/scratch/zherena/processOutput");
try{
loader.setGdalPath("/net/den00btb/scratch/zherena/gdal/lib");

boolean loaderSuccess = loader.execute();
if(loaderSuccess){
System.out.println("Successfully executed loader job");
}
else{
System.out.println("Failed to execute loader job");
}
}catch(Exception e ){
System.out.println("Problem when trying to execute raster loader " + e.getMessage());
}
}
}

次の例では、ロードしたラスターを処理します。

private static void executeProcessor(HadoopConfiguration hadoopConf){
hadoopConf.setMapreduceJobJar("hadoop-imageprocessor.jar");
RasterProcessorJob processor = (RasterProcessorJob) hadoopConf.createRasterProcessorJob();

try{
processor.setGdalPath("/net/den00btb/scratch/zherena/gdal/lib");
MosaicConfiguration mosaic = new MosaicConfiguration();
mosaic.setBands(3);
mosaic.setDirectory("/net/den00btb/scratch/zherena/processOutput");
mosaic.setFileName("APIMosaic");
mosaic.setFileSystem(RasterProcessorJob.FS);
mosaic.setFormat("GTIFF");
mosaic.setHeight(3192);
mosaic.setNoData("#FFFFFF");
mosaic.setOrderAlgorithm(ProcessConstants.ALGORITMH_FILE_LENGTH);
mosaic.setOrder("1");
mosaic.setPixelType("1");
mosaic.setPixelXWidth(67.457513);
mosaic.setPixelYWidth(-67.457513);
mosaic.setSrid("26904");
mosaic.setUpperLeftX(830763.281336);
mosaic.setUpperLeftY(2259894.481403);
mosaic.setWidth(1300);
processor.setMosaicConfigurationObject(mosaic.getCompactMosaic());
RasterCatalog catalog = new RasterCatalog();
Raster raster = new Raster();
raster.setBands(3);
raster.setBandsOrder("1,2,3");
raster.setDataType(1);
raster.setRasterLocation("/user/hdfs/APICALL/net/den00btb/scratch/zherena/hawaii/hawaii.tif.ohif");
catalog.addRasterToCatalog(raster);

processor.setCatalogObject(catalog.getCompactCatalog());
boolean processorSuccess = processor.execute();
if(processorSuccess){
System.out.println("Successfully executed processor job");
}
else{
System.out.println("Failed to execute processor job");
}
}catch(Exception e ){
System.out.println("Problem when trying to execute raster processor " + e.getMessage());
}
}

前の例でモザイクの結果がHDFSに格納される場合は、サムネイルがオプションになります。JARファイルの処理が指定されている場合(追加のユーザー処理クラスが指定されている場合に使用)、このクラスを含むJARファイルの場所を指定する必要があります。モザイクを正しく生成するには、その他のパラメータが必要です。

処理APIを使用するいくつかの例については、/opt/oracle/oracle-spatial-graph/spatial/raster/examples/java/srcを参照してください。Javaクラスを確認し、その目的を理解します。これらは/opt/oracle/oracle-spatial-graph/spatial/raster/examples/java/cmdにあるそれぞれの例に示すスクリプトを使用して実行できます。

スクリプトを実行してその結果を検証した後、用意されているスクリプト/opt/oracle/oracle-spatial-graph/spatial/raster/examples/java/build.xmlを使用して、試験を実行し、コンパイルできるようにJavaソース・ファイルを変更します。/opt/oracle/oracle-spatial-graph/spatial/raster/jlib directoryへの書込みアクセスが可能であることを確認します。

2.7 Oracle Spatial Hadoop Raster Simulator Frameworkを使用したラスター処理のテスト

カスタム処理クラスを作成する場合、Oracle Spatial Hadoop Raster Simulator Frameworkを使用して、これらをOracle Raster Processing Frameworkにプラグインすることを「偽装」することにより、次を実行できます。

- ローカル・コンピュータでのユーザー処理クラスの開発

- ユーザー処理クラスをクラスタ内またはBig Data Lite内でデプロイして正しく機能するかどうかを検証する必要性の回避

- ユーザー処理クラスのデバッグ

- 小さいローカルデータ・セットの使用

- ローカル・デバッグ出力の作成

- ユニット・テストの自動化

シミュレータ・フレームワークにより、ローカル環境内のロード・プロセスおよび処理プロセスがクラスタ内で実行されているかのように、これらがエミュレートされます。このため、必要なのは、1つ以上のラスターをロードしてXMLまたは構成オブジェクト内の仕様に応じてこれらを処理するJunitテスト・ケースを作成することのみです。

タイルは指定したブロック・サイズに応じて生成されるため、ブロック・サイズを設定する必要があります。実行するマッパーおよびリデューサの数は、通常のクラスタ実行の場合と同じように、タイルの数によって決まります。ロード・プロセス中に生成されるOHIFファイルは、HDFSが必要ないため、ローカル・ディレクトリに格納されます。

- シミュレータ(“モック”)オブジェクト

- ユーザーのローカル環境要件

- ラスターをロードおよび処理するためのサンプル・テスト・ケース

シミュレータ(“モック”)オブジェクト

ラスターをロードし、処理可能な.OHIFファイルに変換するには、RasterLoaderJobMockを実行する必要があります。このクラス・コンストラクタは、ブロック・サイズ、ロード対象のディレクトリまたはラスター、OHIFファイルを格納するための出力ディレクトリ、およびgdalディレクトリを含める必要があるHadoopConfigurationを受け取ります。入力ファイルおよびユーザー構成を表すパラメータは、これらを指定する方法によって変化します。

- カタログおよびユーザー構成XMLファイルの場所の文字列

- カタログ・オブジェクト(CatalogMock)

- 構成オブジェクト(MosaicProcessConfigurationMockまたはSingleProcessConfigurationMock)

- 単一のラスター処理およびユーザー構成の場所(MosaicProcessConfigurationMockまたはSingleProcessConfigurationMock)

ユーザーのローカル環境要件

テスト・ケースを作成する前に、ローカル環境を構成する必要があります。

1. 1. ディレクトリにネイティブgdalライブラリgdal-dataおよびlibprojがあることを確認します。
Linuxの場合:

a. 「Cartographic Projections Libraryの取得およびコンパイル」の手順に従いlibproj.soを取得します。

b. クラスタまたはBigDataLite VM (/opt/oracle/oracle-spatial-graph/spatial/raster/gdal)にあるSpatialインストールからgdalディストリビューションを取得します。

c. libproj.soを残りのネイティブgdalライブラリとともにgdal/libの下のローカルgdalディレクトリに移動します。

Windowsの場合:

a. クラスタまたはBigDataLite VM (/opt/oracle/oracle-spatial-graph/spatial/raster/examples/java/mock/lib/gdal_windows.x64.zip)にあるSpatialインストールからgdalディストリビューションを取得します。

b. Visual Studioがインストールされていることを確認します。インストールする場合、「Common Tools for Visual C++」を選択していることを確認します。

c. PROJ 4ソース・コード、バージョン・ブランチ4.9をhttps://trac.osgeo.org/proj/browser/branches/4.9からダウンロードします。

d. Visual Studio開発者コマンド・プロンプトを開き、以下を入力します。

cd PROJ4/src_dir
nmake /f makefile.vc

e. proj.dllを残りのネイティブgdalライブラリとともにgdal/binの下のローカルgdalディレクトリに移動します。

2. GDALネイティブ・ライブラリをシステム・パスに追加します。
Linuxの場合: LD_LIBRARY_PATHを対応するネイティブgdalライブラリ・ディレクトリとともにエクスポートします。

Windowsの場合: Path環境変数にネイティブgdalライブラリ・ディレクトリを追加します。

3. JavaプロジェクトにJunitライブラリがあることを確認します。

4. Javaプロジェクトのクラスパス内に次のHadoop jarおよびOracle Image Processing Frameworkファイルが含まれることを確認します。これらは、Oracle BigDataLite VMまたはクラスタから取得できます。これらはすべて、Hadoopディストリビューションに含まれるjarです。特定のフレームワークのjarについては、/opt/oracle/oracle-spatial-graph/spatial/raster/jlibを参照してください。
(次のリストでは、VERSION_INCLUDEDは、ファイルが含まれるHadoopインストールからのバージョン番号です。これは、BDAクラスタである場合やBigDataLite VMである場合があります。)

commons-collections-VERSION_INCLUDED.jar
commons-configuration-VERSION_INCLUDED.jar
commons-lang-VERSION_INCLUDED.jar
commons-logging-VERSION_INCLUDED.jar
commons-math3-VERSION_INCLUDED.jar
gdal.jar
guava-VERSION_INCLUDED.jar
hadoop-auth-VERSION_INCLUDED-cdhVERSION_INCLUDED.jar
hadoop-common-VERSION_INCLUDED-cdhVERSION_INCLUDED.jar
hadoop-imageloader.jar
hadoop-imagemocking-fwk.jar
hadoop-imageprocessor.jar
hadoop-mapreduce-client-core-VERSION_INCLUDED-cdhVERSION_INCLUDED.jar
hadoop-raster-fwk-api.jar
jackson-core-asl-VERSION_INCLUDED.jar
jackson-mapper-asl-VERSION_INCLUDED.jar
log4j-VERSION_INCLUDED.jar
slf4j-api-VERSION_INCLUDED.jar
slf4j-log4j12-VERSION_INCLUDED.jar

ラスターをロードおよび処理するためのサンプル・テスト・ケース

Javaプロジェクトがテスト・ケース用として準備された後、ラスターのロードおよび処理をテストできます。

次の例では、setUpメソッドを使用してクラスを作成し、gdal、ロード対象のラスター、構成XMLファイル、出力サムネイル、ohifファイルおよび処理結果用のディレクトリを構成します。また、ブロック・サイズ(8 MB)も構成しています。(単一のコンピュータの場合はブロック・サイズを小さくすることをお薦めします。)

/**
* Set the basic directories before starting the test execution
*/
@Before
public void setUp(){
String sharedDir = "C:\\Users\\zherena\\Oracle Stuff\\Hadoop\\Release 4\\MockTest";
String allAccessDir = sharedDir +  "/out/";
gdalDir = sharedDir + "/gdal";
directoryToLoad = allAccessDir + "rasters";
xmlDir = sharedDir + "/xmls/";
outputDir = allAccessDir;
blockSize = 8;
}

次の例では、RasterLoaderJobMockオブジェクトを作成し、ロード対象のラスター、およびOHIFファイルの出力パスを設定します。

/**
* Loads a directory of rasters, and generate ohif files and thumbnails
* for all of them
* @throws Exception if there is a problem during load process
*/
@Test
public void basicLoad() throws Exception {
System.out.println("***LOAD OF DIRECTORY WITHOUT EXPANSION***");
HadoopConfiguration conf = new HadoopConfiguration();
conf.setBlockSize(blockSize);
System.out.println("Set block size of: " +
conf.getProperty("dfs.blocksize"));
RasterLoaderJobMock loader = new RasterLoaderJobMock(conf,
outputDir, directoryToLoad, gdalDir);
//Puts the ohif file directly in the specified output directory
loader.dontExpandOutputDir();
System.out.println("Starting execution");
System.out.println("------------------------------------------------------------------------------------------------------------");
loader.waitForCompletion();
System.out.println("Finished loader");
System.out.println("LOAD OF DIRECTORY WITHOUT EXPANSION ENDED");
System.out.println();
System.out.println();
}

次の例では、RasterProcessorJobMockオブジェクトに対するカタログおよびユーザー構成XMLファイルを指定します。catalog xmlがローカルOHIFファイルの正しい場所を指し示していることを確認します。

/**
* Creates a mosaic raster by using configuration and catalog xmls.
* Only two bands are selected per raster.
* @throws Exception    if there is a problem during mosaic process.
*/
@Test
public void mosaicUsingXmls() throws Exception {
System.out.println("***MOSAIC PROCESS USING XMLS***");
HadoopConfiguration conf = new HadoopConfiguration();
conf.setBlockSize(blockSize);
System.out.println("Set block size of: " +
conf.getProperty("dfs.blocksize"));
String catalogXml = xmlDir + "catalog.xml";
String configXml = xmlDir + "config.xml";
RasterProcessorJobMock processor = new  RasterProcessorJobMock(conf, configXml, catalogXml, gdalDir);
System.out.println("Starting execution");
System.out.println("------------------------------------------------------------------------------------------------------------");
processor.waitForCompletion();
System.out.println("Finished processor");
System.out.println("***********************************************MOSAIC PROCESS USING XMLS ENDED***********************************************");
System.out.println();
System.out.println();

RasterProcessorJobMockに対してサポートされている様々な構成を使用した追加例は、/opt/oracle/oracle-spatial-graph/spatial/raster/examples/java/mock/srcに用意されています。これらには、外部処理クラスを使用した例が含まれており、このクラスも組み込まれていて、デバッグすることもできます。

2.8 Oracle Big Data Spatial Raster Processing for Spark

Oracle Big Data Spatial Raster Processing for Apache Sparkは、Spatial Raster Processing API for Javaです。

このAPIでは、次の機能を使用して、一連のユーザー定義の処理フェーズの結果からイメージを組み合わせて新たに作成できます。

- 各ブロック・サイズ分割が個別の四角形として格納され、その後のそれぞれの処理に使用される、HDFSイメージ・ストレージ

- 処理を分割するためにSparkを使用して並行して処理されるサブセット、モザイクおよびラスター代数演算。

- GDAL形式、複数帯域イメージ、DEM (数値標高モデル)、複数ピクセル深度、およびSRIDのサポート

- Sparkラスター・ローダー

- Spark SQLラスター・プロセッサ

- Sparkラスター処理APIの使用

2.8.1 Sparkラスター・ローダー

Spark Java API用のラスター処理を使用するには、最初にイメージをHDFSに保存し、次に各イメージをそれぞれ別のスマート・タイルに保存します。これにより、プロセッサを使用して各四角形を個別に処理できます。Sparkラスター・ローダーでは、単一イメージ、またはイメージのコレクションを並列でHDFSにインポートできるため、ロード時間を短縮できます。各ブロックにはすべてのラスター帯域のデータが含まれるため、特定のピクセルでその後処理が必要になった場合、その情報を単一ノードで処理できます。

Sparkラスター・ローダーの基本的なワークフローは、次のとおりです。

1. GDALを使用して、ラスターがインポートされ、ブロック・サイズに応じてこれらが四角形に分けられてから、各四角形がHDFSブロックとして格納されます。

2. ロード対象のラスターのセットが、JavaRDDの拡張機能であるSpatialRasterJavaRDDに読み込まれます。このRDDは、帯域の数、ピクセル・サイズ、HDFSブロック・サイズおよびラスター解像度に基づいてラスターごとに作成される四角形の情報を表すImagePieceWritableオブジェクトのコレクションです。これは、Spatial Hadoopローダーで使用されるカスタム入力形式を使用することによって実現されます。

3. 各四角形のラスター情報がロードされます。このロードは、各四角形のエグゼキュータによって実行されるため、読込みは並行して実行されます。それぞれの四角形は一定のバイト数(ユーザー入力)が重なっているため、隣接する四角形の領域にかかっています。Sparkエグゼキュータの数は、四角形の数、イメージ解像度、およびブロック・サイズに応じて“n”個になります。

4. RDDはキーによってグループ化されるため、同じラスターに対応する四角形はすべて同じレコードの一部になります。このRDDは、OhifOutputFormatを使用してOHIFとして保存されます。このクラスは、エグゼキュータによってロードされた情報をすべてまとめ、そのイメージを解像度、帯域、オフセット、イメージ・データを含む特別な.ohif形式で格納します。これにより、それぞれの四角形を含むファイル・オフセットとノード場所が明らかになります。イメージを読み込み戻すには、特別な読込みプロセスが必要であり、このプロセスは、Spark SQLラスター・プロセッサに含まれています。

それぞれの四角形には、各帯域の情報が含まれます。これは、一部の四角形のみを処理し、それに対応するブロックのみをロードする場合に役立ちます。

ローダーは、コマンドラインでパラメータを設定するか、Spark APIを使用することにより、構成できます。

- Sparkラスター・ローダーへの入力パラメータ

- Sparkラスター・ローダーの予想出力

2.8.1.1 Sparkラスター・ローダーへの入力パラメータ

次の例は、spark-submitコマンドを使用して提供される入力パラメータを示します。

spark-submit
--class <DRIVER_CLASS>
--driver-memory <DRIVER_JVM>
--driver-class-path <DRIVER_CLASSPATH>
--jars <EXECUTORS_JARS>
<DRIVER_JAR>
-files <SOURCE_IMGS_PATH>
-out <HDFS_OUTPUT_FOLDER>
-gdal <GDAL_LIB_PATH>
-gdalData <GDAL_DATA_PATH>
[-overlap <OVERLAPPING_PIXELS>]
[-thumbnail <THUMBNAIL_PATH>]
[-expand <false|true>]

説明:

- DRIVER_CLASSは、ドライバ・コードを持ち、Sparkによって実行されるクラスです。

- DRIVER_JVMは、ドライバのJVMに割り当てるメモリーです。

- DRIVER_CLASSPATHは、ドライバ・クラスのクラスパスで、jarはコロンによって区切られます。

- EXECUTOR_JARSは、エグゼキュータに配布されるクラスパスで、jarはカンマによって区切られます。

- DRIVER_JARは、Sparkによって実行される<DRIVER_CLASS>が含まれるjarです。

- SOURCE_IMGS_PATHは、ソース・ラスターまたはフォルダのパスです。入力が複数の場合はカンマで区切ります。NFSを介してクラスタ内のすべてにアクセスできるパスを指定する必要があります。

- HDFS_OUTPUT_FOLDERはロードしたイメージを格納するHDFS出力フォルダです。

- OVERLAPPING_PIXELSはそれぞれの四角形の境界線上で重なるピクセルの任意の数であり、このパラメータが指定されていない場合、重なっている2つのピクセルのデフォルトが使用されます。

- GDAL_LIB_PATHはGDALライブラリの場所を示すパスです。

- GDAL_DATA_PATHはGDALデータ・フォルダの場所を示すパスです。NFSを介してクラスタ内のすべてにアクセスできるパスを指定する必要があります。

- THUMBNAIL_PATHはロードしたイメージのサムネイルを格納する任意のパスです。NFSを介してクラスタ内のすべてにアクセスでき、Yarnユーザーの書込みアクセス権のあるパスを指定する必要があります。

- -expandは、ロードされたラスターのHDFSパスによってソース・パス(すべてのディレクトリを含む)が拡張されるかどうかを制御します。これをfalseに設定すると、.ohifファイルは、(-oオプションを使用して指定された)出力ディレクトリに直接格納され、この場合、このラスター内のこのディレクトリのパスは含まれません。

それぞれの四角形には、各帯域の情報が含まれます。これは、一部の四角形のみを処理し、それに対応するブロックのみをロードする場合に役立ちます。

ローダーは、コマンドラインでパラメータを設定するか、Spark APIを使用することにより、構成できます。

2.8.1.2 Sparkラスター・ローダーの予想出力

Sparkラスター・ローダーに対する各出力イメージには、入力イメージごとに2つの出力ファイルがあります。

- ソース・イメージのすべての四角形を集める.ohifファイル。各四角形(HDFSブロックとして格納されます)は、処理エグゼキュータによって別のインスタンスとして処理される場合があります。.ohifファイルは、–expandが使用されなかった場合、/user/<USER_EXECUTING_JOB>/OUT_FOLDER/<PARENT_DIRECTORIES_OF_SOURCE_RASTER>の下にあるユーザー指定フォルダに、-outフラグを付けて格納されます。それ以外の場合、.ohifは/user/<USER_EXECUTING_JOB>/OUT_FOLDER/に配置され、このファイルはoriginal_filename.ohifとして識別できます。

- イメージのすべてのピースをリストし、それぞれがカバーする座標を示す関連メタデータ・ファイル。このファイルは、spatial_raster/metadataの場所にあるHDFSに置かれており、その名前は.ohifファイルの名前を使用してハッシュ生成されます。このファイルはOracle内部専用であり、ソース・ラスターの重要なメタデータをリストします。メタデータ・ファイルのサンプル行の一部は次のとおりです。

size:3200,2112
srid:26904
datatype:1
resolution:27.90809458890406,-27.90809458890406
file:/user/hdfs/ohiftest/opt/shareddir/spatial/data/rasters/hawaii.tif.ohif
bands:3
mbr:532488.7648166901,4303164.583549625,582723.3350767174,4269619.053853762
0,532488.7648166901,4303164.583549625,582723.3350767174,4269619.053853762
thumbnailpath:/opt/shareddir/spatial/thumb/

-thumbnailフラグが指定されている場合、ソース・イメージのサムネイルが関連フォルダに格納されます。これは.ohifファイルの変換を視覚化する方法の1つです。実行ログには、コマンドyarn logs -applicationId <applicationId>を使用してアクセスできます。

2.8.2 Spark SQLラスター・プロセッサ

イメージがHDFSにロードされたら、Spark SQLラスター・プロセッサを使用して処理できるようになります。モザイク定義XML構造またはSpark APIを使用して予想されるラスター出力機能を指定すると、モザイクUDFにより、四角形がその出力に適合するようフィルタおよび処理されます。ラスター代数演算はUDFで実行可能です。

Hadoopラスター処理フレームワークでも使用されるカスタムInputFormatは、ラスターSRIDおよび座標を使用して入力(モザイクの記述または単一のラスター)に基づいて特定のデータのブロックをロードし、処理操作を受け入れる前に最終出力に適合する帯域およびピクセルのみを選択します。

- モザイク処理要求の場合、交差する四角形のみが選択され、これらの1つずつに分割が作成されます。

- 単一のラスター処理要求の場合、すべての四角形が選択され、これらの1つずつに分割が作成されます。

Spark SQLラスター・プロセッサを使用すると、四角形を表すすべての行とともに、入力カタログまたはラスターに基づいてOHIF四角形をフィルタしてDataframeにまとめ、Spatial UDF Spark機能を使用してこれらを処理できます。

簡略化されたSpark SQLラスター処理の擬似コード表現は、次のとおりです。

sqlContext.udf().register("localop", new LocalOperationsFunction(), DataTypes.StringType);
tileRows.registerTempTable("tiles");
String query = "SELECT localop(tileInfo, userRequest,  \"localnot\"), userRequest FROM tiles";
DataFrame processedTiles = sqlContext.sql(query);

Spark SQLラスター・プロセッサの基本的なワークフローは、以下のとおりです。

1. 処理対象のラスターが最初に四角形メタデータにRDDとしてロードされます。ユーザーがモザイク操作用の構成を設定している場合、これらの四角形をフィルタできます。RDDは後で、2つの複雑な行のSpark DataFrameに変換されます。最初の行は、四角形のすべてのメタデータが含まれるtileInfoで、2番目の行は、ラスタークライアントの予想される機能がリストされたユーザー入力構成が含まれるuserRequestです。

2. DataFrameが作成されたら、ドライバは、処理対象の問合せを実行する前に、“localop” UDFを登録するとともに、DataFrameも表として登録する必要があります。モザイクUDFを実行できるのは、ユーザーが必要なパラメータをすべて正しく構成した場合のみです。XMLが使用されておらず、APIを使用して構成が設定されている場合、setExecuteMosaic(false)メソッドが設定されていない限り、デフォルトでは、モザイク操作構成が予想されます。

3. モザイク操作では、すべての四角形から出力に適合するピクセルのみを選択し、必要に応じて解像度を変更してモザイク出力に追加します。

4. 問合せが実行されたら、エグゼキュータにより、データのローカル性を保ちながら、四角形に対応するデータがロードされ、指定したローカル・ラスター代数演算が実行されます。

5. DataFrame内の行が新しいピクセル・データを使用して更新され、後処理が必要になった場合のためにドライバに返されます。

6. 処理が完了したら、DataFrameは、処理された四角形のMapReduce表現であるImageBandWritableオブジェクトのリストに変換されます。これらは、ProcessedRasterCreatorに入力されます。ここでは、ローカル・ラスター代数演算および/またはモザイク操作の結果として生成されたバイトがまとめられ、ユーザーの要求に応じて最終的なラスターがHDFSまたは通常のファイル・システムに格納されます。

ユーザー構成入力のデータ型(ピクセル深度)と同じデータ型(モザイク深度)のイメージのみが該当します。ユーザーがモザイク出力に指定した座標と交差する四角形のみが含まれます。単一のラスター操作の場合、処理は完全なイメージに対して実行されるため、フィルタには、入力ラスターのすべての四角形が含まれます。

- Spark SQLラスター・プロセッサへの入力パラメータ

- Spark SQLラスター・プロセッサの予想出力

2.8.2.1 Spark SQLラスター・プロセッサへの入力パラメータ

次の例は、spark-submitコマンドを使用して提供される入力パラメータを示します。

spark-submit
--class <DRIVER_CLASS>
--driver-memory <DRIVER_JVM>
--driver-class-path <DRIVER_CLASSPATH>
--jars <EXECUTORS_JARS>
<DRIVER_JAR>
-config  <MOSAIC_CONFIG_PATH>
-gdal  <GDAL_LIBRARIES_PATH>
-gdalData  <GDAL_DATA_PATH>
[-catalog  <IMAGE_CATALOG_PATH>]
[-file  <SINGLE_RASTER_PATH>]

説明:

- DRIVER_CLASSは、ドライバ・コードを持ち、Sparkによって実行されるクラスです。

- DRIVER_JVMは、ドライバのJVMに割り当てるメモリーです。

- DRIVER_CLASSPATHは、ドライバ・クラスのクラスパスで、jarはコロンによって区切られます。

- EXECUTOR_JARSは、エグゼキュータに配布されるクラスパスで、jarはカンマによって区切られます。

- DRIVER_JARは、Sparkによって実行される<DRIVER_CLASS>が含まれるjarです。

- MOSAIC_CONFIG_PATHは、出力の機能を定義するモザイク構成XMLへのパスです。

- GDAL_LIBRARIES_PATHはGDALライブラリの場所を示すパスです。

- GDAL_DATA_PATHはGDALデータ・フォルダの場所を示すパスです。NFSを介してクラスタ内のすべてにアクセスできるパスを指定する必要があります。

- IMAGE_CATALOG_PATHは、処理対象のHDFSイメージをリストするカタログxmlへのパスです。–fileフラグを使用して処理する単一のラスターも指定できるため、これはオプションです。

- SINGLE_RASTER_PATHは、ジョブによって処理される.ohifファイルへの任意のパスです。これが設定されている場合、カタログを設定する必要はありません。

次の例のコマンドは、testFS.xmlファイルに設定されているモザイク出力定義を使用して、カタログ・ファイルinputSPARK.xmlにリストされるすべてのファイルを処理します。

spark-submit --class oracle.spatial.spark.raster.test.SpatialRasterTest --driver-memory 2048m  --driver-class-path /opt/oracle/oracle-spatial-graph/spatial/raster/jlib/hadoop-raster-fwk-api.jar:/opt/oracle/oracle-spatial-graph/spatial/raster/jlib/gdal.jar:/opt/oracle/oracle-spatial-graph/spatial/raster/jlib/hadoop-imageloader.jar:/opt/oracle/oracle-spatial-graph/spatial/raster/jlib/hadoop-imageprocessor.jar --jars /opt/oracle/oracle-spatial-graph/spatial/raster/jlib/hadoop-imageloader.jar,/opt/oracle/oracle-spatial-graph/spatial/raster/jlib/hadoop-imageprocessor.jar,/opt/oracle/oracle-spatial-graph/spatial/raster/jlib/gdal.jar /opt/oracle/oracle-spatial-graph/spatial/raster/jlib/spark-raster-fwk-api.jar -taskType algebra -catalog /opt/shareddir/spatial/data/xmls/inputSPARK.xml -config /opt/shareddir/spatial/data/xmls/testFS.xml -gdal /opt/oracle/oracle-spatial-graph/spatial/raster/gdal/lib –gdalData /opt/shareddir/data

2.8.2.2 Spark SQLラスター・プロセッサの予想出力

Spark処理の場合、ファイル・システムの出力のみがサポートされています。つまり、生成された出力は、指定されたファイル名およびタイプを持つイメージであり、通常のFileSystemに格納されます。

ジョブ実行ログには、コマンドyarn logs -applicationId <applicationId>を使用してアクセスできます。

2.8.3 Sparkラスター処理APIの使用

SparkラスターAPIを使用して、ドライバ・クラスを作成することによってラスターをロードおよび処理できます。

一部のクラス例は、/opt/oracle/oracle-spatial-graph/spatial/raster/examples/java/srcの下に用意されています。また、/opt/oracle/oracle-spatial-graph/spatial/raster/examples/java/cmdディレクトリにも、これらの例をコマンドラインから実行するためのスクリプトが含まれています。

スクリプトを実行してその結果を検証した後、用意されているスクリプト/opt/oracle/oracle-spatial-graph/spatial/raster/examples/java/build.xmlを使用して、試験を実行し、コンパイルできるようにJavaソース・ファイルを変更できます。/opt/oracle/oracle-spatial-graph/spatial/raster/jlibへの書込みアクセスが可能であることを確認します。

GDALが適切に機能するように、$LD_LIBRARY_PATHを使用してライブラリを使用可能にする必要があります。ジョブを実行する前に、共有ライブラリ・パスがシェル・ウィンドウに適切に設定されていることを確認してください。次に例を示します。

export LD_LIBRARY_PATH=$ALLACCESSDIR/gdal/native

- Sparkラスター・ローダーAPIの使用

- Spark SQLプロセッサAPIを使用するための構成

- DataFrameの作成

- ラスター代数演算用のSpark SQLの使用

2.8.3.1 Sparkラスター・ローダーAPIの使用

イメージ・ロードを実行するには、SpatialRasterLoaderオブジェクトを作成する必要があります。このオブジェクトを使用して、実行に必要な構成情報を設定します。インスタンスの作成には2つの方法があります。

- コマンドラインから受け取った引数の配列をパラメータとして送信します。次に例を示します。

//args is the String[] received from command line
SpatialRasterLoader core = new SpatialRasterLoaderCore(args);

- このトピックの対象であるAPIを使用してドライバ・クラス内で直接構成します

ローダーAPIを使用して、GDALライブラリ・パスを設定します。これにより、SparkContextおよび対応するHadoop構成が内部的に初期化されるためです。次に例を示します。

SpatialRasterLoader core = new SpatialRasterLoader();
core.setGdalLibrary("/opt/sharedddir/spatial/gdal");
core.setFilesToLoad("/opt/shareddir/spatial/rasters");
core.setHDFSOutputDirectory("ohifsparktest");
core.setGdalData("/opt/shareddir/data");
core.setOverlap("20");
core.setThumbnailDirectory("/opt/shareddir/spatial/");

関連するラスターの最も一般的なサイズに応じて、ブロック・サイズを必要に応じて変更できます。たとえば、クラスタのHDFSのブロック・サイズがデフォルトでは大きすぎるときに(256MBなど)、ユーザー・ラスターの平均サイズが64MBである場合、ピクセルによってブロックが埋められていなくてもHDFS内のブロックがすべての四角形によって占有されるため、実際のデータが含まれないHDFS空間の使用は避ける必要があります。このシナリオでは、次の例のように、ブロック・サイズを64MBに変更できます。

JavaSparkContext sc = core.getRasterSparkContext();
core.getHadoopConfiguration().set("dfs.blocksize", "67108864");

ローダーを実行するには、ラスターのロードが成功した場合はtrueを返し、失敗した場合はfalseを返すloadRastersメソッドを使用します。次に例を示します。

if (core.loadRasters(sc, StorageLevel.DISK_ONLY())) {
LOG.info("Successfully loaded raster files");
}

処理が正常に終了した場合、OHIFファイルはHDFS内に格納され、対応するサムネイルは、ユーザー検証のために指定されたディレクトリに格納されます。

2.8.3.2 Spark SQLプロセッサAPIを使用するための構成

プロセッサを実行するには、SpatialRasterProcessorオブジェクトを作成し、実行に必要な構成情報を設定する必要があります。インスタンスの作成には2つの方法があります。

- コマンドラインから受け取った引数の配列をパラメータとして送信します。次に例を示します。

//args is the String[] received from command line
SpatialRasterProcessor processor = new SpatialRasterProcessor(args);

- このトピックの対象であるAPIを使用してドライバ・クラス内で直接構成します

ローダーAPIを使用して、GDALライブラリ・パスを設定します。これにより、SparkContextおよび対応するHadoop構成が内部的に初期化されるためです。次に例を示します。

SpatialRasterProcessor processor = new SpatialRasterProcessor();
processor.setGdalLibrary("/opt/sharedddir/spatial/gdal");
processor.setGdalData("/opt/sharedddir/spatial/data");

処理対象のラスターを指定します。

- 処理するラスターのカタログの追加については、モザイク操作を実行する場合は特に、次の例を考慮してください。

String ohifPath = "ohifsparktest/opt/shareddir/spatial/data/rasters");
//Creates a catalog to list the rasters to process
RasterCatalog catalog = new RasterCatalog();

//Creates a raster object for the catalog
Raster raster = new Raster();
//raster of 3 bands
raster.setBands(3);
//the tree bands will appear in order 1,2,3. You may list less bands here.
raster.setBandsOrder("1,2,3");
//raster data type is byte
raster.setDataType(1);

raster.setRasterLocation(ohifPath + "hawaii.tif.ohif");
//Add raster to catalog
//catalog.addRasterToCatalog(raster);

Raster rasterKahoolawe = new Raster();
rasterKahoolawe.setBands(3);
rasterKahoolawe.setBandsOrder("1,2,3");
rasterKahoolawe.setDataType(1);
rasterKahoolawe.setRasterLocation(ohifPath + "kahoolawe.tif.ohif");
catalog.addRasterToCatalog(rasterKahoolawe);

//Sets the catalog to the job
processor.setCatalogObject(catalog.getCompactCatalog());

- 単一のラスターの処理については、次の例を考慮してください。

String ohifPath = "ohifsparktest/opt/shareddir/spatial/data/rasters");
//Set the file to process to the job
processor.setFileToProcess(ohifPath + "NapaDEM.tif.ohif");*/

出力ラスターの詳細を定義するユーザー構成要求を設定します。

- モザイク操作を実行する場合、予想される出力のすべての機能(座標を含む)をMosaicConfigurationオブジェクトに設定する必要があります。次の例では、以前にカタログに追加されたハワイのラスターが両方とも含まれるラスターを作成します。

MosaicConfiguration mosaic = new MosaicConfiguration();
mosaic.setFormat("GTIFF");
mosaic.setBands(3);
mosaic.setFileSystem(RasterProcessorJob.FS);
mosaic.setDirectory("/opt/shareddir/spatial/processtest");
mosaic.setFileName("HawaiiIslands");
mosaic.setHeight(986);
//value for pixels where there is no data, starts with #, followed by
//two characters per band
mosaic.setNoData("#FFFFFF");
//byte datatype
mosaic.setPixelType("1");
//width for pixels in X and Y
mosaic.setPixelXWidth(280.388143);
mosaic.setPixelYWidth(-280.388143);
mosaic.setSrid("26904");
//upper left coordinates
mosaic.setUpperLeftX(556958.985610);
mosaic.setUpperLeftY(2350324.082505);
mosaic.setWidth(1600);
mosaic.setOrderAlgorithm(ProcessConstants.ALGORITHM_FILE_LENGTH);
mosaic.setOrder(RasterProcessorJob.DESC);
//mosaic configuration must be set to the job
processor.setUserRequestConfigurationObject(mosaic.getCompactMosaic());

- モザイク操作を実行しない場合は、より簡単な構成が必要です。次に例を示します。

MosaicConfiguration mosaic = new MosaicConfiguration();
mosaic.setExecuteMosaic(false);
mosaic.setBands(1);
mosaic.setLayers("1");
mosaic.setDirectory("/opt/shareddir/spatial/processtest");
mosaic.setFileSystem(RasterProcessorJob.FS);
mosaic.setNoData("#00");

この時点で、必要な構成がすべて完了しました。これで、処理を開始できます。

2.8.3.3 DataFrameの作成

ラスターに対して問合せを実行する前に、すべての行が分割を表しているDataFrameにこれらをロードする必要があります。これらの分割はまとめて四角形のSpatialJavaRDDとして作成され、これがDataFrameに変換されます。使用可能なJVMランタイム・メモリーに応じて、DataFrameをメモリーまたはディスクにキャッシュすることをお薦めします。ディスクにキャッシュする場合、SparkインストールにKryoが使用されている必要があります。

DataFrameは、tileInfoとuserRequestという2つの複雑な列で構成されています。

- tileInfo: ピクセル情報だけでなくメタデータの詳細を含む、すべての四角形に関するデータ。

表2-2 tileInfo列データ

列

データ型

NULL値可能

説明

dstWidthSize

Integer

False

幅

dstHeightSize

Integer

False

高さ

bands

Integer

False

帯域の数

dType

Integer

False

データ型

piece

Integer

False

ソース・ラスター内のピース合計のピース数

offX

Integer

False

X内のオフセット

offY

Integer

False

Y内のオフセット

sourceWidth

Integer

False

ソース・ラスターの幅

sourceHeight

Integer

False

ソース・ラスターの高さ

bytesNumber

Integer

False

バイトの数

baseArray

[[Pixel DataType]]

False

ピクセルの配列(帯域ごとに1つ)

basePaletteArray

[[整数]]

True

パレット解釈の配列(ラスターに含まれる場合、帯域ごとに1つ)

baseColorArray

[Integer]

False

色の配列(帯域ごとに1つ)

noDataArray

[Double]

False

NODATA値の配列(帯域ごとに1つ)

Overlap

Integer

False

重なるピクセルの数

leftOv

Byte

False

左側に重なるピクセルがあるかどうかを示すフラグ

rightOv

Byte

False

右側に重なるピクセルがあるかどうかを示すフラグ

upOv

Byte

False

上側に重なるピクセルがあるかどうかを示すフラグ

downOv

Byte

False

下側に重なるピクセルがあるかどうかを示すフラグ

projectionRef

String

False

予測参照

geoTransform

[Double]

False

地理変換配列

Metadata

[String]

False

場所メタデータ

lastModified

Long

False

ソース・ラスターの最終変更日

imageLength

Double

False

ソース・ラスターの長さ

dataLength

Integer

True

モザイク後のバイトの数

xCropInit

Integer

True

モザイク後のX内の開始ピクセル

yCropInit

Integer

True

モザイク後のY内の開始ピクセル

xCropLast

Integer

True

モザイク後のX内の終了ピクセル

yCropLast

Integer

True

モザイク後のY内の終了ピクセル

catalogOrder

Integer

False

カタログ内の順序

baseMountPoint

String

False

ソース・ラスターのパス

sourceResolution

String

False

ソース・ラスターの解像度

extraFields

[String]

True

その他のフィールド・マップ、NA

- userRequest: 予想される出力ラスター機能が定義されているユーザー要求構成。

表2-3 userRequest列データ

列

データ型

NULL値可能

説明

offset

Long

False

オフセット

piece

Integer

False

ピース数

splitSize

Long

False

分割サイズ

bandsToAdd

String

False

出力に含める帯域(“1,2,3”など)

upperLeftX

Double

True

モザイクの要求時に使用されるXの左上の出力の座標

upperLeftY

Double

True

モザイクの要求時に使用されるYの左上の出力の座標

lowerRightX

Double

True

モザイクの要求時に使用されるXの右下の出力の座標

lowerRightY

Double

True

モザイクの要求時に使用されるYの右下の出力の座標

width

Integer

True

モザイクが要求されたときに使用される出力の幅

height

Integer

True

モザイクが要求されたときに使用される出力の高さ

srid

String

True

モザイクが要求されたときに使用される出力のSRID

order

String

True

モザイクが要求されたときに使用される出力の順序(昇順または降順)

format

String

True

モザイクが要求されたときに使用される出力のGDAL形式

noData

String

False

出力のNODATA値(#の後ろに帯域当たり2桁の数値、たとえば、3帯域出力の場合は“#000000”)

pixelType

String

True

モザイクが要求されたときに使用される出力のGDALデータ型

Directory

String

False

出力ディレクトリ

pixelXWidth

Double

True

モザイクが要求されたときに使用される出力のピクセルの幅

pixelYWidth

Double

True

モザイクが要求されたときに使用される出力のピクセルの高さ

wkt

String

False

ソース予測参照

mosaicWkt

String

True

モザイクが要求されたときに使用される出力の予測参照

processingClasses

String

True

実行対象のユーザー処理クラス(Sparkではまだサポートされていません)

reducingClasses

String

True

実行対象のユーザー・リデュース・クラス(Sparkではまだサポートされていません)

tempOut

String

True

HDFS出力が要求された場合の一時出力フォルダ(Sparkではまだサポートされていません)

filename

String

False

出力のファイル名

contextId

String

False

実行コンテキストID

sourceResolution

String

False

ソース・ラスターの解像度

catalogOrder

Integer

False

カタログ内のソース・ラスターの順序

executeMosaic

Boolean

False

モザイク操作が要求されたかどうかを示すフラグ

次の例では、DataFrameを作成し、これに関する情報を表示します。

JavaSparkContext sc = processor.getRasterSparkContext();
SpatialRasterJavaRDD<GeneralInfoWritable> spatialRDD = processor.getProcessSplits();
HiveContext sqlContext = new HiveContext(sc.sc());
DataFrame tileRows = spatialRDD.createSpatialTileDataFrame(sqlContext, StorageLevel.DISK_ONLY());

Row[] rows = tileRows.collect();
System.out.println("First Tile info: ");
System.out.println("Width " + rows[0].getStruct(0).getInt(0));
System.out.println("Height " + rows[0].getStruct(0).getInt(1));
System.out.println("Total width " + rows[0].getStruct(0).getInt(7));
System.out.println("Total height " + rows[0].getStruct(0).getInt(8));
System.out.println("File " + rows[0].getStruct(0).getString(30));

System.out.println("First Tile User request data: ");

System.out.println("Bands to add " + rows[0].getStruct(1).getString(3));

2.8.3.4 ラスター代数演算用のSpark SQLの使用

Spark UDF localopを使用すると、Hadoopイメージ・プロセッサを使用してイメージを処理するために、「地図代数演算」で説明されているラスター代数演算を実行できます。Spark SQL UDF用の演算名およびサポート対象のデータ型は、Hadoopの場合と同じです

任意の問合せが実行される前に、ドライバ・クラスでは、UDFを登録するとともに、四角形のDataFrameを一時表として登録する必要があります。次に例を示します。

sqlContext.udf().register("localop", new LocalOperationsFunction(),
DataTypes.createStructType(SpatialRasterJavaRDD.createSimpleTileStructField(dataTypeOfTileToProcess)));
tileRows.registerTempTable("tiles");

これで、localop UDFが登録され、使用する準備が整いました。この関数は、2つのパラメータを受け取ります。

- tileInfo行

- 実行対象のラスター代数演算が含まれる文字列。同じ問合せ内で複数の演算を実行でき、これらはセミコロンで区切る必要があります。パラメータを受け取る演算の場合、これらをカンマで区切る必要があります。

この関数により、問合せに送信されたtileInfoが返されますが、これとともに、実行された演算に基づいて更新されたピクセル・データも返されます。

以下に、様々な演算の実行の例を示します。

String query = "SELECT localop(tileInfo, \"localnot\"),
userRequest FROM tiles";

String query = "SELECT localop(tileInfo,\"localadd,456;localdivide,2;
localif,>,0,12;localmultiply,20;
localpow,2;localsubstract,4;
localsqrt;localacos\"),
userRequest FROM tiles";
String query = "SELECT localop(tileInfo,\"localnot;localatan;localcos;
localasin;localtan;localcosh;
localtanh\"), userRequest FROM tiles";

問合せを実行するには、以下を入力します。

DataFrame cachedTiles = processor.queryAndCache(query, sqlContext);

この新しいDataFrameには、更新されたピクセルがあります。必要に応じて、特定の四角形のコンテンツをTIFファイルとして保存でき、このファイル内でこの四角形は構成済の出力ディレクトリ内に格納されます。次に例を示します。

Row[] pRows = cachedTiles.collect();
processor.debugTileBySavingTif(pRows[0],
processor.getHadoopConfiguration());

モザイク操作を実行するには、最初に任意のラスター代数演算を実行してから、モザイク操作を実行します。新しいSpark UDFがモザイク操作に使用されます。これは、tileInfoおよびuserRequest列を受け取り、モザイクに適合するよう更新されたtileInfoを返します。次に例を示します。

sqlContext.udf().register("mosaic", new MosaicFunction(),
DataTypes.createStructType(SpatialRasterJavaRDD.createSimpleTileStructField(dataTypeOfTileToProcess)));
cachedTiles.registerTempTable("processedTiles");
String queryMosaic = "SELECT mosaic(tileInfo, userRequest), userRequest
FROM processedTiles";
DataFrame mosaicTiles = processor.queryAndCache(queryMosaic,
sqlContext);

処理が完了したら、内部操作用の一時HDFSディレクトリ、マージ対象のDataFrame、およびSparkコンテキストをHadoop構成から受け取るProcessedRasterCreatorを使用することにより、四角形を出力ラスターにまとめることができます。これにより、指定した出力ディレクトリ内に予想される出力ラスターが作成されます。次に例を示します。

try {
ProcessedRasterCreator creator = new ProcessedRasterCreator();
creator.create(new Text("createOutput"), mosaicTiles,
sc.hadoopConfiguration());
LOG.info("Finished");
} catch (Exception e) {
LOG.error("Failed processor job due to " + e.getMessage());
throw e;
}

2.9 Oracle Big Data Spatial Vector Analysis

Oracle Big Data Spatial Vector AnalysisはSpatial Vector Analysis APIであり、Hadoopジョブとして実行され、HDFSに格納されているデータの空間処理のためのMapReduceコンポーネントを提供します。

これらのコンポーネントでは、Spatial Java APIを利用して空間分析タスクを実行します。このAPIには、Webコンソールも用意されています。

- 複数のHadoop APIのサポート

- 空間の索引付け

- MVSuggestの使用

- 空間のフィルタ処理

- データの階層分類

- バッファの生成

- 空間のビニング

- 空間のクラスタ化

- 空間の結合

- 空間のパーティション化

- RecordInfoProvider

- HierarchyInfo

- MapReduceジョブでのJGeometryの使用

- 異なるデータ・ソースのサポート

- ジョブ・レジストリ

- Vector Analysis APIを使用したジョブ実行時間のパフォーマンス・データのチューニング

関連項目:

次の情報を参照し、実装について詳しく理解してください。

- RecordInfoProvider

- HierarchyInfo

- MapReduceジョブでのJGeometryの使用

- Vector Analysis APIを使用したジョブ実行時間のパフォーマンス・データのチューニング

2.9.1 複数のHadoop APIのサポート

Oracle Big Data Spatial Vector Analysisには、新旧両方の(コンテキスト・オブジェクト) Hadoop API用のクラスが用意されています。通常、mapredパッケージ内のクラスが古いAPIとともに使用され、mapreduceパッケージ内のクラスが新しいAPIとともに使用されます

このガイドの例では古いHadoop APIを使用しますが、すべての古いHadoop Vector APIクラスが新しいAPI内に同等のクラスを持ちます。たとえば、古いクラスであるoracle.spatial.hadoop.vector.mapred.job.SpatialIndexingは、oracle.spatial.hadoop.vector.mapreduce.job.SpatialIndexingという名前の新しい同等のクラスを持ちます。通常、別途記述がない限り、新しいHadoop API Vectorクラスを使用するには、mapredからmapreduceに変更するだけですみます。

mapredまたはmapreduceパッケージに含まれていないoracle.spatial.hadoop.vector.RecordInfoなどのクラスには、両方のHadoop APIとの互換性があります。

2.9.2 空間の索引付け

空間の索引付けは、キー/値ペアの形式をとり、Hadoop MapFileとして生成されます。それぞれのMapFileエントリには、元のデータの分割の1つに対する空間索引付けが含まれます。キー/値ペアには次の情報が含まれます。

- キー: パス + 開始オフセット + 長さの形式の分割識別子。

- 値: 実際に索引付けしたレコードを含む空間索引の構造。

次の図は、ユーザー・データに関連する空間索引を表します。レコードはr1、r2、のように表現されます。レコードは分割(Split 1、Split 2、Split 3、Split n)ごとにまとめられます。それぞれの分割にはキー/値ペアがあり、キーは分割を表し、値はその分割のレコード上にあるRtree索引を表します。

- 空間の索引付けクラスの構造

- 空間索引を作成する構成

- 空間索引メタデータ

- 空間索引の入力形式

- GeoJSONおよびShapefile形式のサポート

- 空間索引の削除

2.9.2.1 空間の索引付けクラスの構造

空間の索引付けのレコードは、クラスoracle.spatial.hadoop.vector.RecordInfoを使用して表現されます。RecordInfoには通常、元のレコード・データのサブセット、およびレコードが格納されているファイル内でレコードを特定する方法が含まれています。それぞれのRecordInfoデータは次の2つに応じて異なります。

- データの読取りに使用するInputFormat

- レコードのデータを提供するRecordInfoProvider実装

RecordInfoには次のフィールドが含まれています。

- Id: レコードIDを含むテキスト・フィールド。

- Geometry: レコード・ジオメトリのあるJGeometryフィールド。

- Extra fields: その他の任意のレコード・フィールドを名前/値ペアとして追加できます。値は常にテキストで表現されます。

- Start offset: バイト・オフセットとしてのファイル内のレコードの位置。この値は元のデータを読み取るInputFormatによって異なります。

- Length: 元のレコードの長さ(バイト単位)。

- Path: ファイル・パスはオプションで追加できます。ファイル・パスは空間の索引付けエントリ・キーとして把握できるため、これはオプションです。ただし、空間索引を作成するときにRecordInfoインスタンスへのパスを追加するには、構成プロパティoracle.spatial.recordInfo.includePathFieldキーの値がtrueに設定されます。

2.9.2.2 空間索引を作成する構成

空間索引はFileSplitInputFormat、SpatialIndexingMapper、InputFormat、およびRecordInfoProviderを組み合せて作成されますが、この最後の2つはユーザーが提供します。次のコードの例は、HDFSフォルダ/user/dataで特定されたデータの空間索引を作成するジョブを実行するために必要な構成の一部を示します。

//input

conf.setInputFormat(FileSplitInputFormat.class);
FileSplitInputFormat.setInputPaths(conf, new Path("/user/data"));
FileSplitInputFormat.setInternalInputFormatClass(conf, GeoJsonInputFormat.class);
FileSplitInputFormat.setRecordInfoProviderClass(conf, GeoJsonRecordInfoProvider.class);

//output

conf.setOutputFormat(MapFileOutputFormat.class);
FileOutputFormat.setOutputPath(conf, new Path("/user/data_spatial_index"));

//mapper

conf.setMapperClass(SpatialIndexingMapper.class);
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(RTreeWritable.class);

この例では次のとおりです。

- FileSplitInputFormatはジョブInputFormatとして設定されています。FileSplitInputFormatは、データを読み取るための別のInputFormat実装(internalInputFormat)を使用する抽象クラスであるCompositeInputFormat (新しいHadoop APIバージョン内のWrapperInputFormat)のサブクラスです。内部InputFormatおよびRecordInfoProvider実装はユーザーによって指定され、それぞれGeoJsonInputFormatおよびGeoJsonRecordInfoProviderに設定されます。

- MapFileOutputFormatは、MapFileを生成するためにOutputFormatとして設定されます

- マッパーはSpatialIndexingMappperに設定されます。マッパー出力キーおよび値のタイプは、Text (分割識別子)およびRTreeWritable (実際の空間索引)です。

- リデューサ・クラスが指定されていないため、デフォルトのリデューサで実行されます。出力MapFileキーをソートするには、リデュース・フェーズが必要です。

また、この構成は、oracle.spatial.hadoop.vector.mapred.job.SpatialIndexingクラスを使用すると設定が容易になります。SpatialIndexingは空間索引を作成するジョブ・ドライバです。次の例では、SpatialIndexingインスタンスが作成および設定され、configure()メソッドを呼び出してジョブ構成への設定の追加に使用されます。構成が設定されると、ジョブが開始されます。

SpatialIndexing<LongWritable, Text> spatialIndexing = new SpatialIndexing<LongWritable, Text>();

//path to input data

spatialIndexing.setInput("/user/data");

//path of the spatial index to be generated

spatialIndexing.setOutput("/user/data_spatial_index");

//input format used to read the data

spatialIndexing.setInputFormatClass(TextInputFormat.class);

//record info provider used to extract records information

spatialIndexing.setRecordInfoProviderClass(TwitterLogRecordInfoProvider.class);

//add the spatial indexing configuration to the job configuration

spatialIndexing.configure(jobConf);

//run the job

JobClient.runJob(jobConf);

2.9.2.3 空間索引メタデータ

作成されるすべての空間索引にメタデータ・ファイルが生成されます。空間索引メタデータを使用すると、索引付きレコードの数、索引付きデータの最小外接矩形(MBR)、および空間索引と索引付きソース・データの両方のパスなど、空間索引に関連する情報を簡単に検索できます。空間索引メタデータは、空間索引名を使用して取得できます。

空間索引メタデータ・ファイルには、次の情報が含まれます。

- 空間索引名

- 空間索引へのパス

- 索引付きレコードの数

- ローカル索引の数

- 索引付きレコードに含まれる追加フィールド

- SRID、次元、許容差、境界、およびジオメトリが測地であるかどうかの是非などのジオメトリ・レイヤー情報

- 各ローカル空間索引ファイルに関する次の情報: 索引付きデータへのパス、ローカル索引へのパス、および索引付きデータのMBR

SpatialIndexingクラスを使用して空間索引を作成する場合、次のメタデータ・プロパティを設定できます。

- indexName: 空間索引の名前。設定されていない場合、出力フォルダ名が使用されます。

- metadataDir: メタデータ・ファイルの格納先のディレクトリへのパス。

- デフォルトでは、ユーザー・ディレクトリへの相対パスであるoracle_spatial/index_metadataに格納されます。ユーザーがhdfsである場合は、/user/hdfs/oracle_spatial/index_metadataになります。

- overwriteMetadata: trueに設定すると、現在のmetadataDir内で同じindexNameを持つ空間索引に対して空間索引メタデータ・ファイルがすでに存在する場合、この空間索引メタデータが上書きされます。falseに設定し、現在のmetadataDir内で同じindexNameを持つ空間索引に対して空間索引メタデータ・ファイルがすでに存在する場合、エラーが発生します。

次の例では、メタデータ・ディレクトリおよび空間索引名を設定し、索引がすでに存在する場合は既存の任意のメタデータを上書きするよう指定します。

spatialIndexing.setMetadataDir("/user/hdfs/myIndexMetadataDir");
spatialIndexing.setIndexName("testIndex");
spatialIndexing.setOverwriteMetadata(true);

indexNameのみを指定するとともに、必要に応じて索引メタデータがあるindexMetadataDirを指定することにより、既存の空間索引を他のジョブに渡すことができます。索引名が提供されている場合、空間索引パスや入力形式を指定する必要はありません。

次のジョブ・ドライバは、indexNameをパラメータとして受け取ります。

- oracle.spatial.hadoop.vector.mapred.job.Categorization

- oracle.spatial.hadoop.vector.mapred.job.SpatialFilter

- oracle.spatial.hadoop.vector.mapred.job.Binning

- oracle.spatial.hadoop.vector.InputDataSetを受け取るドライバ(SpatialJoinやPartitioningなど)

索引名がindexMetadataDirパスで見つからない場合、空間索引が見つからなかったことを示すエラーがスローされます。

次の例は、ビニング・ジョブの入力データ・セットとして設定されている空間索引を示します。

Binning binning = new Binning();
binning.setIndexName("indexExample");
binning.setIndexMetadataDir("indexMetadataDir");

2.9.2.4 空間索引の入力形式

InputFormatは次のサポート対象の要件と一致している必要があります。

- FileInputFormatのサブクラスであること。

- getSplits()メソッドがFileSplitまたはCombineFileSplit分割タイプを返すこと。

- 古いHadoop APIの場合、RecordReaderのgetPos()メソッドが現在の位置を返し、空間索引のレコードをユーザー・ファイルの元のレコードにトラック・バックすること。現在の位置が返されない場合、空間索引では元のレコードが見つかりません。
ただし、空間索引は引き続き作成でき、元のレコードの読取りを必要としない操作に使用できます。たとえば、他のフィールドを追加フィールドとして追加すると、元のレコード全体を読み取る必要はありません。

注意:

それぞれの分割がgetSplits()メソッドから返されたら、その分割に対して空間索引が作成されます。空間索引をフィルタ処理に使用する(空間のフィルタ処理)場合は、空間索引を作成したものと同じInputFormat実装を使用して、分割索引があるかどうか確認することをお薦めします。

getPos()メソッドはHadoopの新しいAPIから削除されていますが、org.apache.hadoop.mapreduce.lib.input.TextInputFormatおよびCombineTextInputFormatはサポートされており、引き続きレコードの開始オフセットの取得に使用できます。

新しいAPIのその他の入力形式もサポートされていますが、レコード開始オフセットは空間索引に含まれません。このため、元のレコードは検索できません。新しいAPI入力形式の要件は、古いAPIのものと同じです。ただし、新しいAPI FileInputFormat、FileSplit、およびCombineFileSplitに変換する必要があります。

2.9.2.5 GeoJSONおよびShapefile形式のサポート

Vector APIには、GeoJSONおよびShapefileファイル形式のためのInputFormat実装、およびRecordInfoProvider実装が提供されています。

次のInputFormat/RecordInfoProviderペアは、それぞれGeoJSONおよびShapeFilesの読取りと解釈に使用されます。

oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat / oracle.spatial.hadoop.vector.geojson.GeoJsonRecordInfoProvider

oracle.spatial.hadoop.vector.shapefile.mapred.ShapeFileInputFormat / oracle.spatial.hadoop.vector.shapefile.ShapeFileRecordInfoProvider

使用方法とプロパティについて詳しくは、Javadocを参照してください。

2.9.2.6 空間索引の削除

次を実行することにより、前に生成した空間索引を削除できます。

oracle.spatial.hadoop.vector.util.Tools removeSpatialIndex indexName=<INDEX_NAME> [indexMetadataDir=<PATH>] [removeIndexFiles=<true|false*>]

説明:

- indexName: 前に生成した索引の名前。

- indexMetadataDir (オプション): 索引メタデータ・ディレクトリへのパス。指定されていない場合、ユーザー・ディレクトリに対する相対パスとしてoracle_spatial/index_metadataが使用されます

- removeIndexFiles (オプション): 索引メタデータファイルに加えて生成された索引地図ファイルを削除する必要がある場合はtrueです。デフォルトでは、falseです。

2.9.3 MVSuggestの使用

MVSuggestは、ジオメトリがなく、テキスト・フィールドのあるレコードの推定の位置を取得するための空間の索引付けに使用できます。このテキスト・フィールドはレコードの位置の特定に使用されます。MVSuggestから返されたジオメトリが、空間索引内のレコードの包括に使用されます。

すべてのレコードについて検索テキストを含むフィールドを把握する必要があるため、RecordInfoProvider実装では、LocalizableRecordInfoProviderも実装する必要があります。または、検索テキストを含むフィールドの名前で、構成パラメータoracle.spatial.recordInfo.locationFieldを設定できます。詳細は、LocalizableRecordInfoProviderのJavadocを参照してください。

MVSuggestのスタンドアロン・バージョンがVector APIに用意されているため、入力パラメータとしてMVSConfigを受け入れる一部のジョブに使用できます。

次のジョブ・ドライバはMVSuggestで使用でき、そのすべてにMVSConfigのインスタンスを受け入れるsetMVSConfig()メソッドがあります。

- oracle.spatial.hadoop.vector.mapred.job.SpatialIndexing: ジオメトリを含まないレコードの推定の空間位置を取得するためのMVSuggestオプションがあります。

- oracle.spatial.hadoop.vector.mapred.job.Categorization: MVSuggestを使用して、USAの州のレイヤーのカリフォルニアの機能など、レイヤー内の特定の機能にレコードを割り当てます。

- oracle.spatial.hadoop.vector.mapred.job.SuggestService: 入力レコードごとの検索テキストとその一致を含むファイルを生成する単一のジョブです。

MVSuggestの構成は、MVSConfigまたはLocalMVSConfigクラスを使用してジョブに渡されます。基本のMVSuggestプロパティは次のとおりです。

- serviceLocation: MVSuggestを使用するために必要な最小のプロパティです。これにはパスまたはURLが含まれており、MVSuggestディレクトリのある場所、URLの場合はMVSuggestサービスがデプロイされている場所を示します。

- serviceInterfaceType: 使用するMVSuggest実装のタイプ。スタンドアロン・バージョンの場合はLOCAL (デフォルト)、Webサービス・バージョンの場合はWEBです。

- matchLayers: 検索の実行に使用するレイヤー名の配列。

MVSuggestのスタンドアロン・バージョンを使用する場合は、MVSuggestディレクトリまたはリポジトリをserviceLocationとして指定する必要があります。MVSuggestディレクトリは次のような構造である必要があります。

mvsuggest_config.json
repository folder
one or more layer template files in .json format
optionally, a _config_ directory
optionally, a _geonames_ directory

examplesフォルダには多数のレイヤー・テンプレート・ファイルがあり、_config_ディレクトリには各テンプレートの構成があります。

リポジトリ・フォルダ(テンプレートを含むもの)をMVSuggestディレクトリ全体ではなく、mvsLocationとして設定できます。この場合、次の例に示すように、クラスLocalMVSConfigをMVSConfigのかわりに使用して、repositoryLocationプロパティをtrueに設定できます。

LocalMVSConfig lmvsConf = new LocalMVSConfig();
lmvsConf.setServiceLocation(“file:///home/user/mvs_dir/repository/”);
lmvsConf.setRepositoryLocation(true);
lmvsConf.setPersistentServiceLocation(“/user/hdfs/hdfs_mvs_dir”);
spatialIndexingJob.setMvsConfig(lmvsConf);

前の例では、リポジトリ・フォルダをMVSサービスの場所として設定しています。setRepositoryLocationはtrueに設定され、サービスの場所がMVSuggestディレクトリ全体のかわりにリポジトリになることを示します。ジョブを実行すると、指定のリポジトリの場所を使用してMVSuggestディレクトリ全体が作成されます。リポジトリはジョブの完了時に索引付けられ、一時フォルダに置かれます。最初に索引付けしてあったMVSuggestディレクトリは維持されるため、後で使用できます。前の例では、生成されたMVSuggestディレクトリをHDFSパス/user/hdfs/hdfs_mvs_dirに保存します。MVSuggestディレクトリがすでに存在する場合はMVSDirectoryを使用します。

2.9.4 空間のフィルタ処理

空間索引は生成後、データの空間フィルタ処理に使用できます。データの読取り中、マッパーに達するまではフィルタ処理が実行されます。次のサンプル・コードは、SpatialFilterInputFormatをデータの空間フィルタ処理に使用する方法を示しています。

//set input path and format

FileInputFormat.setInputPaths(conf, new Path("/user/data/"));
conf.setInputFormat(SpatialFilterInputFormat.class);

//set internal input format

SpatialFilterInputFormat.setInternalInputFormatClass(conf, TextInputFormat.class);
if( spatialIndexPath != null )
{

//set the path to the spatial index and put it in the distributed cache

boolean useDistributedCache = true;
SpatialFilterInputFormat.setSpatialIndexPath(conf, spatialIndexPath, useDistributedCache);
}
else
{
//as no spatial index is used a RecordInfoProvider is needed

SpatialFilterInputFormat.setRecordInfoProviderClass(conf, TwitterLogRecordInfoProvider.class);
}

//set spatial operation used to filter the records

SpatialOperationConfig spatialOpConf = new SpatialOperationConfig();
spatialOpConf.setOperation(SpatialOperation.IsInside);
spatialOpConf.setJsonQueryWindow("{\"type\":\"Polygon\", \"coordinates\":[[-106.64595, 25.83997, -106.64595, 36.50061, -93.51001, 36.50061, -93.51001, 25.83997 , -106.64595, 25.83997]]}");
spatialOpConf.setSrid(8307);
spatialOpConf.setTolerance(0.5);
spatialOpConf.setGeodetic(true);

SpatialFilterInputFormatはジョブのInputFormatとして設定する必要があります。実際にデータを読み取るInputFormatは、内部InputFormatとして設定する必要があります。この例では、内部InputFormatはTextInputFormatです。

空間索引が指定されている場合、それがフィルタ処理に使用されます。それ以外の場合は、RecordInfoProviderを指定してレコードのジオメトリを取得する必要があり、フィルタ処理がレコードごとに実行されます。

最終ステップとして、空間フィルタ処理を実行する空間操作と問合せウィンドウが設定されます。空間索引が作成されている場合、または少なくとも実装で分割の生成に同じ基準が使用されている場合は、使用されている同じ内部InputFormat実装を使用することをお薦めします。詳細は、「空間索引の入力形式」を参照してください。

単一の空間フィルタ処理のみ(つまり、問合せウィンドウとやり取りするレコードの取得のみ)を実行する必要がある場合、ビルトインのジョブ・ドライバoracle.spatial.hadoop.vector.mapred.job.SpatialFilterをかわりに使用できます。このジョブ・ドライバは索引付き入力と索引のない入力、およびSpatialOperationConfigを受け入れてフィルタ処理を実行します。

- レコードのフィルタ処理

- 入力形式の使用のフィルタ処理

2.9.4.1 レコードのフィルタ処理

次の手順は、SpatialFilterInputFormatおよび空間索引を使用してレコードをフィルタ処理するときに実行します。

1. SpatialFilterInputFormat getRecordReader()メソッドは、マッパーが現在の分割にRecordReaderを要求すると呼び出されます。

2. 現在の分割の空間索引が取得されます。

3. 空間索引を使用して、そこに含まれるレコードに空間問合せが実行されます。
その結果、空間フィルタと一致するレコードを含む分割の範囲が判別されます。たとえば、分割がファイル位置1000から2000になる場合、空間フィルタの実行時に空間条件を満たすレコードが1100-1200、1500-1600、および1800-1950の範囲であることが特定されます。そのため、この段階の空間フィルタ処理の実行結果は、さらに小さい分割を含む元のフィルタのサブセットになります。

4. 内部InputFormat RecordReaderは、結果の分割サブセットを細分した分割すべてに要求されます。

5. RecordReaderが呼出し元のマッパーに返されます。返されるRecordReaderは、内部InputFormatから返された1つ以上のRecordReadersのある実際のラッパーRecordReaderです。

6. マッパーがRecordReaderを呼び出すたびに、レコードを読み取る次のメソッドへの呼び出しが内部RecordReaderに委任されます。

次の空間フィルタ処理の相互作用の図にこれらの手順を示します。

2.9.4.2 入力形式の使用のフィルタ処理

前に生成した空間索引は、入力形式実装oracle.spatial.hadoop.vector.mapred.input.SpatialIndexInputFormat (またはmapredの代わりにmapreduceパッケージと同等の新しいHadoop API)を使用して読み取ることができます。SpatialIndexInputFormatは、入力パスを受け入れ、ジョブの入力家として設定される点において、他の任意のFileInputFormatサブクラスと同じように使用されます。返されるキーおよび値は、空間索引に格納されているレコードのID (Text)およびレコード情報(RecordInfo)です。

また、空間操作構成を入力形式に指定して空間フィルタ操作を実行することにより、一部の空間的相互作用と一致するレコードのみがマッパーに返されるようにすることもできます。次の例は、特定の領域内にあるすべてのレコードを取得するための空間索引を読み取るジョブを構成する方法を示します。

JobConf conf = new JobConf();
conf.setMapperClass(MyMapper.class);
conf.setInputFormat(SpatialIndexInputFormat.class);
SpatialOperationConfig spatialOpConf = new SpatialOperationConfig();
spatialOpConf.setOperation(SpatialOperation.IsInside);
spatialOpConf.setQueryWindow(JGeometry.createLinearPolygon(new double[]{47.70, -124.28, 47.70,  -95.12, 35.45, -95.12, 35.45, -124.28, 47.70, -124.28}, 2, 8307));
SpatialIndexInputFormat.setFilterSpatialOperationConfig(spatialOpConf, conf);

前の例のマッパーでは、次の例に示すように、RecordInfoの追加フィールドを使用することにより、空間以外のフィルタを追加できます。

public class MyMapper extends MapReduceBase implements Mapper<Text, RecordInfo, Text, RecordInfo>{
@Override
public void map(Text key, RecordInfo value, OutputCollector<Text, RecordInfo> output, Reporter reporter)
throws IOException {
if( Integer.valueOf(value.getField("followers_count")) > 0){
output.collect(key, value);
}
}
}

2.9.5 データの階層分類

Vector Analysis APIでは、データを階層エンティティに分類する方法があります。たとえば、大陸部、国、および州などの行政区分のレベルが定義されている一連の特定のカタログの場合、ユーザー・データのレコードを階層データ・セットの各レベルに結合できます。次の例では、大陸部、国および州ごとのユーザー・レコードの数が含まれる各階層レベルの集計カウントを生成します。

Categorization catJob = new Categorization();
//set a spatial index as the input

catJob.setIndexName("indexExample");

//set the job's output

catJob.setOutput("hierarchy_count");

//set HierarchyInfo implementation which describes the world administrative boundaries hierarchy

catJob.setHierarchyInfoClass( WorldDynaAdminHierarchyInfo.class );

//specify the paths of the hierarchy data

Path[] hierarchyDataPaths = {
new Path("file:///home/user/catalogs/world_continents.json"),
new Path("file:///home/user/catalogs/world_countries.json"),
new Path("file:///home/user/catalogs/world_states_provinces.json")};
catJob.setHierarchyDataPaths(hierarchyDataPaths);

//set the path where the index for the previous hierarchy data will be generated

catJob.setHierarchyIndexPath(new Path("/user/hierarchy_data_index/"));

//setup the spatial operation which will be used to join records from the two datasets (spatial index and hierarchy data).
SpatialOperationConfig spatialOpConf = new SpatialOperationConfig();
spatialOpConf.setOperation(SpatialOperation.IsInside);
spatialOpConf.setSrid(8307);
spatialOpConf.setTolerance(0.5);
spatialOpConf.setGeodetic(true);
catJob.setSpatialOperationConfig(spatialOpConf);

//add the previous setup to the job configuration

catJob.configure(conf);

//run the job
RunningJob rj = JobClient.runJob(conf);

前の例では、Categorizationジョブ・ドライバを使用します。構成は次のカテゴリに分けられます。

- 入力データ: 前に生成した(ジョブ入力として受け取った)空間索引。

- 出力データ: 階層レベルごとのサマリー数を含むフォルダ。

- 階層データ構成: これには次のものが含まれます。

- HierarchyInfoクラス: 現在の階層データを記述するHierarchyInfoクラスの実装です。ここでは階層レベルの数、レベル名、および各レベルに含まれるデータを示します。

- 階層データ・パス: 各階層カタログへのパスです。これらのカタログはHierarchyInfoクラスによって読み取られます。

- 階層索引パス: 階層データ索引が格納されるパスです。階層データは、階層レベル間の親子関係を判別するために事前処理する必要があります。この情報は1回処理され、階層索引に保存されるため、後で現在のジョブまたは他のジョブに使用できます。

- 空間操作の構成: ユーザー・データと階層データの間で、両方のデータセットを結合するために実行する必要のある空間操作です。ここで設定するパラメータは、空間操作タイプ(IsInside)、SRID (8307)、許容差(0.5メートル)、およびジオメトリが測地(true)であるかどうかです。

Categorization.configure()メソッドは、内部でマッパーとリデューサをそれぞれSpatialHierarchicalCountMapperとSpatialHierarchicalCountReducerに設定します。SpatialHierarchicalCountMapperの出力キーは、hierarchy_level + hierarchy_entry_idという形式の階層エントリ識別子です。マッパー出力値は出力キーごとに1件です。リデューサは各キーの件数をすべて合計します。

注意:

階層データ全体がメモリーに読み込まれるため、すべてのカタログの合計サイズはユーザー・データよりも大幅に小さくなると予想されます。階層データ・サイズは数GBを超えないようにします。

たとえば、階層エントリに応じたユーザー・レコードのリストなど、件数ではなく別の出力タイプが必要な場合があります。その場合は、SpatialHierarchicalJoinMapperを使用できます。SpatialHierarchicalJoinMapper出力値はRecordInfoインスタンスであり、ユーザー定義リデューサでまとめられ、別の出力を作成します。次のユーザー定義リデューサでは、MultipleOutputsクラスを使用して各階層レベルにMapFileを生成します。各MapFileには、キーとしての階層エントリID、および値として各階層エントリの一致レコードを含むArrayWritableインスタンスがあります。階層エントリごとのレコード・リストを返すユーザー定義リデューサを次に示します。

public class HierarchyJoinReducer extends MapReduceBase implements Reducer<Text, RecordInfo, Text, ArrayWritable> {

private MultipleOutputs mos = null;
private Text outKey = new Text();
private ArrayWritable outValue = new ArrayWritable( RecordInfo.class );

@Override
public void configure(JobConf conf)
{
super.configure(conf);

//use MultipleOutputs to generate different outputs for each hierarchy level

mos = new MultipleOutputs(conf);
}
@Override
public void reduce(Text key, Iterator<RecordInfo> values,
OutputCollector<Text, RecordInfoArrayWritable> output, Reporter reporter)
throws IOException
{

//Get the hierarchy level name and the hierarchy entry id from the key

String[] keyComponents = HierarchyHelper.getMapRedOutputKeyComponents(key.toString());
String hierarchyLevelName = keyComponents[0];
String entryId = keyComponents[1];
List<Writable> records = new LinkedList<Writable>();

//load the values to memory to fill output ArrayWritable

while(values.hasNext())
{
RecordInfo recordInfo = new RecordInfo( values.next() );
records.add( recordInfo );
}
if(!records.isEmpty())
{

//set the hierarchy entry id as key

outKey.set(entryId);

//list of records matching the hierarchy entry id

outValue.set( records.toArray(new Writable[]{} ) );

//get the named output for the given hierarchy level

hierarchyLevelName = FileUtils.toValidMONamedOutput(hierarchyLevelName);
OutputCollector<Text, ArrayWritable> mout = mos.getCollector(hierarchyLevelName, reporter);

//Emit key and value

mout.collect(outKey, outValue);
}
}

@Override
public void close() throws IOException
{
mos.close();
}
}

次の構成では、1つのジョブで同じリデューサが使用され、階層レベルに応じたレコードのリストが生成されます。

JobConf conf = new JobConf(getConf());

//input path

FileInputFormat.setInputPaths(conf, new Path("/user/data_spatial_index/") );

//output path

FileOutputFormat.setOutputPath(conf, new Path("/user/records_per_hier_level/") );

//input format used to read the spatial index

conf.setInputFormat( SequenceFileInputFormat.class);

//output format: the real output format will be configured for each multiple output later

conf.setOutputFormat(NullOutputFormat.class);

//mapper

conf.setMapperClass( SpatialHierarchicalJoinMapper.class );
conf.setMapOutputKeyClass(Text.class);
conf.setMapOutputValueClass(RecordInfo.class);

//reducer

conf.setReducerClass( HierarchyJoinReducer.class );
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(ArrayWritable.class);

////////////////////////////////////////////////////////////////////

//hierarchy data setup

//set HierarchyInfo class implementation

conf.setClass(ConfigParams.HIERARCHY_INFO_CLASS, WorldAdminHierarchyInfo.class, HierarchyInfo.class);

//paths to hierarchical catalogs

Path[] hierarchyDataPaths = {
new Path("file:///home/user/catalogs/world_continents.json"),
new Path("file:///home/user/catalogs/world_countries.json"),
new Path("file:///home/user/catalogs/world_states_provinces.json")};

//path to hierarchy index

Path hierarchyDataIndexPath = new Path("/user/hierarchy_data_index/");

//instantiate the HierarchyInfo class to index the data if needed.

HierarchyInfo hierarchyInfo = new WorldAdminHierarchyInfo();
hierarchyInfo.initialize(conf);

//Create the hierarchy index if needed. If it already exists, it will only load the hierarchy index to the distributed cache

HierarchyHelper.setupHierarchyDataIndex(hierarchyDataPaths, hierarchyDataIndexPath, hierarchyInfo, conf);

///////////////////////////////////////////////////////////////////

//setup the multiple named outputs:

int levels = hierarchyInfo.getNumberOfLevels();
for(int i=1; i<=levels; i++)
{
String levelName = hierarchyInfo.getLevelName(i);

//the hierarchy level name is used as the named output

String namedOutput = FileUtils.toValidMONamedOutput(levelName);
MultipleOutputs.addNamedOutput(conf, namedOutput, MapFileOutputFormat.class, Text.class, ArrayWritable.class);
}

//finally, setup the spatial operation

SpatialOperationConfig spatialOpConf = new SpatialOperationConfig();
spatialOpConf.setOperation(SpatialOperation.IsInside);
spatialOpConf.setSrid(8307);
spatialOpConf.setTolerance(0.5);
spatialOpConf.setGeodetic(true);
spatialOpConf.store(conf);

//run job

JobClient.runJob(conf);

出力値がRecordInfoインスタンスの配列ではなく、レコードIDの配列であるとすると、前に定義したリデューサで一部を変更するだけで済みます。

前の例でoutValueが宣言されている行は、次のように変更されます。

private ArrayWritable outValue = new ArrayWritable(Text.class);

前の例で入力値を取得するloopは、次のように変更されます。このため、レコード全体ではなくレコードIDを取得します。

while(values.hasNext())
{
records.add( new Text(values.next().getId()) );
}

レコードIDのみが必要なとき、マッパーがRecordInfoインスタンス全体を発行します。このため、これを改善するには、マッパーの出力値を変更します。マッパー出力値はAbstractSpatialJoinMapperを拡張して変更できます。次の例では、レコードが階層エントリの一部と一致するたびに、マッパーはRecorInfoインスタンス全体ではなく、レコードIDのみを発行します。

public class IdSpatialHierarchicalMapper extends AbstractSpatialHierarchicalMapper< Text >
{
Text outValue = new Text();

@Override
protected Text getOutValue(RecordInfo matchingRecordInfo)
{

//the out value is the record's id

outValue.set(matchingRecordInfo.getId());
return outValue;
}
}

- 階層レベル範囲の変更

- 検索階層の制御

- データを分類するためのMVSuggestの使用

2.9.5.1 階層レベル範囲の変更

デフォルトでは、階層検索を実行すると、HierarchyInfo実装に定義されている階層レベルがすべてロードされます。ロードされる階層レベルの範囲は、レベル1 (親レベル)からHierarchyInfo.getNumberOfLevels()メソッドが返すレベルまでに及びます。次の例では、レベル2と3のみをロードするジョブを設定する方法を示します。

conf.setInt( ConfigParams.HIERARCHY_LOAD_MIN_LEVEL, 2);
conf.setInt( ConfigParams.HIERARCHY_LOAD_MAX_LEVEL, 3);

注意:

これらのパラメータは、階層レベルのサブセットのみが必要であり、HierarchyInfoの実装を変更しない場合に役立ちます。

2.9.5.2 検索階層の制御

検索は常に、(レベル番号が大きい)最下層の階層レベルで実行されます。ユーザー・レコードがこのレベルの階層エントリの一部と一致する場合、その一致は上位レベルの親エントリに伝播されます。たとえば、ユーザー・レコードがロサンゼルスと一致する場合、カリフォルニア、USA、および北米にも一致します。最下位レベルのユーザー・レコードと一致するものがない場合、上位レベルへの検索は続行されません。

この動作は構成パラメータConfigParams.HIERARCHY_SEARCH_MULTIPLE_LEVELSをtrueに設定して変更できます。このため、最下位の下層レベルの検索で、一致しないユーザー・レコードが見つかった場合、最上位レベルに達するまで、あるいは結合するユーザー・レコードがなくなるまで、上位レベルへの検索が続行されます。この動作は、親レベルのジオメトリがその子エントリのジオメトリを完全に囲んでいない場合に使用できます

2.9.5.3 データを分類するためのMVSuggestの使用

データを分類するには、空間索引ではなくMVSuggestを使用できます。その場合、LocalizableRecordInfoProviderの実装を特定し、MVSuggestを送信して検索を実行する必要があります。LocalizableRecordInfoProviderに関する情報を参照してください。

次の例では、プログラム・オプションが空間からMVSに変更されています。入力は空間索引ではなくユーザー・データへのパスです。ユーザー・レコードの読取りに使用するInputFormatとLocalizableRecordInfoProviderの実装が指定されます。MVSuggestサービス構成が設定されます。この場合、空間操作の構成は必要ありません。

Categorization<LongWritable, Text> hierCount = new Categorization<LongWritable, Text>();

// the input path is the user's data

hierCount.setInput("/user/data/");

// set the job's output

hierCount.setOutput("/user/mvs_hierarchy_count");

// set HierarchyInfo implementation which describes the world
// administrative boundaries hierarchy

hierCount.setHierarchyInfoClass(WorldDynaAdminHierarchyInfo.class);

// specify the paths of the hierarchy data

Path[] hierarchyDataPaths = { new Path("file:///home/user/catalogs/world_continents.json"),
new Path("file:///home/user/catalogs/world_countries.json"),
new Path("file:///home/user/catalogs/world_states_provinces.json") };
hierCount.setHierarchyDataPaths(hierarchyDataPaths);

// set the path where the index for the previous hierarchy data will be
// generated

hierCount.setHierarchyIndexPath(new Path("/user/hierarchy_data_index/"));

// No spatial operation configuration is needed, Instead, specify the
// InputFormat used to read the user's data and the
// LocalizableRecordInfoProvider class.

hierCount.setInputFormatClass(TextInputFormat.class);
hierCount.setRecordInfoProviderClass(MyLocalizableRecordInfoProvider.class);

// finally, set the MVSuggest configuration

LocalMVSConfig lmvsConf = new LocalMVSConfig();
lmvsConf.setServiceLocation("file:///home/user/mvs_dir/oraclemaps_pub");
lmvsConf.setRepositoryLocation(true);
hierCount.setMvsConfig(lmvsConf);

// add the previous setup to the job configuration
hierCount.configure(conf);

// run the job

JobClient.runJob(conf);

注意:

MVSuggestを使用する場合、階層データ・ファイルはMVSuggestで使用するレイヤー・テンプレート・ファイルと同じである必要があります。HierarchyInfo.getLevelNames()メソッドによって返される階層レベル名が、MVSuggestで一致するレイヤーとして使用されます。

2.9.6 バッファの生成

APIには、各レコードのジオメトリを囲んでバッファを生成するマッパーがあります。次のサンプル・コードでは、BufferMapperクラスを使用して各レコード・ジオメトリのバッファ生成ジョブを実行する方法を示します。

//configure input
conf.setInputFormat(FileSplitInputFormat.class);
FileSplitInputFormat.setInputPaths(conf, "/user/waterlines/");
FileSplitInputFormat.setRecordInfoProviderClass(conf, GeoJsonRecordInfoProvider.class);

//configure output
conf.setOutputFormat(SequenceFileOutputFormat.class);
SequenceFileOutputFormat.setOutputPath(conf, new Path("/user/data_buffer/"));

//set the BufferMapper as the job mapper
conf.setMapperClass(BufferMapper.class);
conf.setMapOutputKeyClass(Text.class);
conf.setMapOutputValueClass(RecordInfo.class);
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(RecordInfo.class);

//set the width of the buffers to be generated
conf.setDouble(ConfigParams.BUFFER_WIDTH, 0.2);

//run the job
JobClient.runJob(conf);

BufferMapperは、ジオメトリを含むそれぞれの入力レコードのバッファを生成します。出力キーおよび値は、レコードIDおよび生成したバッファを含むRecordInfoインスタンスです。結果ファイルはマッパー出力キーおよび値を含むHadoop MapFileです。必要であれば、マッパーの出力キーと値、および別のタイプの出力キーと値をとるリデューサを実装すると、出力形式を変更できます。

BufferMapperは次のパラメータを受け入れます。

パラメータ

ConfigParam定数

型

説明

oracle.spatial.buffer.width

BUFFER_WIDTH

double

バッファの幅

oracle.spatial.buffer.sma

BUFFER_SMA

double

入力の座標系で使用される基準の長半径

oracle.spatial.buffer.iFlat

BUFFER_IFLAT

double

フラット化データ

oracle.spatial.buffer.arcT

BUFFER_ARCT

double

測地高密度化に使用する円弧許容差

2.9.7 空間のビニング

ベクトルAPIには、空間データ・セットに空間ビニングを実行するクラスoracle.spatial.hadoop.vector.mapred.job.Binningがあります。Binningクラスは(空間索引付けした、または索引付けしない)入力データ・セットをとるMapReduceジョブ・ドライバであり、各レコードをビンに割り当て、(1つ以上のレコードおよび任意の集計値を含む)すべてのビンを含めたファイルを生成します。

ビニング・ジョブは次のように構成できます。

1. ビニングするデータ・セットと、それが読み込まれ、解釈される方法(InputFormatおよびRecordInfoProvider)、を指定するか、既存の空間索引の名前を指定します。

2. 出力パスを設定します。

3. ビニングする矩形領域であるグリッドMBRを設定します。

4. ビンRECTANGLEまたはHEXAGONの形状を設定します。

5. ビン(セル)のサイズを指定します。矩形については、幅と高さをしてします。六角形のセルについては、六角形の幅を指定します。それぞれの六角形は、常にその頂点のいずれかが底として描かれます。

6. ビンごとに集計する数値フィールド名のリストを渡すこともできます。

結果の出力はテキスト・ファイルであり、そこで各レコードはJSON形式のビン(セル)であり、次の情報が含まれています。

- id: ビンのID

- geom: ビンのジオメトリ。常に六角形または八角形のポリゴン

- count: ビンに含まれるポイント数

- aggregated fields: ゼロ以上の集計フィールド

次の例では、ビニング・ジョブを構成し、実行します。

//create job driver
Binning<LongWritable, Text> binJob = new Binning<LongWritable, Text>();
//setup input
binJob.setInput("/user/hdfs/input/part*");
binJob.setInputFormatClass(GeoJsonInputFormat.class);
binJob.setRecordInfoProviderClass(GeoJsonRecordInfoProvider.class);
//set binning output
binJob.setOutput("/user/hdfs/output/binning");
//create a binning configuration to produce rectangular cells
BinningConfig binConf = new BinningConfig();
binConf.setShape(BinShape.RECTANGLE);
//set the bin size
binConf.setCellHeight(0.2);
binConf.setCellWidth(0.2);
//specify the area to be binned
binConf.setGridMbr(new double[]{-50,10,50,40});
binJob.setBinConf(binConf);
//save configuration
binJob.configure(conf);
//run job
JobClient.runJob(conf);

2.9.8 空間のクラスタ化

ジョブ・ドライバ・クラスoracle.spatial.hadoop.mapred.KMeansClusteringはデータ・セットの空間クラスタの検索に使用できます。このクラスでは、k-meansアルゴリズムの分散バージョンを使用します。

必須パラメータ:

- InputFormatクラスが入力データ・セットの読取りに使用され、RecordInfoProviderがレコードからの空間情報の抽出に使用される、入力データ・セットへのパス。

- 結果が格納されるパス。

- 検出されるクラスタの数。

オプションのパラメータ:

- アルゴリズムが終了するまでの最大反復数。

- クラスタがいつ収束するかを判断するための基準関数。これはoracle.spatial.hadoop.vector.cluster.kmeans.CriterionFunctionの実装として提供されます。Vector APIには、SquaredErrorCriterionFunctionおよびEuclideanDistanceCriterionFunctionという基準関数の実装が含まれています。

- 各クラスタのジオメトリを生成するためのoracle.spatial.hadoop.vector.cluster.kmeans.ClusterShapeGeneratorの実装。デフォルトの実装はConvexHullClusterShapeGeneratorであり、各クラスタの凸包を生成します。クラスタ・ジオメトリが必要でない場合は、DummyClusterShapeGeneratorクラスを使用できます。

- 連続するx、yの縦座標としての初期Kクラスタ・ポイント。例: x1,y1,x2,y2,…xk,yk

この結果はclusters.jsonというファイルになり、クラスタを呼び出した機能の配列が含まれます。各クラスタには、次の情報が含まれます。

- id: クラスタID

- memberCount: クラスタ内の要素の数

- geom: クラスタ・ジオメトリ

次の例では、KMeansClusteringアルゴリズムを実行して5クラスタを検出します。デフォルトでSquredErrorCriterionFunctionおよびConvexHullClusterShapeGeneratorが使用されるため、これらのクラスを明示的に設定する必要はありません。また、runIterations()がアルゴリズム実行のために内部的に呼び出されると、反復ごとにMapReduceが1回起動されます。この例では、数値20が許容されている反復の最大数としてrunIterations()に渡されます。

//create the cluster job driver
KMeansClustering<LongWritable, Text> clusterJob = new KMeansClustering<LongWritable, Text>();
//set input properties:
//input dataset path
clusterJob.setInput("/user/hdfs/input/part*");
//InputFormat class
clusterJob.setInputFormatClass(GeoJsonInputFormat.class);
//RecordInfoProvider implementation
clusterJob.setRecordInfoProviderClass(GeoJsonRecordInfoProvider.class);
//specify where the results will be saved
clusterJob.setOutput("/user/hdfs/output/clusters");
//5 cluster will be found
clusterJob.setK(5);
//run the algorithm
success = clusterJob.runIterations(20, conf);

2.9.9 空間の結合

空間の結合機能を使用すると、2つの異なる大きいデータ・セットのレコード間の空間的相互作用を検出できます。

ドライバ・クラスoracle.spatial.hadoop.vector.mapred.job.SpatialJoinを使用して、2つのデータ・セット間の空間結合を実行するためのジョブを実行または構成できます。このジョブ・ドライバは、次の入力を受け入れます。

- 入力データ・セット: 2つの入力データ・セットが予想されます。各入力データ・セットは、データ・セットからのレコードを解釈するために使用されるパス、空間索引、入力形式およびレコード情報プロバイダなどのデータ・セットを見つける場所および読み取る方法に関する情報が格納されたクラスoracle.spatial.hadoop.vector.InputDataSetを使用して表現されます。これはまた、データ・セットの空間構成も受け入れます。

- 空間操作構成: 空間操作構成は、2つのレコードが相互に関連しているかどうかを確認するために使用される空間的相互作用を定義します。これはまた、網羅する領域(MBR)も定義します。つまり、MBR内のレコードまたはMBRと交差するレコードのみが検索時に考慮されます。

- パーティション化結果ファイル・パス: 両方のデータ・セットについて前に生成されたパーティション化結果を指し示すオプションのパラメータです。操作を分散するには、データをパーティション化する必要があります。このパラメータが指定されていない場合、パーティション化プロセスは入力データ・セット全体に対して実行されます。(詳細は、「空間のパーティション化」を参照してください。)

- 出力パス: 結果ファイルが書き込まれるパス。

空間の結合結果はテキスト・ファイルであり、その各行は、空間操作構成に定義されている空間的相互作用に応じたレコードのペアです。

次の表は、空間の結合に対して現在サポートされている空間的相互作用を示しています。

空間操作

追加パラメータ

型

AnyInteract

なし

(該当なし)

IsInside

なし

(該当なし)

WithinDistance

oracle.spatial.hadoop.vector.util.SpatialOperationConfig.PARAM_WD_DISTANCE

double

WithinDistance操作の場合、次の例に示すように、SpatialOperationConfigに距離パラメータを指定できます。

spatialOpConf.setOperation(SpatialOperation.WithinDistance);
spatialOpConf.addParam(SpatialOperationConfig.PARAM_WD_DISTANCE, 5.0);

次の例では、2つの入力データ・セットに対して空間の結合ジョブを実行します。最初のデータ・セットである郵便番号の境界は、空間索引の名前を提供して指定されています。2番目のデータ・セットであるツイートの場合、ファイルへのパス、入力形式およびレコード情報プロバイダが指定されています。検出対象の空間的相互作用はIsInsideであるため、郵便番号の境界(ポリゴン)内にあるツイート(ポイント)のみが、それが含まれる郵便番号の境界とともに結果に表示されます。

SpatialJoin spatialJoin = new SpatialJoin();
List<InputDataSet> inputDataSets = new ArrayList<InputDataSet>(2);

// set the spatial index of the 3-digit postal boundaries of the USA as the first input data set
InputDataSet pbInputDataSet = new InputDataSet();
pbInputDataSet.setIndexName("usa_pcb3_index");

//no input format or record info provider are required here as a spatial index is provided
inputDataSets.add(pbInputDataSet);

// set the tweets data set in GeoJSON format as the second data set
InputDataSet tweetsDataSet = new InputDataSet();
tweetsDataSet.setPaths(new Path[]{new Path("/user/example/tweets.json")});
tweetsDataSet.setInputFormatClass(GeoJsonInputFormat.class);
tweetsDataSet.setRecordInfoProviderClass(GeoJsonRecordInfoProvider.class);
inputDataSets.add(tweetsDataSet);

//set input data sets
spatialJoin.setInputDataSets(inputDataSets);

//spatial operation configuration
SpatialOperationConfig spatialOpConf = new SpatialOperationConfig();
spatialOpConf.setOperation(SpatialOperation.IsInside);
spatialOpConf.setBoundaries(new double[]{47.70, -124.28, 35.45, -95.12});
spatialOpConf.setSrid(8307);
spatialOpConf.setTolerance(0.5);
spatialOpConf.setGeodetic(true);
spatialJoin.setSpatialOperationConfig(spatialOpConf);

//set output path
spatialJoin.setOutput("/user/example/spatialjoin");

// prepare job
JobConf jobConf = new JobConf(getConf());

//preprocess will partition both data sets as no partitioning result file was specified
spatialJoin.preprocess(jobConf);
spatialJoin.configure(jobConf);
JobClient.runJob(jobConf);

2.9.10 空間のパーティション化

パーティション化機能を使用して、1つ以上のデータ・セットを空間的にパーティション化します。

空間のパーティション化は、複数の矩形への空間の分割で構成されています。この場合、各矩形は、ほぼ同じ数のポイントが含まれるよう意図されます。最終的に、これらのパーティションを使用して、空間の結合などの他のジョブ内のリデューサ間の操作を分散できます。

空間のパーティション化プロセスは、次の入力パラメータを受け入れるoracle.spatial.hadoop.mapred.job.Partitioningドライバ・クラスを使用して実行または構成されます。

- 入力データ・セット: 1つ以上の入力データ・セットを指定できます。各入力データ・セットは、データ・セットからのレコードを解釈するために使用されるパス、空間索引、入力形式およびレコード情報プロバイダなどのデータ・セットを見つける場所および読み取る方法に関する情報が格納されたクラスoracle.spatial.hadoop.vector.InputDataSetを使用して表現されます。これはまた、データ・セットの空間構成も受け入れます。

- サンプリング比率: 1つ以上のデータ・セット全体の一部のみを使用してパーティション化を実行します。サンプリング比率は、入力データ・セットのサイズ全体に対するサンプルのサイズの比率です。指定されていない場合、入力データ・セットのサイズの10パーセント(0.1)が使用されます。

- 空間構成: SRIDなどの入力データ・セットの空間プロパティを定義します。少なくとも次元境界を指定する必要があります。

- 出力パス: 結果ファイルが書き込まれるパス。

生成されたパーティション化結果ファイルは、GeoJSON形式であり、生成された各パーティションに関する情報(パーティションのジオメトリおよび(サンプルから)含まれるポイントの数を含む)が格納されています。

次の例では、ツイート・データ・セットをパーティション化します。サンプリング比率は指定されていないため、デフォルトでは0.1が使用されています。

Partitioning partitioning = new Partitioning();
List<InputDataSet> inputDataSets = new ArrayList<InputDataSet>(1);

//define the input data set
InputDataSet dataSet = new InputDataSet();
dataSet.setPaths(new Path[]{new Path("/user/example/tweets.json")});
dataSet.setInputFormatClass(GeoJsonInputFormat.class);
dataSet.setRecordInfoProviderClass(GeoJsonRecordInfoProvider.class);
inputDataSets.add(dataSet);
partitioning.setInputDataSets(inputDataSets);

//spatial configuration
SpatialConfig spatialConf = new SpatialConfig();
spatialConf.setSrid(8307);
spatialConf.setBoundaries(new double[]{-180,-90,180,90});
partitioning.setSpatialConfig(spatialConf);

//set output
partitioning.setOutput("/user/example/tweets_partitions.json");

//run the partitioning process
partitioning.runFullPartitioningProcess(new JobConf());

2.9.11 RecordInfoProvider

HDFSからMapReduceジョブによって読み取られたレコードは、LongWritable、Text、ArrayWritableなどのJavaタイプ(通常)の書込み可能サブクラス、または一部のユーザー定義タイプを使用してキー/値ペアとしてメモリーに表示されます。たとえば、TextInputFormatを使用して読み取られたレコードは、メモリー内でLongWritable、Textキー/値ペアとして表示されます。

RecordInfoProviderはこのようなメモリー・レコード表現を解釈し、Vector Analysis APIで必要なデータを返すコンポーネントです。このため、APIは特定の形式やメモリー表現に関連付けられていません。

RecordInfoProviderインタフェースには、次のメソッドがあります。

- void setCurrentRecord(K key, V value)

- String getId()

- JGeometry getGeometry()

- boolean getExtraFields(Map<String, String> extraFields)

InputFormatごとに常にRecordInfoProviderインスタンスがあります。メソッドsetCurrentRecord()は、RecordReaderから取得した現在のキー/値ペアを渡して呼び出されます。次に、RecordInfoProviderによって現在のレコードID、ジオメトリ、および追加フィールドを取得します。これらのフィールドのいずれも必須フィールドではありません。ジオメトリのあるレコードのみが空間操作に関与します。IDは、カテゴリ化などの操作で、レコードの区別に使用されます。追加フィールドは、テキストとして表現され、元のレコードを読み取らない簡易アクセスに必要なレコード情報の格納、またはMVSuggestを使用する操作のために使用されます。

通常、RecordInfoProviderから返される情報は、RecordInfoインスタンスの移入に使用されます。RecordInfoはレコードの簡易バージョンとみなされ、RecordInfoProviderから返された情報、およびファイル内で元のレコードを特定する情報が含まれています。

- サンプルRecordInfoProvider実装

- LocalizableRecordInfoProvider

2.9.11.1 サンプルRecordInfoProvider実装

このサンプル実装はJsonRecordInfoProviderと呼ばれ、TextInputFormatを使用して読み取られるJSON形式のテキスト・レコードをとります。レコード・サンプルを次に示します。

{ "_id":"ABCD1234", "location":" 119.31669, -31.21615", "locationText":"Boston, Ma", "date":"03-18-2015", "time":"18:05", "device-type":"cellphone", "device-name":"iPhone"}

JsonRecordInfoProviderがインスタンス化されると、JSON ObjectMapperが作成されます。ObjectMapperは、後でsetCurrentRecord()が呼び出されたときのレコード値の解析に使用されます。レコード・キーは無視されます。レコードID、ジオメトリ、および1つの追加フィールドが_id、locationおよびlocationText JSONプロパティから取得されます。ジオメトリは緯度/経度ペアとして表現され、JGeometry.createPoint()メソッドによる点ジオメトリの作成に使用されます。追加フィールド(locationText)は、出力パラメータとして機能するextraFieldsマップに追加され、追加フィールドが追加されたことを示すtrueを返します。

public class JsonRecordInfoProvider implements RecordInfoProvider<LongWritable, Text> {
private Text value = null;
private ObjectMapper jsonMapper = null;
private JsonNode recordNode = null;

public JsonRecordInfoProvider(){

//json mapper used to parse all the records

jsonMapper = new ObjectMapper();

}

@Override
public void setCurrentRecord(LongWritable key, Text value) throws Exception {
try{

//parse the current value

recordNode = jsonMapper.readTree(value.toString());
}catch(Exception ex){
recordNode = null;
throw ex;
}
}

@Override
public String getId() {
String id = null;
if(recordNode != null ){
id = recordNode.get("_id").getTextValue();
}
return id;
}
@Override
public JGeometry getGeometry() {
JGeometry geom = null;
if(recordNode!= null){
//location is represented as a lat,lon pair
String location = recordNode.get("location").getTextValue();
String[] locTokens = location.split(",");
double lat = Double.parseDouble(locTokens[0]);
double lon = Double.parseDouble(locTokens[1]);
geom =  JGeometry.createPoint( new double[]{lon, lat},  2, 8307);
}
return geom;
}

@Override
public boolean getExtraFields(Map<String, String> extraFields) {
boolean extraFieldsExist = false;
if(recordNode != null) {
extraFields.put("locationText", recordNode.get("locationText").getTextValue() );
extraFieldsExist = true;
}
return extraFieldsExist;
}
}

2.9.11.2 LocalizableRecordInfoProvider

このインタフェースはRecordInfoProviderを拡張し、MVSuggestが使用されているときに検索テキストとして使用できる追加フィールドの特定に使用されます。

このインタフェースで追加されるメソッドはgetLocationServiceField()のみであり、MVSuggestに送信される追加フィールドの名前を返します。

また、「サンプルRecordInfoProvider実装」に基づく実装を次に示します。この例で返される名前はlocationTextであり、親クラスに含まれている追加フィールドの名前です。

public class LocalizableJsonRecordInfoProvider extends JsonRecordInfoProvider implements LocalizableRecordInfoProvider<LongWritable, Text> {

@Override
public String getLocationServiceField() {
return  "locationText";
}
}

LocalizableRecordInfoProviderのかわりに、構成プロパティoracle.spatial.recordInfo.locationFieldを検索フィールドの名前で設定すると、その値がMVSuggestに送信されます。例: configuration.set(LocatizableRecordInfoProvider.CONF_RECORD_INFO_LOCATION_FIELD, “locationField”)

2.9.12 HierarchyInfo

HierarchyInfoインタフェースは階層データ・セットの説明に使用されます。このHierarchyInfoの実装では、説明する階層の階層レベルの数、名前、およびエントリを示すものとされます。

ルート階層レベルは常に階層レベル1です。このレベルのエントリに親エントリはなく、このレベルが最上位の階層レベルとみなされます。子階層レベルには、上位のレベル値があります。たとえば、大陸部、国、および州に応じた階層のレベルは、それぞれ1、2、および3になります。大陸部レイヤーのエントリには親はありませんが、国レイヤーの子エントリがあります。下部レベルである州レイヤーのエントリには、子はありません。

HierarchyInfo実装は、Vector Analysis APIですぐに使用できるように用意されています。DynaAdminHierarchyInfo実装は、GeoJSON形式で認識されている階層レイヤーの読取りと説明に使用できます。DynaAdminHierarchyInfoはインスタンス化および構成、あるいはサブクラス化が可能です。これに含まれる階層レイヤーは、次のパラメータをとるaddLevel()メソッドを呼び出して指定します。

- 階層レベル番号

- データを含むGeoJSONファイルのファイル名(拡張子なし)と一致する階層レベル名。たとえば、ファイルworld_continents.jsonの階層レベル名はworld_continentsであり、world_countries.jsonの階層レベル名はworld_countriesのようになります。

- 「Children join」フィールド: 現在レベルのエントリを、下位レベルの子エントリと結合するためのJSONプロパティです。nullが渡された場合、エントリIDが使用されます。

- 「Parent join」フィールド: 現在レベルのエントリを、上位レベルの親エントリと結合するためのJSONプロパティです。この値は、結合する上位レベルのない最上位レベルでは使用されません。1より大きい数のその他のレベルで値がnullに設定された場合、IsInside空間操作が実行され、親と子のエントリが結合されます。このシナリオでは、上位レベルのジオメトリには、下位レベルのエントリが含まれることを示しています。

たとえば、1つの階層は、1- world_continents、2 - world_countries、および3 - world_states_provincesのように、指定したレイヤーのレベルを含むとします。各レイヤーのサンプル・エントリは次のようになります。

world_continents:
{"type":"Feature","_id":"NA","geometry": {"type":"MultiPolygon", "coordinates":[ x,y,x,y,x,y] }"properties":{"NAME":"NORTH AMERICA", "CONTINENT_LONG_LABEL":"North America"},"label_box":[-118.07998,32.21006,-86.58515,44.71352]}

world_countries: {"type":"Feature","_id":"iso_CAN","geometry":{"type":"MultiPolygon","coordinates":[x,y,x,y,x,y]},"properties":{"NAME":"CANADA","CONTINENT":"NA","ALT_REGION":"NA","COUNTRY CODE":"CAN"},"label_box":[-124.28092,49.90408,-94.44878,66.89287]}

world_states_provinces:
{"type":"Feature","_id":"6093943","geometry": {"type":"Polygon", "coordinates":[ x,y,x,y,x,y]},"properties":{"COUNTRY":"Canada", "ISO":"CAN", "STATE_NAME":"Ontario"},"label_box":[-91.84903,49.39557,-82.32462,54.98426]}

DynaAdminHierarchyInfoは、次の方法で前述のレイヤーを含む階層を作成するために構成されます。

DynaAdminHierarchyInfo dahi = new DynaAdminHierarchyInfo();

dahi.addLevel(1, "world_continents", null /*_id is used by default to join with child entries*/, null /*not needed as there are not upper hierarchy levels*/);

dahi.addLevel(2, "world_countries", "properties.COUNTRY CODE"/*field used to join with child entries*/, "properties.CONTINENT" /*the value "NA" will be used to find Canada's parent which is North America and which _id field value is also "NA" */);

dahi.addLevel(3, "world_states_provinces", null /*not needed as not child entries are expected*/, "properties.ISO"/*field used to join with parent entries. For Ontario, it is the same value than the field properties.COUNTRY CODE specified for Canada*/);

//save the previous configuration to the job configuration

dahi.initialize(conf);

同様の構成を使用して、国、州、郡などの複数のレイヤー、または同様のJSON形式の他のレイヤーから階層を作成できます。

他にも、ジョブ実行ごとの階層の構成を避けるため、次の例に示すように、階層構成をDynaAdminHierarchyInfoサブクラスで囲むこともできます。

public class WorldDynaAdminHierarchyInfo extends DynaAdminHierarchyInfo \

{
public WorldDynaAdminHierarchyInfo()

{
super();
addLevel(1, "world_continents", null, null);
addLevel(2, "world_countries", "properties.COUNTRY CODE", "properties.CONTINENT");
addLevel(3, "world_states_provinces", null, "properties.ISO");
}

}

- サンプルHierarchyInfo実装

2.9.12.1 サンプルHierarchyInfo実装

HierarchyInfoインタフェースには、階層の説明を実装するために次のメソッドが含まれています。メソッドは次の3つのカテゴリに分けられます。

- 階層を説明するメソッド

- データをロードするメソッド

- データを供給するメソッド

また、ジョブ構成の初期化を実行、およびジョブ構成へデータを保存、またはジョブ構成から読み取るためのinitialize() メソッドがあります

void initialize(JobConf conf);

//methods to describe the hierarchy

String getLevelName(int level);
int getLevelNumber(String levelName);
int getNumberOfLevels();

//methods to load data

void load(Path[] hierDataPaths, int fromLevel, JobConf conf) throws Exception;
void loadFromIndex(HierarchyDataIndexReader[] readers, int fromLevel, JobConf conf) throws Exception;

//methods to supply data

Collection<String> getEntriesIds(int level);
JGeometry getEntryGeometry(int level, String entryId);
String getParentId(int childLevel, String childId);

前述の階層レベルとしての地域レイヤーをとるHierarchyInfo実装のサンプルを次に示します。最初のセクションには、初期化メソッドと階層を記述するメソッドがあります。この場合、初期化メソッドは何もしません。次の例に示すメソッドは、hierarchyLevelNames配列を使用して階層を記述します。インスタンス変数entriesGeomsおよびentriesParentは、それぞれエントリのジオメトリとエントリの親を含むjava.util.Mapの配列です。どちらの場合も、エントリIDはキーとして使用されます。配列索引は0から始まり、階層レベルは1から始まるため、配列索引は、配列索引 + 1 = 階層レベルとして階層レベルに対応します。

public class WorldHierarchyInfo implements HierarchyInfo
{

private String[] hierarchyLevelNames = {"world_continents", "world_countries", "world_states_provinces"};
private Map<String, JGeometry>[] entriesGeoms = new Map[3];
private Map<String, String>[] entriesParents = new Map[3];

@Override
public void initialize(JobConf conf)
{

//do nothing for this implementation
}

@Override
public int getNumberOfLevels()
{
return hierarchyLevelNames.length;
}

@Override
public String getLevelName(int level)
{
String levelName = null;
if(level >=1 && level <= hierarchyLevelNames.length)
{
levelName = hierarchyLevelNames[ level - 1];
}
return levelName;
}

@Override
public int getLevelNumber(String levelName)
{
for(int i=0; i< hierarchyLevelNames.length; i++ )
{
if(hierarchyLevelNames.equals( levelName) ) return i+1;
}
return -1;
}

次の例には、複数の階層レベル・データをロードするメソッドが含まれています。load()メソッドはソース・ファイルworld_continents.json、world_countries.json、およびworld_states_provinces.jsonからデータを読み取ります。簡略化のため、内部的に呼び出されたloadLevel()メソッドは指定されませんが、JSONファイルの解析と読取りが行われます。

loadFromIndex()メソッドは、パラメータとして渡されたHierarchyIndexReaderインスタンスから提供された情報のみを受け取ります。load()メソッドは、階層索引がジョブで作成されない場合にかぎり、1回のみ実行されます。データはロード後に自動的に索引付けられ、階層データがメモリーにロードされるたびにloadFromIndex()メソッドが呼び出されます。

@Override
public void load(Path[] hierDataPaths, int fromLevel, JobConf conf) throws Exception {
int toLevel = fromLevel + hierDataPaths.length - 1;
int levels = getNumberOfLevels();

for(int i=0, level=fromLevel; i<hierDataPaths.length && level<=levels; i++, level++)
{

//load current level from the current path

loadLevel(level, hierDataPaths[i]);
}
}

@Override
public void loadFromIndex(HierarchyDataIndexReader[] readers, int fromLevel, JobConf conf)
throws Exception
{
Text parentId = new Text();
RecordInfoArrayWritable records = new RecordInfoArrayWritable();
int levels = getNumberOfLevels();

//iterate through each reader to load each level's entries

for(int i=0, level=fromLevel; i<readers.length && level<=levels; i++, level++)
{
entriesGeoms[ level - 1 ] = new Hashtable<String, JGeometry>();
entriesParents[ level - 1 ] = new Hashtable<String, String>();

//each entry is a parent record id (key) and a list of entries as RecordInfo (value)

while(readers[i].nextParentRecords(parentId, records))
{
String pId = null;

//entries with no parent will have the parent id UNDEFINED_PARENT_ID. Such is the case of the first level entries

if( ! UNDEFINED_PARENT_ID.equals( parentId.toString() ) )
{
pId = parentId.toString();
}

//add the current level's entries

for(Object obj : records.get())
{
RecordInfo entry = (RecordInfo) obj;
entriesGeoms[ level - 1 ].put(entry.getId(), entry.getGeometry());
if(pId != null)
{
entriesParents[ level -1 ].put(entry.getId(), pId);
}
}//finishin loading current parent entries
}//finish reading single hierarchy level index
}//finish iterating index readers
}

最後に、次に示すコードには、各階層レベルのそれぞれのエントリの情報を提供するメソッドが含まれます。提供される情報は、階層レベルに含まれるすべてのエントリのID、各エントリのジオメトリ、および各エントリの親です。

@Override
public Collection<String> getEntriesIds(int level)
{
Collection<String> ids = null;

if(level >= 1 && level <= getNumberOfLevels() && entriesGeoms[ level - 1 ] != null)
{

//returns the ids of all the entries from the given level

ids = entriesGeoms[ level - 1 ].keySet();
}
return ids;
}

@Override
public JGeometry getEntryGeometry(int level, String entryId)
{
JGeometry geom = null;
if(level >= 1 && level <= getNumberOfLevels() && entriesGeoms[ level - 1 ] != null)
{

//returns the geometry of the entry with the given id and level

geom = entriesGeoms[ level - 1 ].get(entryId);
}
return geom;
}

@Override
public String getParentId(int childLevel, String childId)
{
String parentId = null;
if(childLevel >= 1 && childLevel <= getNumberOfLevels() && entriesGeoms[ childLevel - 1 ] != null)
{

//returns the parent id of the entry with the given id and level

parentId = entriesParents[ childLevel - 1 ].get(childId);
}
return parentId;
}
}//end of class

2.9.13 MapReduceジョブでのJGeometryの使用

Spatial Hadoop Vector Analysisには、Spatial Java APIで提供される機能の小さいサブセットのみが含まれており、MapReduceジョブでも使用できます。このセクションでは、空間処理のためにHadoopでJGeometryをどのように使用するかの簡単な例をいくつか示します。次の例では、JGeometryクラスを使用したデータセットと問合せジオメトリの間のIsInsideテストを実行する簡単なマッパーを示します。

この例では、空間操作で使用される問合せジオメトリの座標系、SRID、測地の値および許容差が構成メソッドのジョブ構成から取得されます。ポリゴンの問合せジオメトリは、IsInside操作を迅速に実行するため事前処理されます。

MAPメソッドは空間操作を実行する場所です。それぞれの入力レコード値が問合せジオメトリに対してテストされ、テストが完了するとIDが返されます。

public class IsInsideMapper extends MapReduceBase implements Mapper<LongWritable, Text, NullWritable, Text>
{
private JGeometry queryGeom = null;
private int srid = 0;
private double tolerance = 0.0;
private boolean geodetic = false;
private Text outputValue = new Text();
private double[] locationPoint = new double[2];

@Override
public void configure(JobConf conf)
{
super.configure(conf);
srid = conf.getInt("srid", 8307);
tolerance = conf.getDouble("tolerance", 0.0);
geodetic = conf.getBoolean("geodetic", true);

//The ordinates are represented as a string of comma separated double values

String[] ordsStr = conf.get("ordinates").split(",");
double[] ordinates = new double[ordsStr.length];
for(int i=0; i<ordsStr.length; i++)
{
ordinates[i] = Double.parseDouble(ordsStr[i]);
}

//create the query geometry as two-dimensional polygon and the given srid

queryGeom = JGeometry.createLinearPolygon(ordinates, 2, srid);

//preprocess the query geometry to make the IsInside operation run faster

try
{
queryGeom.preprocess(tolerance, geodetic, EnumSet.of(FastOp.ISINSIDE));
}
catch (Exception e)
{
e.printStackTrace();
}

}

@Override
public void map(LongWritable key, Text value,
OutputCollector<NullWritable, Text> output, Reporter reporter)
throws IOException
{

//the input value is a comma separated values text with the following columns: id, x-ordinate, y-ordinate

String[] tokens = value.toString().split(",");

//create a geometry representation of the record's location

locationPoint[0] = Double.parseDouble(tokens[1]);//x ordinate
locationPoint[1] = Double.parseDouble(tokens[2]);//y ordinate
JGeometry location = JGeometry.createPoint(locationPoint, 2, srid);

//perform spatial test

try
{
if( location.isInside(queryGeom, tolerance, geodetic)){

//emit the record's id

outputValue.set( tokens[0] );
output.collect(NullWritable.get(), outputValue);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

同じような方法で、ジオメトリ自体の空間操作も実行できます。たとえば、バッファを作成します。次の例では、同じテキスト値の形式を使用して、各レコードの場所の周辺にバッファを作成します。マッパー出力キーおよび値はレコードIDおよび生成済のバッファであり、JGeometryWritableとして表現されます。JGeometryWritableはVector Analysis APIに含まれる書込み可能な実装であり、JGeometryインスタンスを保持します。

public class BufferMapper extends MapReduceBase implements Mapper<LongWritable, Text, Text, JGeometryWritable>
{
private int srid = 0;
private double bufferWidth = 0.0;
private Text outputKey = new Text();
private JGeometryWritable outputValue = new JGeometryWritable();
private double[] locationPoint = new double[2];

@Override
public void configure(JobConf conf)
{
super.configure(conf);
srid = conf.getInt("srid", 8307);

//get the buffer width

bufferWidth = conf.getDouble("bufferWidth", 0.0);
}

@Override
public void map(LongWritable key, Text value,
OutputCollector<Text, JGeometryWritable> output, Reporter reporter)
throws IOException
{

//the input value is a comma separated record with the following columns: id, longitude, latitude

String[] tokens = value.toString().split(",");

//create a geometry representation of the record's location

locationPoint[0] = Double.parseDouble(tokens[1]);
locationPoint[1] = Double.parseDouble(tokens[2]);
JGeometry location = JGeometry.createPoint(locationPoint, 2, srid);

try
{

//create the location's buffer

JGeometry buffer = location.buffer(bufferWidth);

//emit the record's id and the generated buffer

outputKey.set( tokens[0] );
outputValue.setGeometry( buffer );
output.collect(outputKey, outputValue);
}

catch (Exception e)
{
e.printStackTrace();
}
}
}

2.9.14 異なるデータ・ソースのサポート

ファイルベースのデータ・ソース(つまり、ローカル・ファイル・システムまたは分散ファイル・システムからのファイルまたはファイル・セット)以外にも、他のタイプのデータ・ソースをVector APIジョブの入力データとして使用できます。

データ・ソースは、Vector API内の入力データ・ソースとして参照されます。すべての入力データ・セットにより、インタフェースoracle.spatial.hadoop.vector.data.AbstractInputDataSetが実装されます。入力データ・セットのプロパティは、メソッドsetInputFormatClass()、setRecordInfoProviderClass()およびsetSpatialConfig()を使用してVectorジョブに対して直接設定できます。入力データ・セットのタイプに応じて、より多くの情報を設定できます。たとえば、setInput()を使用してファイル・データ・ソースを指定したり、setIndexName()を空間索引に使用したりできます。このジョブにより、設定されているプロパティに基づいて入力データ型ソースが決まります。

入力データ・セット情報は、ジョブのメソッドsetInputDataSet()を使用してVector APIジョブに直接設定することもできます。このメソッドを使用すると、入力データ・ソース情報がカプセル化され、より詳細な制御が可能になり、使用されているデータ・ソースのタイプを識別しやすくなります。

Vector APIには、AsbtractInputDataSetの次の実装が用意されています。

- SimpleInputDataSet: 入力データ・セット用としてVector APIに必要な最小限の情報が含まれます。通常、Apache Hbase、Oracleデータベースまたは他の任意のファイルベース以外のデータ・ソースなど、ファイルベース以外の入力データ・セットには、このタイプの入力データ・セットを使用する必要があります。

- FileInputDataSet: ローカル・ファイル・システムまたは分散ファイル・システムからのファイルベースの入力データ・セットをカプセル化します。これには、入力パスをパス・インスタンスの配列として、またはパス選択用の正規表現として使用可能な文字列として設定するためのプロパティが用意されています。

- SpatialIndexInputDataSet: Vector APIによって生成された空間索引を操作するために最適化されたFileInputDataSetのサブクラス。このタイプの入力データ・セットの場合、索引名を指定するだけで十分です。

- NoSQLInputDataSet: Oracle NoSQLデータ・ソースを指定します。Vector NoSQL APIと連携して使用する必要があります。NoSQL KVInputFormatまたはTableInputFormatクラスを使用する必要がある場合は、SimpleInputFormatを代わりに使用してください。

- MultiInputDataSet: 複数の入力データ・セットをカプセル化する入力データ・セット。

複数の入力データ・セット

Vector APIジョブに用意されているHadoopジョブのほとんど(カテゴリ化を除く)では、クラスoracle.spatial.hadoop.vector.data.MultiInputDataSetを使用することにより、複数の入力データ・セットを管理できます。

1つのジョブに複数の入力データ・セットを追加するには、次の手順を実行します。

1. AbstractInputDataSetサブクラスの複数のインスタンスを作成および構成します。

2. oracle.spatial.hadoop.vector.data.MultiInputDataSetのインスタンスを作成します。

3. ステップ1で作成した入力データ・セットをMultiInputDataSetインスタンスに追加します。

4. ジョブの入力データ・セットとしてMultiInputDataSetインスタンスを設定します。

次のコード・スニペットは、1つのVector APIに複数の入力データ・セットを設定する方法を示しています。

//file input data set
FileInputDataSet fileDataSet = new FileInputDataSet();
fileDataSet.setInputFormatClass(GeoJsonInputFormat.class);
fileDataSet.setRecordInfoProviderClass(GeoJsonRecordInfoProvider.class);
fileDataSet.setInputString("/user/myUser/geojson/*.json");

//spatial index input data set
SpatialIndexInputDataSet indexDataSet = new SpatialIndexInputDataSet();
indexDataSet.setIndexName("myIndex");

//create multi input data set
MultiInputDataSet multiDataSet = new MultiInputDataSet();

//add the previously defined input data sets
multiDataSet.addInputDataSet(fileDataSet);
multiDataSet.addInputDataSet(indexDataSet);

Binning binningJob = new Binning();
//set multiple input data sets to the job
binningJob.setInputDataSet(multiDataSet);

NoSQL入力データ・セット

Vector APIには、Oracle NoSQL Databaseからデータを読み取るクラスが用意されています。Vector NoSQLコンポーネントを使用すると、複数のキー/値ペアを単一のレコードにグループ化できます。これらのレコードは、HadoopマッパーにRecordInfoインスタンスとして渡されます。また、これらを使用して、NoSQLエントリ(キーおよび値)をHadoopレコード・フィールド(RecordInfoのid、geometryおよび追加フィールド)にマップすることもできます。

NoSQLパラメータは、NoSQLInputDataSetクラスを使用してVectorジョブに渡されます。必要なのは、NoSQLデータ・ソースのKVストア、ホスト、親キーおよび追加情報が含まれるNoSQLConfigurationインスタンスを入力および設定することのみです。デフォルトのクラスが使用されるため、InputFormatおよびRecordInfoProviderクラスを設定する必要はありません。

次の例は、Vector NoSQLクラスを使用して、NoSQLをデータ・ソースとして使用するジョブを構成する方法を示します。

//create NoSQL configuration
NoSQLConfiguration nsqlConf = new NoSQLConfiguration();
// set connection data
nsqlConf.setKvStoreName("mystore");
nsqlConf.setKvStoreHosts(new String[] { "myserver:5000" });
nsqlConf.setParentKey(Key.createKey("tweets"));
// set NoSQL entries to be included in the Hadoop records
// the entries with the following minor keys will be set as the
// RecordInfo's extra fields
nsqlConf.addTargetEntries(new String[] { "friendsCount", "followersCount" });
// add an entry processor to map the spatial entry to a RecordInfo's
// geometry
nsqlConf.addTargetEntry("geometry", NoSQLJGeometryEntryProcessor.class);
//create and set the NoSQL input data set
NoSQLInputDataSet nsqlDataSet = new NoSQLInputDataSet();
//set noSQL configuration
nsqlDataSet.setNoSQLConfig(nsqlConf);
//set spatial configuration
SpatialConfig spatialConf = new SpatialConfig();
spatialConf.setSrid(8307);
nsqlDataSet.setSpatialConfig(spatialConf);

ターゲット・エントリは、Hadoopレコードの一部となるNoSQLエントリを参照しており、NoSQLマイナー・キーによって指定されます。前の例では、マイナー・キーfriendsCountおよびfollowersCountを持つエントリがHadoopレコードの一部となります。これらのNoSQLエントリは、テキスト値として解析され、friendsCountおよびfollowersCountと呼ばれる追加フィールドとしてHadoop RecordInfoに割り当てられます。デフォルトでは、メジャー・キーがレコードIDとして使用されます。マイナー・キーとして“ジオメトリ”が含まれるエントリは、RecordInfoのgeometryフィールドを設定するために使用されます。

前の例では、ジオメトリNoSQLエントリの値タイプはJGeometryであるため、この値を解析するためのクラスを指定し、RecordInfoのgeometryフィールドに割り当てる必要があります。これには、NoSQLEntryProcessorインタフェースの実装を設定する必要があります。この場合、NoSQLJGeometryEntryProcessorクラスが使用され、このクラスが、NoSQLエントリから値を読み取り、この値を現在のRecordInfoのgeometryフィールドに設定します。特定のエントリ形式を解析するためにNoSQLEntryProcessorの独自の実装を用意できます。

デフォルトでは、同じメジャー・キーを共有するNoSQLエントリが同じHadoopレコードにグループ化されます。この動作を変更するには、oracle.spatial.hadoop.nosql.NoSQLGrouperを実装し、NoSQLConfigurationプロパティentryGrouperClassを新しいgrouperクラスを使用して設定します。

NoSQLを入力データ・ソースとして使用するVector APIジョブを実行する場合、Oracle NoSQLライブラリkvstore.jarが必要です。

他のファイルベース以外のデータ・ソース

NoSQL (Oracle NoSQLクラスを使用)およびApache HBaseなど、他のファイルベース以外のデータ・ソースをVector APIとともに使用できます。Vector APIには、データ・ソースのすべてのタイプを管理するための特定のクラスは用意されていませんが、特定のデータ・ソースをジョブ構成と関連付け、Vectorジョブに次の情報を指定できます。

- InputFormat: データ・ソースからデータを読み取るために使用されるInputFormat実装。

- RecordInfoProvider: 現在のInputFormatから返されたキー/値ペアからid、空間情報および追加フィールドなどの必要な情報を抽出するためのRecordInfoProviderの実装。

- 空間構成: SRIDや次元境界などの入力データの空間プロパティを説明します。

次の例は、Vectorジョブ内のApache HBaseデータを使用する方法を示します。

//create job
Job job = Job.getInstance(getConf());
job.setJobName(getClass().getName());
job.setJarByClass(getClass());

//Setup hbase parameters
Scan scan = new Scan();
scan.setCaching(500);
scan.setCacheBlocks(false);
scan.addColumn(Bytes.toBytes("location_data"), Bytes.toBytes("geometry"));
scan.addColumn(Bytes.toBytes("other_data"), Bytes.toBytes("followers_count"));
scan.addColumn(Bytes.toBytes("other_data"), Bytes.toBytes("user_id"));

//initialize job configuration with hbase parameters
TableMapReduceUtil.initTableMapperJob(
"tweets_table",
scan,
null,
null,
null,
job);
//create binning job
Binning<ImmutableBytesWritable, Result> binningJob = new Binning<ImmutableBytesWritable, Result>();
//setup the input data set
SimpleInputDataSet inputDataSet = new SimpleInputDataSet();
//use HBase's TableInputFormat
inputDataSet.setInputFormatClass(TableInputFormat.class);
//Set a RecordInfoProvider which can extract information from HBase TableInputFormat's returned key and values
inputDataSet.setRecordInfoProviderClass(HBaseRecordInfoProvider.class);
//set spatial configuration
SpatialConfig spatialConf = new SpatialConfig();
spatialConf.setSrid(8307);
inputDataSet.setSpatialConfig(spatialConf);
binningJob.setInputDataSet(inputDataSet);

//job output
binningJob.setOutput("hbase_example_output");

//binning configuration
BinningConfig binConf = new BinningConfig();
binConf.setGridMbr(new double[]{-180, -90, 180, 90});
binConf.setCellHeight(5);
binConf.setCellWidth(5);
binningJob.setBinConf(binConf);

//configure the job
binningJob.configure(job);

//run
boolean success = job.waitForCompletion(true);

前の例で設定されたRecordInfoProviderクラスは、HBaseRecordInfoProviderと呼ばれるカスタム実装であり、その定義は次のとおりです。

public class HBaseRecordInfoProvider implements RecordInfoProvider<ImmutableBytesWritable, Result>, Configurable{

private Result value = null;
private Configuration conf = null;
private int srid = 0;

@Override
public void setCurrentRecord(ImmutableBytesWritable key, Result value) throws Exception {
this.value = value;
}

@Override
public String getId() {
byte[] idb = value.getValue(Bytes.toBytes("other_data"), Bytes.toBytes("user_id"));
String id = idb != null ? Bytes.toString(idb) : null;
return id;
}

@Override
public JGeometry getGeometry() {
byte[] geomb = value.getValue(Bytes.toBytes("location_data"), Bytes.toBytes("geometry"));
String geomStr = geomb!=null ? Bytes.toString(geomb) : null;
JGeometry geom = null;
if(geomStr != null){
String[] pointsStr = geomStr.split(",");
geom = JGeometry.createPoint(new double[]{Double.valueOf(pointsStr[0]), Double.valueOf(pointsStr[1])}, 2, srid);
}
return geom;
}

@Override
public boolean getExtraFields(Map<String, String> extraFields) {
byte[] fcb =  value.getValue(Bytes.toBytes("other_data"), Bytes.toBytes("followers_count"));
if(fcb!=null){
extraFields.put("followers_count", Bytes.toString(fcb));
}
return fcb!=null;
}

@Override
public Configuration getConf() {
return conf;
}

@Override
public void setConf(Configuration conf) {
srid = conf.getInt(ConfigParams.SRID, 0);
}

}

2.9.15 ジョブ・レジストリ

コマンド・ライン・インタフェースまたはWebコンソールを使用してVector APIジョブが起動されるたびに、そのジョブ用のレジストリ・ファイルが作成されます。ジョブ・レジストリ・ファイルには、ジョブに関する次の情報が含まれます。

- ジョブ名

- ジョブID

- ジョブを実行したユーザー

- 開始時間および終了時間

- ジョブの実行に使用されたパラメータ

- 最初のジョブによって起動されたジョブ(child jobsと呼ばれます)。子ジョブには、親ジョブと同じフィールドが含まれます。

ジョブ・レジストリ・ファイルには、ジョブの実行に使用されるパラメータが保持されています。このパラメータは、同一のジョブがコマンド・ライン・インタフェースを使用して最初に実行されていなかった場合でも、このジョブを実行するためのサポート用として使用できます。

デフォルトでは、ジョブ・レジストリ・ファイルは、ユーザー・フォルダoracle_spatial/job_registry (hdfsユーザー用の/user/hdfs/oracle_spatial/job_registryなど)の相対HDFSパスの下に作成されます。

ジョブ・レジストリ・ファイルは、HDFSコマンドを使用して直接、またはクラスoracle.spatial.hadoop.commons.logging.registry.RegistryManagerの次のユーティリティ・メソッドを使用して削除できます。

- public static int removeJobRegistry(long beforeDate, Configuration conf): デフォルトのジョブ・レジストリ・フォルダから指定されたタイム・スタンプの前に作成されたジョブ・レジストリ・ファイルをすべて削除します。

- public static int removeJobRegistry(Path jobRegDirPath, long beforeDate, Configuration conf): 指定されたジョブ・レジストリ・フォルダから指定されたタイム・スタンプの前に作成されたジョブ・レジストリ・ファイルをすべて削除します。

2.9.16 Vector Analysis APIを使用したジョブ実行時間のパフォーマンス・データのチューニング

この表は、Vector Analysis APIを使用したジョブ作成の実行時間を示します。ジョブは4ノードのクラスタを使用して実行されています。時間はクラスタの特性によって異なります。テスト・データセットには、10億以上のレコードがあり、サイズは1TBを超えています。

表2-4 Vector Analysis APIを使用したジョブ実行のパフォーマンス時間

ジョブ・タイプ

経過時間(推定値)

空間の索引付け

2時間

空間索引による空間のフィルタ処理

1時間

空間索引を使用しない空間のフィルタ処理

3時間

空間索引による階層のカウント

5分

空間索引を使用しない階層のカウント

3時間

ジョブにかかる時間は、次の構成パラメータのいずれかを使用して最大分割サイズを増やすと短縮できます。

mapred.max.split.size
mapreduce.input.fileinputformat.split.maxsize

この結果、各マッパーでさらに多くの分割が処理され、実行時間が短縮されます。これはSpatialFilterInputFormat (空間索引付け)またはFileSplitInputFormat (空間階層結合、バッファ)を使用して実行します。また、内部InputFormatとしてCombineFileInputFormatの実装を使用しても、同様の結果が得られます。

2.10 Oracle Big Data Spatial Vector Analysis for Spark

Oracle Big Data Spatial Vector Analysis for Apache Sparkは、空間の変換およびアクション、空間のパーティショニングおよび索引付けをサポートしている空間対応のRDD (Resilient Distributed Datasets)が用意されたSpatial Vector Analysis API for Java and Scalaです。

これらのコンポーネントでは、Spatial Java APIを利用して空間分析タスクを実行します。サポートされている機能には、次が含まれています。

- 空間RDD (Resilient Distributed Dataset)

- 空間の変換

- 空間アクション(MBRおよびNearestNeighbors)

- 空間RDDの空間索引付け

- 入力形式のサポート

- 空間Spark SQL API

- 空間RDDのJDBCデータ・ソース

2.10.1 空間RDD (Resilient Distributed Dataset)

空間RDD (Resilient Distributed Dataset)は、空間の変換およびアクションを実行できるSpark RDDです。

現在の空間RDD実装は、Java用のクラスoracle.spatial.spark.vector.rdd.SpatialJavaRDDおよびScala用のoracle.spatial.spark.vector.scala.rdd.SpatialRDDです。空間RDD実装は、次の例に示すように、RDDまたはJavaRDDの既存のインスタンスから作成できます。

Java:

//create a regular RDD
JavaRDD<String> rdd = sc.textFile("someFile.txt");
//create a SparkRecordInfoProvider to extract spatial information from the source RDD’s records
SparkRecordInfoProvider<String> recordInfoProvider = new MySparkRecordInfoProvider();
//create a spatial RDD
SpatialJavaRDD<String> spatialRDD = SpatialJavaRDD.fromJavaRDD(rdd, recordInfoProvider, String.class));

Scala:

//create a regular RDD
val rdd: RDD[String] = sc.textFile("someFile.txt")
//create a SparkRecordInfoProvider to extract spatial information from the source RDD’s records
val recordInfoProvider: SparkRecordInfoProvider[String] = new MySparkRecordInfoProvider()
//create a spatial RDD
val spatialRDD: SpatialRDD[String] = SpatialRDD(rdd, recordInfoProvider)

空間RDDでは、各RDD要素から空間情報を抽出するために使用されるインタフェースoracle.spatial.spark.vector.SparkRecordInfoProviderの実装が使用されます。

通常のRDDは、同じ汎用型の空間RDDに変換できます(つまり、ソースRDDに文字列型のレコードが含まれる場合)。空間RDDには文字列レコードも含まれます。

タイプoracle.spatial.spark.vector.SparkRecordInfoのレコードを使用して空間RDDを作成することもできます。SparkRecordInfoは、ソースRDDからのレコードの抽象です。これには、ソース・レコードの空間情報が保持され、ソース・レコードのサブセットのデータが含まれる場合があります。

次の例は、SparkRecordInfoレコードのRDDを作成する方法を示します。

Java:

//create a regular RDD
JavaRDD<String> rdd = sc.textFile("someFile.txt");
//create a SparkRecordInfoProvider to extract spatial information from the source RDD’s records
SparkRecordInfoProvider<String> recordInfoProvider = new MySparkRecordInfoProvider();
//create a spatial RDD
SpatialJavaRDD<SparkRecordInfo> spatialRDD = SpatialJavaRDD.fromJavaRDD(rdd, recordInfoProvider));

Scala:

//create a regular RDD
val rdd: RDD[String] = sc.textFile("someFile.txt")
//create a SparkRecordInfoProvider to extract spatial information from the source RDD’s records
val recordInfoProvider: SparkRecordInfoProvider[String] = new MySparkRecordInfoProvider()
//create a spatial RDD
val spatialRDD: SpatialRDD[SparkRecordInfo] = SpatialRDD.fromRDD(rdd, recordInfoProvider))

SparkRecordInfoレコードの空間RDDには、空間操作に必要なときに毎回、空間情報を各レコードから抽出する必要がないというメリットがあります。

空間RDDに空間的に索引付けすることにより、空間検索を加速できます。空間索引付けについては、「1.4 空間の索引付け」で説明されています。

空間RDDには、「1.2 空間の変換」および「1.3 空間アクション」の各項で説明されている次の空間の変換およびアクションが用意されています。

空間の変換:

- filter

- flatMap

- join (空間索引の作成時に使用可能)

空間アクション:

- MBR

- nearestNeighbors

空間ペアRDD

JavaクラスSpatialJavaRDDのペア・バージョンが用意されており、クラスoracle.spatial.spark.vector.rdd.SpatialJavaPairRDDとして実装されます。空間ペアRDDは、既存のペアRDDから作成され、単一の空間RDDと同じ空間の変換およびアクションを含みます。空間ペアRDDに使用されるSparkRecordInfoProviderは、タイプscala.Tuple2<K,V>のレコードを受け取る必要があります。この場合、KおよびVは、ペアRDDのキーおよび値のタイプにそれぞれ対応しています。

例2-1 CSVファイルから情報を読み取るためのSparkRecordInfoProvider

次の例は、CSVファイルから情報を読み取るための単純なSparkRecordInfoProviderを実装する方法を示します。

public class CSVRecordInfoProvider implements SparkRecordInfoProvider<String>{
private int srid = 8307;

//receives an RDD record and fills the given recordInfo
public boolean getRecordInfo(String record, SparkRecordInfo recordInfo) {
try {
String[] tokens = record.split(",");
//expected records have the format: id,name,last_name,x,y where x and y are optional
//output recordInfo will contain the fields id, last name and geometry
recordInfo.addField("id", tokens[0]);
recordInfo.addField("last_name", tokens[2]);
if (tokens.length == 5) {
recordInfo.setGeometry(JGeometry.createPoint(tokens[3], tokens[4], 2, srid));
}
} catch (Exception ex) {
//return false when there is an error extracting data from the input value
return false;
}
return true;
}

public void setSrid(int srid) {this.srid = srid;}
public int getSrid() {return srid;}
}

この例では、出力パラメータとして使用されるSparkRecordInfoインスタンスに送信される空間情報とともに、レコードのIDおよび姓フィールドが抽出されます。追加情報の抽出が必要なのは、SparkRecordInfo要素が含まれる空間RDDを作成することが目標である場合のみです。この抽出処理は、元のレコード情報のサブセットを保持するために必要です。それ以外の場合に必要なのは、空間情報を抽出することのみです。

レコードを変換に含めるか検索時に考慮することが必要な場合は常に、SparkRecordInfoProvider.getRecordInfo()への呼出しによってtrueが返される必要があります。SparkRecordInfoProvider.getRecordInfo()によってfalseが返される場合、レコードは無視されます。

2.10.2 空間の変換

次のサブトピックで説明する変換は、別途記述がない限り(たとえば、結合変換は分散空間索引に対してのみ使用可能であるなど)、空間RDD、空間ペアRDDおよび分散空間索引に対して使用可能です。

- フィルタ変換

- FlatMap変換

- 結合変換

- 空間評価の制御

- 空間的に有効な変換

2.10.2.1 フィルタ変換

フィルタ変換は、通常のRDDのfilter()変換の空間バージョンです。ユーザー指定のフィルタ機能に加えて、これには、空間レコードのフィルタに使用される空間操作を記述するために使用されるoracle.spatial.hadoop.vector.util.SpatialOperationConfigのインスタンスが使用されます。SpatialOperationConfigには、参照および空間操作として使用されるジオメトリである問合せウィンドウが含まれます。空間操作は、(RDDレコードのジオメトリ) (空間操作) (問合せウィンドウ)という形式で実行されます。たとえば、(RDD record) IsInside (queryWindow)などです

使用可能な空間操作は、AnyInteract、IsInside、ContainsおよびWithinDistanceです。

次の例は、特定の問合せウィンドウ内にありnull以外のIDを持つレコードのみが含まれるRDDを返します。

Java:

SpatialOperationConfig soc = new SpatialOperationConfig();
soc.setOperation(SpatialOperation.IsInside);
soc.setQueryWindow(JGeometry.createLinearPolygon(new double[] { 2.0, 1.0, 2.0, 3.0, 6.0, 3.0, 6.0, 1.0, 2.0, 1.0 }, 2, srid));
SpatialJavaRDD<SparkRecordInfo> filteredSpatialRDD = spatialRDD.filter(
(record) -> {
return record.getField(“id”) != null;
}, soc);

Scala:

val soc = new SpatialOperationConfig()
soc.setOperation(SpatialOperation.IsInside)
soc.setQueryWindow(JGeometry.createLinearPolygon(Array(2.0, 1.0, 2.0, 3.0, 6.0, 3.0, 6.0, 1.0, 2.0, 1.0 ), 2, srid))
val filteredSpatialRDD: SpatialRDD[SparkRecordInfo] = spatialRDD.filter(
record => { record.getField(“id”) != null }, soc)

2.10.2.2 FlatMap変換

FlatMap変換は、通常のRDDのflatMap()変換の空間バージョンです。ユーザー指定の機能以外にも、空間フィルタを実行するためにSpatialOperationConfigが使用されます。これは、空間的にフィルタされた結果がマップ機能に渡されてフラット化される点を除いて、Filter Transformationと同じように機能します。

次の例では、バッファされた特定の問合せウィンドウおよびジオメトリと相互作用する要素のみが含まれるRDDを作成します。

Java:

SpatialOperationConfig soc = new SpatialOperationConfig();
soc.setOperation(SpatialOperation.AnyInteract);
soc.setQueryWindow(JGeometry.createLinearPolygon(new double[] { 2.0, 1.0, 2.0, 3.0, 6.0, 3.0, 6.0, 1.0, 2.0, 1.0 }, 2, srid));
JavaRDD<SparkRecordInfo> mappedRDD = spatialRDD.flatMap(
(record) -> {
JGeometry buffer = record.getGeometry().buffer(2.5);
record.setGeometry(buffer);
return Collections.singletonList(record);
}, soc);

Scala:

val soc = new SpatialOperationConfig()
soc.setOperation(SpatialOperation.AnyInteract)
soc.setQueryWindow(JGeometry.createLinearPolygon(Array( 2.0, 1.0, 2.0, 3.0, 6.0, 3.0, 6.0, 1.0, 2.0, 1.0 ), 2, srid))
val mappedRDD: RDD[SparkRecordInfo] = spatialRDD.flatMap(
record => {
val buffer: JGeometry = record.getGeometry().buffer(2.5)
record.setGeometry(buffer)
record
}, soc)

2.10.2.3 結合変換

結合変換では、2つの空間RDDをそれらのレコード間の空間関係に基づいて結合します。この変換を実行するには、2つのRDDの1つを空間的に索引付けする必要があります。(空間RDDの索引付けの詳細は、「空間の索引付け」を参照してください。)

次の例では、何らかの方法で相互作用するデータ・セットの両方のレコードをすべて結合します。

Java:

DistributedSpatialIndex index = DistributedSpatialIndex.createIndex(sparkContext, spatialRDD1, new QuadTreeConfiguration());
SpatialJavaRDD<SparkRecordInfo> spatialRDD2 = SpatialJavaRDD.fromJavaRDD(rdd2, new RegionsRecordInfoProvider(srid));
SatialOperationConfig soc = new SpatialOperationConfig();
soc.setOperation(SpatialOperation.AnyInteract);
JavaRDD<Tuple2<SparkRecordInfo, SparkRecordInfo> joinedRDD = index.join( spatialRDD2,
(recordRDD1, recordRDD2) -> {
return Collections.singletonList( new Tuple2<>(recordRDD1, recordRDD2));
}, soc);

Scala:

val index: DistributedSpatialIndex[SparkRecordInfo] = DistributedSpatialIndex.createIndex(spatialRDD1, new QuadTreeConfiguration())
val spatialRDD2: SpatialRDD[SparkRecordInfo] = SpatialRDD.fromRDD(rdd2, new RegionsRecordInfoProvider(srid))
val soc = new SpatialOperationConfig()
soc.setOperation(SpatialOperation.AnyInteract)
val joinedRDD: RDD[(SparkRecordInfo, SparkRecordInfo)] = index.join( spatialRDD2,
(recordRDD1, recordRDD2) => {(recordRDD1, recordRDD2)}, soc)

2.10.2.4 空間評価の制御

フィルタ処理変換または最近傍アクションを実行する場合、デフォルトでは、空間操作は、ユーザー定義のフィルタ処理機能を呼び出す前に実行されます。ただし、この動作は変更できます。空間操作の前にユーザー定義のフィルタ処理機能を実行すると、ユーザー定義のフィルタ処理機能に比べて空間操作のコストの方が大きい場合にパフォーマンスを向上させることができます。

空間操作の前に実行されるユーザー定義の機能を設定するには、フィルタ変換または最近傍アクションのいずれかに渡されるSpatialOperationConfigに次のパラメータを設定します。

SpatialOperationConfig spatialOpConf = new SpatialOperationConfig(SpatialOperation.AnyInteract, qryWindow, 0.05);
//set the spatial operation to be executed after the user-defined filtering function
spatialOpConf.addParam(SpatialOperationConfig.PARAM_SPATIAL_EVAL_STAGE, SpatialOperationConfig.VAL_SPATIAL_EVAL_STAGE_POST);
spatialRDD.filter((r)->{ return r.getFollowersCount()>1000;}, spatialOpConf);

前の例は、空間RDDと分散空間索引の両方に適用されます。

2.10.2.5 空間的に有効な変換

空間操作は、任意の変換を実行する前にSpatialTransformationContextを作成することにより、通常の変換で実行できます。

SpatialTransformationContextインスタンスが変換機能内に格納された後、次の例に示すように、このインスタンスを使用して、レコードのジオメトリを取得し、空間操作を適用できます。ここでは、StringレコードのRDDを、キーと値がソース・レコードのIDおよびバッファ済ジオメトリに対応しているペアRDDに変換しています。

Java:

SpatialJavaRDD<String> spatialRDD = SpatialJavaRDD.fromJavaRDD(rdd, new CSVRecordInfoProvider(srid), String.class);
SpatialTransformationContext stCtx = spatialRDD.createSpatialTransformationContext();
JavaPairRDD<String, JGeometry> bufferedRDD = spatialRDD.mapToPair(
(record) -> {
SparkRecordInfo recordInfo = stCtx.getRecordInfo(record);
String id = (String) recordInfo.getField(“id”)
JGeometry geom. = recordInfo.getGeometry(record);
JGeometry buffer = geom.buffer(0.5);
return new Tuple2(id, buffer);
}, soc);

Scala:

val spatialRDD: SpatialRDD[String]= SpatialRDD.fromRDD(rdd, new CSVRecordInfoProvider(srid))
val stCtx: SpatialTransformationContext[String] = spatialRDD.createSpatialTransformationContext()
val bufferedRDD: RDD[(String, JGeometry)] = spatialRDD.map(
record => {
val recordInfo: SparkRecordInfo = stCtx.getRecordInfo(record)
val id: String = recordInfo.getField(“id”).asInstanceOf[String]
val geom: JGeometry = recordInfo.getGeometry(record)
val buffer: JGeometry = geom.buffer(0.5)
(id, buffer)
}, soc)

2.10.3 空間アクション(MBRおよびNearestNeighbors)

空間RDD、空間ペアRDDおよび分散空間索引には、次の空間アクションが用意されています。

- MBR: RDDの最小外接矩形(MBR)を計算します。MBRは1回のみ計算され、2回目に呼び出されたときに再計算されないようにキャッシュされます。次の例は、空間RDDからMBRを取得する方法を示します。(この変換は、DistributedSpatialIndexに対しては使用できません。)
Java:

doubl[] mbr = spatialRDD.getMBR();

Scala:

val mbr: Array[Double] = spatialRDD.getMBR()

- NearestNeighbors: K最近要素が含まれるリストをRDDまたは分散空間索引から特定のジオメトリに返します。また、ユーザー定義のフィルタ・ラムダ機能を渡すことにより、フィルタを渡すレコードのみをK最近傍リストの一部となる候補にすることができます。次の例は、特定のポイントの最も地階5つのレコードを取得する方法を示します。
Java:

JGeometry qryWindow = JGeometry.createPoint(new double[] { 2.0, 1.0 }, 2, srid));
SpatialOperationConfig soc = new SpatialOperationConfig(SpatialOperation.None, qryWindow, 0.05);
List<SparkRecordInfo> nearestNeighbors = spatialRDD.nearestNeighbors(
(record)->{
return ((Integer)record.getField(“followers_count”))>1000;
}, 5, soc);

Scala:

val qryWindow: JGeometry = JGeometry.createPoint(Array(2.0, 1.0 ), 2, srid))
val soc: SpatialOperationConfig = new SpatialOperationConfig(SpatialOperation.None, qryWindow, 0.05)
val nearestNeighbors: Seq[SparkRecordInfo] = spatialRDD.nearestNeighbors(
record=>{ record.getField(“followers_count”).asInstanceOf[Int]>1000 }, 5, soc);

2.10.4 空間RDDの空間索引付け

空間RDDを空間的に索引付けすることにより、空間変換の実行時に空間検索を加速できます。

空間索引によって空間RDDを再パーティション化することにより、各パーティションの特定の領域にのみレコードが含まれるようにすることができます。これにより、空間検索に結果が含まれないパーティションを簡単に破棄できるため、検索が高速になります。

空間索引はJava抽象クラスoracle.spatial.spark.vector.index.DistributedSpatialIndexまたはそのScalaの同等クラスoracle.spatial.spark.vector.scala.index.DistributedSpatialIndexを介して作成されます。これらでは両方とも、実際の空間索引を作成するために特定の実装が使用されます。次の例は、QuadTreeベースの空間索引実装を使用して空間索引を作成する方法を示します。

Java:

DistributedSpatialIndex<String> index = DistributedSpatialIndex.createIndex(sparkContext, spatialRDD1, new QuadTreeConfiguration());

Scala:

val index: DistributedSpatialIndex[String] = DistributedSpatialIndex.createIndex(spatialRDD1, new QuadTreeConfiguration())(sparkContext)

空間索引実装のタイプは、oracle.spatial.spark.vector.index.SpatialPartitioningConfigurationのサブセットである最後のパラメータによって決まります。索引実装によっては、構成パラメータがパーティション化および索引付けのために異なる設定を受け入れる場合があります。現在、空間索引の唯一の実装はクラスoracle.spatial.spark.vector.index.quadtree.QuadTreeDistIndexであり、このクラスは、タイプoracle.spatial.spark.vector.index.quadtree.QuadTreeConfigurationの構成を受け取ります。

DistributedSpatialIndexクラスは現在、「空間の変換」で説明されているfilter、flatMap、joinおよびnearestNeighbors変換をサポートしています。

空間索引は、既存のSparkContextおよび索引の格納先のパスを使用するメソッドDistributedSpatialIndex.save()を使用して永続化できます。このパスは、ローカル・ファイル・システムである場合や分散(HDFS)ファイル・システムである場合があります。同様に、永続化された空間索引は、こちらも既存のSparkContextおよび索引の格納先のパスを使用するメソッドDistributedSpatialIndex.load()を使用して呼び出すことにより、ロードできます。

- 空間RDDの空間のパーティション化

- 空間RDDのローカル空間索引付け

2.10.4.1 空間RDDの空間のパーティション化

空間RDDは、クラスoracle.spatial.spark.vector.index.SpatialPartitioningの実装を介してパーティション化できます。SpatialPartitioningクラスは、空間RDDを、キーが空間パーティションを指し示している空間的にパーティション化されたペアRDDに変換する空間のパーティション化アルゴリズムを表します。

SpatialPartitioningアルゴリズムは空間索引によって内部的に使用されるか、具象クラスを作成することによって直接使用することもできます。現在、oracle.spatial.spark.vector.index.quadtree.QuadTreePartitioningと呼ばれるQuadTreeベースの実装があります。次の例は、空間RDDを空間的にパーティション化する方法を示します。

QuadTreePartitioning<T> partitioning = new QuadTreePartitioning<>(sparkContext, spatialRDD, new QuadTreeConfiguration());
SpatialJavaPairRDD<PartitionKey, T> partRDD = partitioning.getPartitionedRDD();

2.10.4.2 空間RDDのローカル空間索引付け

ローカル空間索引は、空間RDDのパーティションごとに作成できます。各パターンのコンテンツをローカルにパーティション化すると、パーティションベースで作業するときに空間の検索効率が上がります。

ローカル索引をパーティションごとに作成するには、分散空間索引の作成時にパラメータuseLocalIndexをtrueに設定します。空間的にパーティション化されたRDDは、ユーティリティ・メソッドoracle.spatial.spark.vector.index.local.LocalIndex.createLocallyIndexedRDD(SpatialJavaPairRDD<PartitionKey, T> rdd)を呼び出すことによって各パーティションがローカルに索引付けされるよう変換することもできます。

2.10.5 入力形式のサポート

Spark Vector APIには、GeoJSONおよびShapefile形式のデータ・セット用のSparkRecordInfoProviderの実装が用意されています。関連形式のデータ・セットは、Hadoop用のVector APIに用意されている既存のInputFormatクラスを使用して読み取ることができます。詳細は、「GeoJSONおよびShapefile形式のサポート」を参照してください。

JSONおよびShapefile形式のSparkRecordInfoProvider実装は、getRecordInfo()の呼出し時にジオメトリ・フィールドに加えてフィールドを含めるよう構成できます。次の例は、国および州フィールドが含まれるSparkRecordInfoインスタンスが返されるようShapeFileRecordInfoProviderを構成します。

//create an RDD from an existing shape file
JavaPairRDD<LongWritable, MapWritable> shapeFileRDD = sparkContext.hadoopRDD(jobConf, ShapeFileInputFormat.class, LongWritable.class, MapWritable.class);
//list of fields to be included in the SparkRecordInfo filled by the SparkRecordInfoProvider implementation
List<String> attributes = new ArrayList<String>();
attributes.add("country");
attributes.add("province");
//create a ShapeFileRecordInfoProvider
ShapeFileRecordInfoProvider recordInfoProvider = new ShapeFileRecordInfoProvider(attributes, 8307);
//create a spatial RDD
SpatialJavaRDD<SparkRecordInfo> spatialRDD = SpatialJavaRDD.fromJavaRDD(shapeFileRDD.values(), recordInfoProvider);

2.10.6 空間Spark SQL API

空間Spark SQL APIは、任意の形式の空間情報が含まれるSpark SQL DataFrameオブジェクトをサポートします。

Oracle Big Data Spatial Vector Hive Analysis (Oracle Big Data Spatial Vector Hive Analysis)は、Spark SQLとともに使用できます。

例2-2 ツイートを問い合せるための空間DataFrameの作成

次の例では、空間RDDを使用してデータがロードされる場合、関数SpatialJavaRDD.createSpatialDataFrameを使用してDataFrameを作成できます。

//create HiveContext
HiveContext sqlContext = new HiveContext(sparkContext.sc());
//get the spatial DataFrame from the SpatialRDD
//the geometries are in GeoJSON format
DataFrame spatialDataFrame = spatialRDD.createSpatialDataFrame(sqlContext, properties);
// Register the DataFrame as a table.
spatialDataFrame.registerTempTable("tweets");
//register UDFs
sqlContext.sql("create temporary function ST_Polygon as 'oracle.spatial.hadoop.vector.hive.ST_Polygon'");
sqlContext.sql("create temporary function ST_Point as 'oracle.spatial.hadoop.vector.hive.ST_Point'");
sqlContext.sql("create temporary function ST_Contains as 'oracle.spatial.hadoop.vector.hive.function.ST_Contains'");
// SQL can be run over RDDs that have been registered as tables.
StringBuffer query = new StringBuffer();
query.append("SELECT geometry, friends_count, location, followers_count FROM tweets ");
query.append("WHERE ST_Contains( ");
query.append("    ST_Polygon('{\"type\": \"Polygon\",\"coordinates\": [[[-106, 25], [-106, 30], [-104, 30], [-104, 25], [-106, 25]]]}', 8307) ");
query.append("    , ST_Point(geometry, 8307) ");
query.append("    , 0.05)");
query.append("    and followers_count > 50");
DataFrame results = sqlContext.sql(query.toString());
//Filter the tweets in a query window (somewhere in the north of Mexico)
//and with more than 50 followers.
//Note that since the geometries are in GeoJSON format it is possible to create the ST_Point like
//ST_Point(geometry, 8307)
//instead of
//ST_Point(geometry, 'oracle.spatial.hadoop.vector.hive.json.GeoJsonHiveRecordInfoProvider')
List<String> filteredTweets = results.javaRDD().map(new Function<Row, String>() {
public String call(Row row) {
StringBuffer sb = new StringBuffer();
sb.append("Geometry: ");
sb.append(row.getString(0));

sb.append("\nFriends count: ");
sb.append(row.getString(1));
sb.append("\nLocation: ");
sb.append(row.getString(2));
sb.append("\nFollowers count: ");
sb.append(row.getString(3));
return sb.toString();
}
}).collect();
//print the filtered tweets
filteredTweets.forEach(tweet -> System.out.println("Tweet: "+tweet));

2.10.7 空間RDDのJDBCデータ・ソース

Oracle Databaseデータは、Spark Vector Analysis APIを使用して空間RDDのデータ・ソースとして使用できます。

クラスoracle.spatial.spark.vector.util.JDBCUtils (またはScala用のoracle.spatial.spark.vector.scala.util.JDBCUtils)には、Oracleデータベース表またはOracleデータベースに対するSQL問合せから空間RDDを作成するための便利なメソッドが用意されています。表またはSQL問合せには、空間RDDを作成するためにタイプSDO_GEOMETRYの列が1つ含まれる必要があります。

表からのメソッド・バージョンおよび問合せからのメソッド・バージョンでは両方とも、Oracleデータベースへの接続が必要であり、この接続は、テンプレートoracle.spatial.spark.vector.util.ConnectionSupplier (またはScala用のoracle.spatial.spark.vector.scala.util.ConnectionSupler)によって定義されるラムダ機能によって提供されます。

この結果として生成される空間RDDタイプのパラメータは常にSparkRecordInfoになります。つまり、結果として生成されるRDDには、タイプSparkRecordInfoのレコードが含まれ、これには、SQL問合せのSELECTセクション内の表または列を問い合せるときに指定されるフィールドが含まれます。デフォルトでは、取得される列の名前およびタイプはResultSetメタデータを使用して推測されます。ただし、SparkRecordInfoProviderの実装を提供することにより、取得されるフィールドの名前付けおよびタイプを制御できます

次の例は、表とSQL問合せのそれぞれから空間RDDを作成する方法を示します。

例2-3 データベース表からの空間RDDの作成

SpatialJavaRDD<SparkRecordInfoProvider> jdbcSpatialRDD = JDBCUtils.createSpatialRDDFromTable(
sparkContext, //spark context
()->{
Class.forName("oracle.jdbc.driver.OracleDriver");
return new DriverManager.getConnection(connURL, usr, pwd);
}, //DB connection supplier lambda
“VEHICLES”, //DB table
Arrays.asList(new String[]{"ID","DESC","LOCATION"}), //list of fields to retrieve
null //SparkRecordInfoProvider<ResultSet, SparkRecordIngo> (optional)
);

例2-4 データベースに対するSQL問合せからの空間RDDの作成

SpatialJavaRDD<SparkRecordInfoProvider> jdbcSpatialRDD = JDBCUtils.createSpatialRDDFromQuery(
sparkContext, //spark context
()->{
Class.forName("oracle.jdbc.driver.OracleDriver");
return new DriverManager.getConnection(connURL, usr, pwd);
}, //DB connection supplier lambda
“SELECT * FROM VEHICLES WHERE category > 5”, //SQL query
null //SparkRecordInfoProvider<ResultSet, SparkRecordIngo> (optional)
);

前の例では、Oracleデータベースからのデータを問い合せてパーティション化することにより、Spark RDDを作成しています。パーティションの数およびサイズは、Spark Vector Analysis APIによって自動的に決定されます。

この数をパラメータとして使用するメソッド・オーバーロードを呼び出すことにより、Sparkパーティションに含めるデータベース行の目的の数を指定することもできます。パーティションごとの行数を手動で指定すると、空間RDDの作成のパフォーマンスを向上させることができます。

2.11 Oracle Big Data Spatial Vector Hive Analysis

Oracle Big Data Spatial Vector Hive Analysisには、Hiveを使用してデータを分析するために空間関数が用意されています。

空間データは、サポートされている任意のHive形式にすることができます。また、高速処理を目的としてJava分析API (「空間の索引付け」を参照)を使用して作成された空間索引を使用することもできます。

サポートされている機能は次のとおりです。

- Hive Spatial APIの使用

- Hive内の空間索引の使用

これらの機能の実装の詳細は、HiveRecordInfoProviderも参照してください。

Hive空間関数には、使用可能な機能に関する参照情報が用意されています。

前提条件ライブラリ

Spatial Vector Hive Analysis APIには、次のライブラリが必要です。

- sdohadoop-vector-hive.jar

- sdohadoop-vector.jar

- sdoutil.jar

- sdoapi.jar

- ojdbc.jar

- HiveRecordInfoProvider

- Hive Spatial APIの使用

- Hive内の空間索引の使用

2.11.1 HiveRecordInfoProvider

Hive表内のレコードには、JSON、WKTまたはユーザー指定形式などの任意の形式のジオメトリ・フィールドが含まれる場合があります。ST_Geometryなどのジオメトリ・コンストラクタにより、ジオメトリのGeoJSON、WKTまたはWKB表現を受け取るジオメトリ作成できます。ジオメトリが別の形式で格納されている場合、HiveRecordInfoProviderを使用できます。

HiveRecordInfoProviderは、ジオメトリ・フィールド表現を解釈し、ジオメトリをGeoJSON形式で返すコンポーネントです。

返されたジオメトリには、次の形式例のように、ジオメトリSRIDが含まれる必要があります。

{"type":<geometry-type", "crs": {"type": "name", "properties": {"name": "EPSG:4326"}}"coordinates":[c1,c2,....cn]}

HiveRecordInfoProviderインタフェースには、次のメソッドがあります。

- void setCurrentRecord(Object record)

- String getGeometry()

メソッドsetCurrentRecord()は、Hiveでのジオメトリの作成時に提供された現在のジオメトリ・フィールドを渡すことによって呼び出されます。この際、レコードに空間情報がない場合にジオメトリを取得するかnullを返すためにHiveRecordInfoProviderが使用されます。

HiveRecordInfoProviderによって返される情報は、ジオメトリを作成するためにHive空間関数によって使用されます(「Hive空間関数」を参照)。

サンプルHiveRecordInfoProvider実装

SimpleHiveRecordInfoProviderという名前のこのサンプル実装は、JSON形式のテキスト・レコードを使用します。サンプル入力レコードは、次のとおりです。

{"longitude":-71.46, "latitude":42.35}

SimpeHiveRecordInfoProviderがインスタンス化されると、JSON ObjectMapperが作成されます。ObjectMapperは、後でsetCurrentRecord()が呼び出されるときのレコード値の解析に使用されます。ジオメトリは緯度/経度ペアとして表現され、JsonUtils.readGeometry()メソッドによる点ジオメトリの作成に使用されます。この場合、返されるGeoJSON形式がGeoJsonGen.asGeometry()を使用して作成され、SRIDがJsonUtils.addSRIDToGeoJSON()を使用してGeoJSONに追加されます。

public class SimpleHiveRecordInfoProvider implements HiveRecordInfoProvider{
private static final Log LOG =
LogFactory.getLog(SimpleHiveRecordInfoProvider.class.getName());

private JsonNode recordNode = null;
private ObjectMapper jsonMapper = null;

public SimpleHiveRecordInfoProvider(){
jsonMapper = new ObjectMapper();
}

@Override
public void setCurrentRecord(Object record) throws Exception {
try{
if(record != null){
//parse the current value
recordNode = jsonMapper.readTree(record.toString());
}
}catch(Exception ex){
recordNode = null;
LOG.warn("Problem reading JSON record
value:"+record.toString(), ex);
}
}

@Override
public String getGeometry() {
if(recordNode == null){
return null;
}

JGeometry geom = null;

try{
geom = JsonUtils.readGeometry(recordNode,
2, //dimensions
8307 //SRID
);
}catch(Exception ex){
recordNode = null;
LOG.warn("Problem reading JSON record
geometry:"+recordNode.toString(), ex);
}

if(geom != null){
StringBuilder res = new StringBuilder();
//Get a GeoJSON representation of the JGeometry
GeoJsonGen.asGeometry(geom, res);
String result = res.toString();
//add SRID to GeoJSON and return the result
return JsonUtils.addSRIDToGeoJSON(result, 8307);
}

return null;
}
}

2.11.2 Hive Spatial APIの使用

Hive Spatial APIは、1つ以上のジオメトリを使用してジオメトリを作成したり操作を実行したりするために使用できるOracle提供のHiveユーザー定義関数で構成されています。

これらの関数は、タイプ、単一のジオメトリ、2つのジオメトリという論理カテゴリにグループ化できます。(Hive空間関数は、各カテゴリ内の関数をリストし、各関数に関する参照情報を提供します。)

例2-5 Hiveスクリプト

次のスクリプトの例は、指定した地勢ポリゴン内におり、50人を超えるフォロワがいるデータ・セット内のTwitterユーザーに関する情報を返します。次の内容を実行します。

1. 必要なjarファイルを追加します。

add jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/ojdbc8.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdoutl.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdoapi.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdohadoop-vector.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdohadoop-vector-hive.jar;

2. 使用対象のHiveユーザー定義機能を作成します。

create temporary function ST_Point as 'oracle.spatial.hadoop.vector.hive.ST_Point';
create temporary function ST_Polygon as 'oracle.spatial.hadoop.vector.hive.ST_Polygon';
create temporary function ST_Contains as 'oracle.spatial.hadoop.vector.hive.function.ST_Contains';

3. HDFSディレクトリ/user/oracle/twitterの下にあるファイルに基づいてHive表を作成します。この場合に使用されるInputFormatはoracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormatであり、Hive SerDeはユーザー定義のSerDe oracle.spatial.hadoop.vector.hive.json.GeoJsonSerDeです。

CREATE EXTERNAL TABLE IF NOT EXISTS sample_tweets (id STRING, geometry STRING, followers_count STRING, friends_count STRING, location STRING)
ROW FORMAT SERDE 'oracle.spatial.hadoop.vector.hive.json.GeoJsonSerDe'
STORED AS INPUTFORMAT 'oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '/user/oracle/twitter';

4. ST_Polygon問合せ領域およびST_Pointツイート・ジオメトリを受け取り、空間操作の許容差値として0.5を使用する空間問合せを実行します。出力は、50人を超えるフォロワがいる問合せ領域内のTwitterユーザーに関する情報になります。

SELECT id, followers_count, friends_count, location FROM sample_tweets
WHERE ST_Contains(
ST_Polygon(
'{"type": "Polygon",
"coordinates":
[[[-106, 25],[-106, 30], [-104, 30], [-104, 25], [-106, 25]]]}',
8307
),
ST_Point(geometry, 8307),
0.5
)
and followers_count > 50;

完全なスクリプトは、次のとおりです。

add jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/ojdbc8.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdoutl.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdoapi.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdohadoop-vector.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdohadoop-vector-hive.jar;

create temporary function ST_Point as 'oracle.spatial.hadoop.vector.hive.ST_Point';
create temporary function ST_Polygon as 'oracle.spatial.hadoop.vector.hive.ST_Polygon';
create temporary function ST_Contains as 'oracle.spatial.hadoop.vector.hive.function.ST_Contains';

CREATE EXTERNAL TABLE IF NOT EXISTS sample_tweets (id STRING, geometry STRING, followers_count STRING, friends_count STRING, location STRING)
ROW FORMAT SERDE 'oracle.spatial.hadoop.vector.hive.json.GeoJsonSerDe'
STORED AS INPUTFORMAT 'oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '/user/oracle/twitter';

SELECT id, followers_count, friends_count, location FROM sample_tweets
WHERE
ST_Contains(
ST_Polygon(
'{"type": "Polygon",
"coordinates":
[[[-106, 25],[-106, 30], [-104, 30], [-104, 25], [-106, 25]]]}',
8307
),
ST_Point(geometry, 8307),
0.5
)
and followers_count > 50;

2.11.3 Hive内の空間索引の使用

Hive空間問合せでは、前に作成した空間索引を使用できますが、これは、Java API (「空間の索引付け」を参照)を使用して作成できます。

元のデータにアクセスするAPI関数内の索引を使用する必要がない場合、oracle.spatial.hadoop.vector.mapred.job.SpatialIndexingを呼び出すときにisMapFileIndex=falseを指定するか、関数setMapFileIndex(false)を使用できます。これらの場合、索引の構造は次のようになります。

HDFSIndexDirectory/part-xxxxx

これらの場合、Hive表を作成するときに、索引を作成したフォルダを提供してください。

元のデータに関係する必要がある場合に、パラメータisMapFileIndex=falseを設定していない場合、索引構造は次のようになります。

part-xxxxx
data
index

このような場合、Hive表を作成するには、索引のデータ・ファイルが必要です。dataファイルを新しいHDFSフォルダにコピーしますが、この場合、各データ・ファイルがdata1やdata2などの異なる名前を持つようにします。この新しいフォルダがHive表の作成に使用されます。

索引には、ジオメトリ・レコードおよび追加フィールドが含まれます。このデータは、Hive表の作成時に使用できます。

(「空間の索引付けクラスの構造」では、索引構造が説明されており、「RecordInfoProvider」には、追加フィールドを追加するRecordInfoProviderの例が用意されています。)

索引の読み取りには、InputFormat oracle.spatial.hadoop.vector.mapred.input.SpatialIndexTextInputFormatが使用されます。このInputFormatの出力はGeoJSONです。

任意の問合せを実行する前に、SpatialIndexTextInputFormatを使用して最初のデータ・フィルタ処理を実行する最小外接矩形(MBR)を指定できます。

例2-6 空間索引を使用したHiveスクリプト

次のスクリプトの例は、指定した地勢ポリゴン内におり、50人を超えるフォロワがいるデータ・セット内のTwitterユーザーに関する情報を返します。次の内容を実行します。

1. 必要なjarファイルを追加します。

add jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/ojdbc8.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdoutl.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdoapi.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdohadoop-vector.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdohadoop-vector-hive.jar;

2. 使用対象のHiveユーザー定義機能を作成します。

create temporary function ST_Point as 'oracle.spatial.hadoop.vector.hive.ST_Point';
create temporary function ST_Polygon as 'oracle.spatial.hadoop.vector.hive.ST_Polygon';
create temporary function ST_Contains as 'oracle.spatial.hadoop.vector.hive.function.ST_Contains';

3. データの最大および最小の境界(dim1Min,dim2Min,dim1Max,dim2Max)を設定します。

set oracle.spatial.boundaries=-180,-90,180,90;

4. 表の作成に含まれる空間索引に含まれる追加フィールドを設定します。

set oracle.spatial.index.includedExtraFields=followers_count,friends_count,location;

5. HDFSディレクトリ/user/oracle/twitterの下にあるファイルに基づいてHive表を作成します。この場合に使用されるInputFormatはoracle.spatial.hadoop.vector.mapred.input.SpatialIndexTextInputFormatであり、Hive SerDeはユーザー定義のSerDe oracle.spatial.hadoop.vector.hive.json.GeoJsonSerDeです。(oracle.spatial.hadoop.vector.hive.json.GeoJsonSerDeのコードは、Hiveの例に含まれています。)ツイートのジオメトリは、形式{"longitude":n, "latitude":n}のジオメトリ列に保存されます。

CREATE EXTERNAL TABLE IF NOT EXISTS sample_tweets_index (id STRING, geometry STRING, followers_count STRING, friends_count STRING, location STRING)
ROW FORMAT SERDE 'oracle.spatial.hadoop.vector.hive.json.GeoJsonSerDe'
STORED AS INPUTFORMAT 'oracle.spatial.hadoop.vector.mapred.input.SpatialIndexTextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '/user/oracle/twitter/index';

6. SpatialIndexTextInputFormatでフィルタ処理する最小外接矩形(MBR)を定義します。すべての空間索引がこのMBR内のデータのみにアクセスできます。MBRが指定されていない場合、データ境界が使用されます。パフォーマンスを向上させるにはこの設定をお薦めします。

set oracle.spatial.spatialQueryWindow={"type": "Polygon","coordinates": [[[-107, 24], [-107, 31], [-103, 31], [-103, 24], [-107, 24]]]};

7. ST_Polygon問合せ領域およびST_Pointツイート・ジオメトリを受け取り、空間操作の許容差値として0.5を使用する空間問合せを実行します。ツイート・ジオメトリはGeoJSON形式であり、ST_Point関数はSRIDを8307として指定して使用されます。出力は、50人を超えるフォロワがいる問合せ領域内のTwitterユーザーに関する情報になります。

SELECT id, followers_count, friends_count, location FROM sample_tweets
WHERE ST_Contains(
ST_Polygon('{"type": "Polygon","coordinates": [[[-106, 25], [-106, 30], [-104, 30], [-104, 25], [-106, 25]]]}', 8307)
, ST_Point(geometry, 8307)
, 0.5)
and followers_count > 50;

完全なスクリプトは、次のとおりです。(このスクリプトと「Hive Spatial APIの使用」内のスクリプトの差異は太字でマークされていますが、すべての手順は前のリストで説明されています。)

add jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/ojdbc8.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdoutl.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdoapi.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdohadoop-vector.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdohadoop-vector-hive.jar;

create temporary function ST_Polygon as 'oracle.spatial.hadoop.vector.hive.ST_Polygon';
create temporary function ST_Point as 'oracle.spatial.hadoop.vector.hive.ST_Point';
create temporary function ST_Contains as 'oracle.spatial.hadoop.vector.hive.function.ST_Contains';

set oracle.spatial.boundaries=-180,-90,180,90;
set oracle.spatial.index.includedExtraFields=followers_count,friends_count,location;

CREATE EXTERNAL TABLE IF NOT EXISTS sample_tweets_index (id STRING, geometry STRING, followers_count STRING, friends_count STRING, location STRING)
ROW FORMAT SERDE 'oracle.spatial.hadoop.vector.hive.json.GeoJsonSerDe'
STORED AS INPUTFORMAT 'oracle.spatial.hadoop.vector.mapred.input.SpatialIndexTextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '/user/oracle/twitter/index';

set oracle.spatial.spatialQueryWindow={"type": "Polygon","coordinates": [[[-107, 24], [-107, 31], [-103, 31], [-103, 24], [-107, 24]]]};

SELECT id, followers_count, friends_count, location FROM sample_tweets
WHERE ST_Contains(
ST_Polygon('{"type": "Polygon","coordinates": [[[-106, 25], [-106, 30], [-104, 30], [-104, 25], [-106, 25]]]}', 8307)
, ST_Point(geometry, 8307)
, 0.5)
and followers_count > 50;

2.12 Oracle Big Data SpatialViewer Webアプリケーションの使用

Oracle Big Data SpatialViewer Webアプリケーション(SpatialViewer)を使用すると、様々なタスクを実行できます。

これらには、空間の索引付け、テーマ・マップの作成と表示、HDFSへのラスターのロード、アップロードしたラスターの地球での視覚化、個別または複数の足跡の選択、ラスター代数演算の実行、ギャップと重複の処理、選択した足跡の結合、選択した足跡からの指定したファイル形式での新しいイメージの生成、およびユーザー固有の処理の適用に関連するタスクが含まれます。

- SpatialViewerを使用したHadoop空間索引の作成

- Hadoop索引付き空間データの検索

- SpatialViewerを使用したSpark空間索引の作成

- Spark索引付き空間データの検索

- SpatialViewerを使用したカテゴリ化ジョブの実行

- カテゴリ化結果の表示

- ファイルへのカテゴリ化結果の保存

- テンプレートの作成および削除

- テンプレートの構成

- SpatialViewerを使用したクラスタ化ジョブの実行

- クラスタ化結果の表示

- ファイルへのクラスタ化結果の保存

- SpatialViewerを使用したビニング・ジョブの実行

- ビニング結果の表示

- ファイルへのビニング結果の保存

- コマンドラインを使用した索引作成ジョブの実行

- カテゴリ化結果を作成するジョブの実行

- クラスタ化結果を作成するジョブの実行

- ビニング結果を作成するジョブの実行

- 空間をフィルタ処理するジョブの実行

- 場所の提案を取得ジョブの実行

- 空間結合を実行するジョブの実行

- パーティション化を実行するジョブの実行

- 複数の入力の使用

- ローカル・サーバーからHDFS Hadoopクラスタへのイメージのロード

- 地球でのラスターの視覚化

- 単一のラスターまたは同じMBRを持つ複数のラスターの処理

- 地球からのモザイクの直接作成

- ラスター処理に対する演算の追加

- 地球からの傾斜イメージの直接作成

- 地球からのイメージ・ファイル形式の変更

2.12.1 SpatialViewerを使用したHadoop空間索引の作成

SpatialViewerを使用してHadoop空間索引を作成するには、次の手順に従います。

1. コンソールhttp://<oracle_big_data_spatial_vector_console>:8045/spatialviewer/?root=vectorを開きます

2. 「Spatial Index」をクリックします。

3. 必要な詳細をすべて指定します。

a. 索引名。

b. HDFSの索引へのファイルのパス。例: /user/oracle/bdsg/tweets.json。

c. 新しい索引パス: これはジョブ出力パスです。例: /user/oracle/bdsg/index。

d. 索引付けするジオメトリのSRID。例: 8307

e. 索引付けするジオメトリの許容差。例: 0.05

f. 入力形式クラス: 入力形式のクラス。例: oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat

g. レコード情報プロバイダ・クラス: 空間情報を提供するクラス。例: oracle.spatial.hadoop.vector.geojson.GeoJsonRecordInfoProvider。

注意:

InputFormatクラスまたはRecordInfoProviderクラスがAPI、またはHadoop APIクラスにない場合、ユーザー定義クラスのJARが提供されます。このjarを使用するには、/opt/oracle/oracle-spatial-graph/spatial/web-server/spatialviewer/WEB-INF/libディレクトリに追加し、サーバーを再起動する必要があります。

h. エンリッチメント・サービス(MVSuggest)を使用する必要があるかどうか。ジオメトリを場所の文字列から検出する場合は、MVSuggestサービスを使用します。この場合、指定されたRecordInfoProviderがインタフェースoracle.spatial.hadoop.vector.LocalizableRecordInfoProviderを実装する必要があります。

i. MVSuggestテンプレート(オプション): MVSuggestサービスを使用する場合、索引の作成に使用するテンプレートを定義できます。

4. 「Create」をクリックします。
ジョブを追跡するためにURLが表示されます。

2.12.2 Hadoop索引付き空間データの検索

Hadoop索引付き空間データを検索するには、次の手順を実行します。

1. コンソールhttp://<oracle_big_data_spatial_vector_console>:8045/spatialviewer/?root=vectorを開きます

2. 「Explore Data」をクリックします。

たとえば、次のことが可能です。

- 目的の索引付きデータを選択し、矩形ツールを使用して目的の領域内のデータを表示します。

- 背景地図のスタイルを変更します。

- ヒート・マップを使用してデータを表示します。

2.12.3 SpatialViewerを使用したHadoop空間索引の作成

SpatialViewerを使用してSpark空間索引を作成するには、次の手順に従います。

1. コンソールhttp://<oracle_big_data_spatial_vector_console>:8045/spatialviewer/?root=vectorsparkを開きます

2. 「Spatial Index」をクリックします。

3. 必要な詳細をすべて指定します。

a. 索引名。

b. HDFSの索引へのファイルのパス。例: /user/oracle/bdsg/tweets.json。

c. 新しい索引パス: これはジョブ出力パスです。例: /user/oracle/bdsg/index。

d. 索引付けするジオメトリのSRID。例: 8307

e. 索引付けするジオメトリの許容差。例: 0.05

f. 入力形式クラス(オプション): 入力形式のクラス。例: oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat

g. キー・クラス(入力形式クラスが定義されている場合は必須): 入力形式キーのクラス。例: org.apache.hadoop.io.LongWritable

h. 値クラス(入力形式クラスが定義されている場合は必須): 入力形式値のクラス。例: org.apache.hadoop.io.Text

i. レコード情報プロバイダ・クラス: 空間情報を提供するクラス。例: oracle.spatial.spark.vector.recordinfoprovider.GeoJsonRecordInfoProvider

注意:

InputFormatクラスまたはRecordInfoProviderクラスがAPI、またはHadoop APIクラスにない場合、ユーザー定義クラスのJARが提供されます。このjarを使用するには、/opt/oracle/oracle-spatial-graph/spatial/web-server/spatialviewer/WEB-INF/lib directoryに追加し、サーバーを再起動する必要があります。

4. 「Create」をクリックします。
ジョブを追跡するためにURLが表示されます。

2.12.4 Spark索引付き空間データの検索

Spark索引付き空間データを検索するには、次の手順を実行します。

1. コンソールhttp://<oracle_big_data_spatial_vector_console>:8045/spatialviewer/?root=vectorsparkを開きます

2. 「Explore Data」をクリックします。

たとえば、次のことが可能です。

- 目的の索引付きデータを選択し、矩形ツールを使用して目的の領域内のデータを表示します。

- 背景地図のスタイルを変更します。

2.12.5 SpatialViewerを使用したカテゴリ化ジョブの実行

カテゴリ化ジョブは空間索引の有無に関係なく実行できます。次の手順を実行します。

1. http://<oracle_big_data_spatial_vector_console>:8045/spatialviewer/?root=vectorを開きます。

2. 「Categorization」、「Categorization Job」の順にクリックします。

3. 「With Index」または「Without Index」のいずれかを選択し、必要に応じて次の詳細を入力します。

- With Index

a. 索引名

- Without Index

a. データのパス: HDFSデータ・パスを入力します。例: /user/oracle/bdsg/tweets.json。

b. ユーザー・クラスのあるJAR (オプション): InputFormatクラスまたはRecordInfoProviderクラスがAPI、またはHadoop APIクラスにない場合、ユーザー定義クラスのJARが提供されます。このjarを使用するには、/opt/oracle/oracle-spatial-graph/spatial/web-server/spatialviewer/WEB-INF/libディレクトリに追加し、サーバーを再起動する必要があります。

c. 入力形式クラス: 入力形式のクラス。例: oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat

d. レコード情報プロバイダ・クラス: 空間情報を提供するクラス。例: oracle.spatial.hadoop.vector.geojson.GeoJsonRecordInfoProvider。

e. エンリッチメント・サービスMVSuggestを使用する必要があるかどうか。ジオメトリを場所の文字列から検出する場合は、MVSuggestサービスを使用します。この場合、指定されたRecordInfoProviderがインタフェース oracle.spatial.hadoop.vector.LocalizableRecordInfoProviderを実装する必要があります。

f. テンプレート: テーマ・マップを作成するテンプレート。

注意:

テンプレートが点ジオメトリ(都市など)を参照する場合、MVSuggestが使用されていないと、そのテンプレートに空白の結果が返されます。これは、空間操作がポリゴンの結果のみを返すためです。

ヒント:

MVSuggestサービスを使用したとき、結果と一致するすべてのテンプレートが提供されていれば、結果はさらに正確になります。たとえば、データが世界の都市、州、国、大陸部を参照する場合、結果を得るために最適なテンプレートは、「World Continents」、「World Countries」、「World State Provinces」、および「World Cities」になります。また、データがUSAの州および郡の場合、適切なテンプレートは「USA States」および「USA Counties」になります。MVSuggestサービスを使用して作成した索引を選択した場合、最適な結果を得るには最上位の階層を選択します。たとえば、「World Countries」、「World State Provinces」、「World Cities」を使用して作成した場合は、「World Countries」をテンプレートとして使用します。

g. 出力パス: Hadoopジョブ出力パス。例: /user/oracle/bdsg/catoutput

h. 結果名: 結果の名前。同じ名前の結果がテンプレートにある場合は上書きされます。例: Tweets test。

「Create」をクリックします。ジョブを追跡するためにURLが表示されます。

2.12.6 カテゴリ化結果の表示

カテゴリ化結果を表示するには、次の手順を実行します。

1. http://<oracle_big_data_spatial_vector_console>:8045/spatialviewer/?root=vectorを開きます。

2. 「Categorization」、「Results」の順にクリックします。

3. 任意のテンプレートをクリックします。たとえば「World Continents」です。

「World Continents」テンプレートが表示されます。

4. 表示されている結果のいずれかをクリックします。

複数の大陸部が色分けして表示されます。

5. 地図の任意の大陸部をクリックします。たとえば「North America」です。

テンプレートが「World Countries」に変わり、そのフォーカスが国別の結果の「North America」に移ります。

2.12.7 ファイルへのカテゴリ化結果の保存

カテゴリ化結果は、将来可能性があるアップロードや使用に備えてローカル・システム上のファイル(コマンド・ラインから実行されたジョブを使用して作成された結果ファイルなど)に保存できます。テンプレートは、フォルダ/opt/oracle/oracle-spatial-graph/spatial/web-server/spatialviewer/templates内にあります。テンプレートは各種機能を備えたGeoJSONファイルであり、機能にはすべてIDがあります。たとえば、テンプレート「USA States」の最初の機能は{"type":"Feature","_id":"WYOMING",...から始まります。

結果は{"id":"JSONFeatureId","result":result}の形式のJSONファイルになります。

たとえば、テンプレート「USA States」が選択されると、有効な結果は、{"id":"WYOMING","result":3232} {"id":"SOUTH DAKOTA","result":74968}を含むファイルになります

1. 「Categorization」、「Results」の順にクリックします。

2. 「Template」を選択します。

3. 結果を保存するためのアイコンをクリックします。

4. Specify a 「Name」を指定します。

5. 「Choose File」をクリックして「File」の場所を選択します。

6. 「Save」をクリックします。

結果は、SpatialViewerローカル作業ディレクトリ(「Oracle Big Data ApplianceでのSpatialViewerの構成」を参照)に含まれるフォルダclustering_resultsに格納できます。

2.12.8 テンプレートの作成および削除

新しいテンプレートを作成するには、次の手順を実行します。

1. テンプレートJSONファイルをフォルダ/opt/oracle/oracle-spatial-graph/spatial/web-server/spatialviewer/templates/に追加します。

2. テンプレート構成ファイルをフォルダ/opt/oracle/oracle-spatial-graph/spatial/web-server/spatialviewer/templates/_config_に追加します。

テンプレートを削除するには、ステップ1と2で追加したJSONファイルおよび構成ファイルを削除します。

2.12.9 テンプレートの構成

各テンプレートには構成ファイルがあります。テンプレート構成ファイルは、フォルダ/opt/oracle/oracle-spatial-graph/spatial/web-server/spatialviewer/templates/_config_内にあります。構成ファイルの名前は、テンプレート・ファイルと同じ名前に.jsonではなくconfig.jsonを付けたものです。たとえば、テンプレート・ファイルusa_states.jsonの構成ファイル名は usa_states.config.jsonになります。構成パラメータは次のとおりです。

- name: コンソールに表示されるテンプレートの名前。たとえば、name: USA Statesです。

- display_attribute: カテゴリ化結果を表示するとき、カーソルがこのプロパティと機能の結果を表示する機能の上に移動します。たとえば、display_attribute: STATE NAMEです。

- point_geometry: テンプレートに点ジオメトリがある場合はtrue、ポリゴンの場合はfalseです。たとえば、point_geometry: falseです。

- child_templates (オプション): 使用できる複数の子テンプレートをカンマで区切ってリストできるテンプレートです。たとえば、child_templates: ["world_states_provinces, usa_states(properties.COUNTRY CODE:properties.PARENT_REGION)"]です。
子テンプレートがリンク・フィールドを指定しない場合、親の機能にあるすべての機能は子の機能とみなされます。この場合、world_states_provincesはフィールドを指定しません。親と子の間のリンクが指定されている場合、空間関係は適用されず、機能プロパティのリンクがチェックされます。前述の例では、usa_statesとの関係が現在のテンプレートのプロパティCOUNTRY CODEおよびテンプレート・ファイルusa_states.jsonのプロパティPARENT_REGIONで検出されます。

- srid: テンプレートのジオメトリのSRIDです。たとえば、srid: 8307です。

- back_polygon_template_file_name (オプション): 定義済テンプレートを表示するときに、背景として設定されるポリゴン・ジオメトリのあるテンプレートです。たとえば、back_polygon_template_file_name: usa_statesです。

- vectorLayers: MVSuggestサービスに固有の構成です。次に例を示します。

{
"vectorLayers": [
{
"gnidColumns":["_GNID"],
"boostValues":[2.0,1.0,1.0,2.0]
}
]
}

説明:

- gnidColumnsはジオメトリ名IDを示すJsonファイル内の列名です。この値はMVSuggestで複数の言語をサポートする場合に使用されます。(ファイルtemplates/_geonames_/alternateNames.jsonの値の参照を確認してください。)このプロパティのデフォルト値はありません。

- boostValuesは浮動小数点の数値の配列であり、列が指定の行の「プロパティ」値の中にあることの重要性を示します。数値が大きいほど、そのフィールドの重要性も大きくなります。ゼロの値はフィールドが無視されることを意味します。boostValuesがない場合は、すべてのフィールドがデフォルト値の1.0をとり、重要性が同じプロパティであることを示します。MVSuggestサービスは、その値に応じて異なる結果を返します。次のプロパティのあるJsonファイルの場合、boost値は次のようになります。

"properties":{"Name":"New York City","State":"NY","Country":"United States","Country Code":"US","Population":8491079,"Time Zone":"UTC-5"}
"boostValues":[3.0,2.0,1.0,1.0,0.0,0.0]

2.12.10 SpatialViewerを使用したクラスタ化ジョブの実行

SpatialViewerを使用してクラスタ化ジョブを作成するには、次の手順に従います。

1. http://<oracle_big_data_spatial_vector_console>:8045/spatialviewer/?root=vectorを開きます

2. 「Clustering」、「Clustering Job」の順にクリックします。

3. 必要に応じて、次の詳細を指定します。

a. データのパス: HDFSデータ・パスを入力します。例: /user/oracle/bdsg/tweets.json。

b. ジオメトリのSRID。例: 8307

c. ジオメトリの許容差。例: 0.05

d. ユーザー・クラスのあるJAR (オプション): InputFormatクラスまたはRecordInfoProviderクラスがAPI、またはHadoop APIクラスにない場合、ユーザー定義クラスのJARが提供されます。このjarを使用するには、/opt/oracle/oracle-spatial-graph/spatial/web-server/spatialviewer/WEB-INF/libディレクトリに追加し、サーバーを再起動する必要があります。

e. 入力形式クラス: 入力形式のクラス。例: oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat

f. レコード情報プロバイダ・クラス: 空間情報を提供するクラス。例: oracle.spatial.hadoop.vector.geojson.GeoJsonRecordInfoProvider。

g. クラスタの数: 検出されるクラスタの数。

h. 出力パス: Hadoopジョブ出力パス。例: /user/oracle/bdsg/catoutput

i. 結果名: 結果の名前。同じ名前の結果がテンプレートにある場合は上書きされます。たとえば、「Tweets test」などです。

4. 「Create」をクリックします。
ジョブを追跡するためにURLが表示されます。

2.12.11 クラスタ化結果の表示

クラスタ化結果を表示するには、次の手順を実行します。

1. http://<oracle_big_data_spatial_vector_console>:8045/spatialviewer/?root=vectorを開きます。

2. 「Clustering」、「Results」の順にクリックします。

3. 表示されている結果のいずれかをクリックします。

2.12.12 ファイルへのクラスタ化結果の保存

クラスタ化結果は、後でアップロードおよび使用するためにローカル・システム上のファイルに保存できます。クラスタ化結果をファイルに保存するには、次の手順を実行します。

1. http://<oracle_big_data_spatial_vector_console>:8045/spatialviewer/?root=vectorを開きます。

2. 「Clustering」、「Results」の順にクリックします。

3. 結果を保存するためのアイコンをクリックします。

4. 名前を指定します。

5. ジオメトリのSRIDを指定します。例: 8307

6. 「Choose File」をクリックし、ファイルの場所を選択します。

7. 「Save」をクリックします。

2.12.13 SpatialViewerを使用したビニング・ジョブの実行

ビニング・ジョブは空間索引の有無に関係なく実行できます。次の手順を実行します。

1. http://<oracle_big_data_spatial_vector_console>:8045/spatialviewer/?root=vectorを開きます。

2. 「Binning」、「Binning Job」の順にクリックします。

3. 「With Index」または「Without Index」のいずれかを選択し、必要に応じて次の詳細を入力します。

- With Index

a. 索引名

- Without Index

a. データのパス: HDFSデータ・パスを入力します。例: /user/oracle/bdsg/tweets.json

b. ジオメトリのSRID。例: 8307

c. ジオメトリの許容差。例: 0.05

d. ユーザー・クラスのあるJAR (オプション): InputFormatクラスまたはRecordInfoProviderクラスがAPI、またはHadoop APIクラスにない場合、ユーザー定義クラスのJARが提供されます。このjarを使用するには、/opt/oracle/oracle-spatial-graph/spatial/web-server/spatialviewer/WEB-INF/libディレクトリに追加し、サーバーを再起動する必要があります。

e. 入力形式クラス: 入力形式のクラス。例: oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat

f. レコード情報プロバイダ・クラス: 空間情報を提供するクラス。例: oracle.spatial.hadoop.vector.geojson.GeoJsonRecordInfoProvider。

4. ビニングおよび最小外接矩形(MBR)。地図上のMBR表示するためのアイコンをクリックできます。

5. ビニング形状: 六角形(六角形の幅を指定します)または矩形(幅と高さを指定します)。

6. テーマ属性: ジョブに索引が使用される場合、ダブルクリックして使用可能な値を表示します。これらは、索引の作成時に使用されたRecordInfoProviderの関数getExtraFieldsによって返されたものです。ジョブに索引が使用されない場合、フィールドは、指定したRecordInfoProviderクラスの関数getExtraFieldsによって返されるフィールドの1つである場合があります。いずれの場合も、count属性は常に使用可能であり、この属性により、ビン内のレコードの数を指定します。

7. 出力パス: Hadoopジョブ出力パス。例: /user/oracle/bdsg/binningOutput

8. 結果名: 結果の名前。同じ名前の結果がテンプレートにある場合は上書きされます。たとえば、「Tweets test」などです。

「Create」をクリックします。ジョブを追跡するためにURLが表示されます。

2.12.14 ビニング結果の表示

ビニング結果を表示するには、次の手順を実行します。

1. http://<oracle_big_data_spatial_vector_console>:8045/spatialviewer/?root=vectorを開きます。

2. 「Binning」、「Results」の順にクリックします。

3. 表示されている結果のいずれかをクリックします。

2.12.15 ファイルへのビニング結果の保存

ビニング結果は、後でアップロードおよび使用するためにローカル・システム上のファイルに保存できます。ビニング結果をファイルに保存するには、次の手順を実行します。

1. http://<oracle_big_data_spatial_vector_console>:8045/spatialviewer/?root=vectorを開きます。

2. 「Binning」、「View Results」の順にクリックします。

3. 結果を保存するためのアイコンをクリックします。

4. ジオメトリのSRIDを指定します。例: 8307

5. テーマ属性を指定しますが、これは、結果内の機能のプロパティである必要があります。たとえば、カウント属性を使用して、ビン当たりの結果の数に応じて結果を作成できます。

6. 「Choose File」をクリックし、ファイルの場所を選択します。

7. 「Save」をクリックします。

2.12.16 コマンドラインを使用した索引作成ジョブの実行

空間索引を作成するには、次の形式のコマンドを使用します。

hadoop jar <HADOOP_LIB_PATH>/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.SpatialIndexing [generic options] input=<path|comma_separated_paths|path_pattern> output=<path> inputFormat=<InputFormat_subclass> recordInfoProvider=<RecordInfoProvider_subclass> [srid=<integer_value>] [geodetic=<true|false>] [tolerance=<double_value>] [boundaries=<minX,minY,maxX,maxY>] [indexName=<index_name>] [indexMetadataDir=<path>] [overwriteIndexMetadata=<true|false>] [  mvsLocation=<path|URL> [mvsMatchLayers=<comma_separated_layers>][mvsMatchCountry=<country_name>][mvsSpatialResponse=<[NONE, FEATURE_GEOMETRY, FEATURE_CENTROID]>][mvsInterfaceType=<LOCAL, WEB>][mvsIsRepository=<true|false>][rebuildMVSIndex=<true|false>][mvsPersistentLocation=<hdfs_path>][mvsOverwritePersistentLocation=<true|false>] ]

新しいHadoop API形式を使用するには、oracle.spatial.hadoop.vector.mapred.job.SpatialIndexingをoracle.spatial.hadoop.vector.mapreduce.job.SpatialIndexingに置き換えます。

入力/出力引数:

- input : 入力データの場所。これは、パス、カンマ区切りのパスのリスト、または正規表現として表すことができます。

- inputFormat: 入力データを読み取るために使用されるinputFormatクラス実装。

- recordInfoProvider: InputFormatクラスによって読み取られたレコードから情報を抽出するために使用されるrecordInfoProvider実装。

- output: 空間索引の格納先のパス

空間引数:

- srid (オプション、デフォルト=0): 空間データの空間参照システム(座標系) ID。

- geodetic (オプション、デフォルトはSRIDによって異なります): ジオメトリが測地であるかどうかを示すブール値。

- tolerance (オプション、デフォルト=0.0): 空間操作の実行時に使用される許容差を表すdouble値。

- boundaries (オプション、デフォルト=unbounded): minX,minY,maxX,maxYの形式でカンマ区切りの値として表される各次元の最小値および最大値

空間索引メタデータの引数:

- indexName (オプション、デフォルト=出力フォルダ名): 生成対象の索引の名前。

- indexMetadataDir (オプション、デフォルト=hdfs://server:port/user/<current_user>/またはoracle_spatial/index_metadata/): 空間索引メタデータの格納先のディレクトリ。

- overwriteIndexMetadata (オプション、デフォルト=false)同じ名前の索引がすでに存在する場合に索引メタデータを上書きできるかどうかを示すブール引数。

MVSuggest引数:

- mvsLocation: リモート・インスタンスの操作時のサービスURLまたはMVSuggestのローカル・スタンドアロン・インスタンスのMVSuggestディレクトリまたはリポジトリへのパス。この引数は、MVSuggestを操作するときに必要です。

- mvsMatchLayers (オプション、デフォルト=all): カンマ区切りのレイヤーのリスト。指定されている場合、MVSuggestでは、検索の実行時にこれらのレイヤーのみが使用されます。

- mvsMatchCountry (オプション、デフォルト=none): MVSuggestでの照合の実行時により高い優先度が与えられる国名。

- mvsSpatialResponse (オプション、デフォルト=CENTROID): 返された各照合結果に含まれる空間結果のタイプ。使用可能な値は、NONE、FEATURE_GEOMETRY、FEATURE_CENTROIDです。

- mvsInterfaceType (オプション、デフォルト=LOCAL): 使用されるMVSuggestサービスのタイプで、LOCALまたはWEBがあります。

- mvsIsRepository (オプション、デフォルト=false) (LOCALのみ): mvsLocationがMVSディレクトリ全体(false)を指し示すかリポジトリのみ(true)を指し示すかを示すブール値。MVSリポジトリにはJSONテンプレートのみを含めることができます。_config_や_geonames_フォルダが含まれる場合や含まれない場合があります。

- mvsRebuildIndex (オプション、デフォルト=false) (LOCALのみ): リポジトリ索引を再構築する必要があるかどうかを示すブール値。

- mvsPersistentLocation (オプション、デフォルト=none) (LOCALのみ): MVSuggestディレクトリの保存先のHDFSパス。

- mvsIsOverwritePersistentLocation (オプション、デフォルト=false): 既存のmvsPersistentLocationが存在する場合に上書きする必要があるかどうかを示すブール引数。

例: indexExampleと呼ばれる空間索引を作成します。索引メタデータは、HDFSディレクトリspatialMetadataに格納されます。

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop/lib/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.SpatialIndexing input="/user/hdfs/demo_vector/tweets/part*" output=/user/hdfs/demo_vector/tweets/spatial_index inputFormat=oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat recordInfoProvider=oracle.spatial.hadoop.vector.geojson.GeoJsonRecordInfoProvider srid=8307 geodetic=true tolerance=0.5 indexName=indexExample indexMetadataDir=indexMetadataDir overwriteIndexMetadata=true

例: MVSuggestを使用して空間索引を作成し、ジオメトリが含まれないレコードに空間の場所を割り当てます。

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop/lib/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.SpatialIndexing input="/user/hdfs/demo_vector/tweets/part*" output=/user/hdfs/demo_vector/tweets/spatial_index inputFormat=oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat recordInfoProvider=mypackage.Simple LocationRecordInfoProvider srid=8307 geodetic=true tolerance=0.5 indexName=indexExample indexMetadataDir=indexMetadataDir overwriteIndexMetadata=true mvsLocation=file:///local_folder/mvs_dir/oraclemaps_pub/ mvsRepository=true

2.12.17 カテゴリ化結果を作成するジョブの実行

カテゴリ化結果を作成するには、次の形式の1つのコマンドを使用します。

空間索引がある場合

hadoop jar <HADOOP_LIB_PATH >/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.Categorization [generic options] ( indexName=<indexName> [indexMetadataDir=<path>] )  | ( input=<path|comma_separated_paths|path_pattern> isInputIndex=true [srid=<integer_value>] [geodetic=<true|false>] [tolerance=<double_value>] [boundaries=<min_x,min_y,max_x,max_y>]  ) output=<path> hierarchyIndex=<hdfs_hierarchy_index_path> hierarchyInfo=<HierarchyInfo_subclass> [hierarchyDataPaths=<level1_path,level2_path,,levelN_path>] spatialOperation=<[None, IsInside, AnyInteract]>

空間索引がない場合

hadoop jar <HADOOP_LIB_PATH >/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.Categorization [generic options] input=<path|comma_separated_paths|path_pattern> inputFormat=<InputFormat_subclass> recordInfoProvider=<RecordInfoProvider_subclass> [srid=<integer_value>] [geodetic=<true|false>] [tolerance=<double_value>] [boundaries=<min_x,min_y,max_x,max_y>]  output=<path> hierarchyIndex=<hdfs_hierarchy_index_path> hierarchyInfo=<HierarchyInfo_subclass>  hierarchyDataPaths=<level1_path,level2_path,,levelN_path>] spatialOperation=<[None, IsInside, AnyInteract]>

MVSuggestの使用

hadoop jar <HADOOP_LIB_PATH >/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.Categorization [generic options] (indexName=<indexName> [indexMetadataDir=<path>])  |
(
(input=<path|comma_separated_paths|path_pattern> isInputIndex=true)  | (input=<path|comma_separated_paths|path_pattern> inputFormat=<InputFormat_subclass> recordInfoProvider=<LocalizableRecordInfoProvider_subclass>)
[srid=<integer_value>] [geodetic=<true|false>] [tolerance=<double_value>] [boundaries=<min_x,min_y,max_x,max_y>]
) output=<path>
mvsLocation=<path|URL> [mvsMatchLayers=<comma_separated_layers>] [mvsMatchCountry=<country_name>] [mvsSpatialResponse=<[NONE, FEATURE_GEOMETRY, FEATURE_CENTROID]>] [mvsInterfaceType=<[UNDEFINED, LOCAL, WEB]>] [mvsIsRepository=<true|false>] [mvsRebuildIndex=<true|false>] [mvsPersistentLocation=<hdfs_path>] [mvsOverwritePersistentLocation=<true|false>] [mvsMaxRequestRecords=<integer_number>]  hierarchyIndex=<hdfs_hierarchy_index_path> hierarchyInfo=<HierarchyInfo_subclass>

新しいHadoop API形式を使用するには、oracle.spatial.hadoop.vector.mapred.job.Categorizationをoracle.spatial.hadoop.vector.mapreduce.job.Categorizationに置き換えます。

入力/出力引数:

- indexName: 既存の空間索引の名前。索引情報は、indexMetadataDirによって示されるパスで参照します。使用されている場合、引数inputは無視されます。

- indexMetadataDir (オプション、デフォルト=hdfs://server:port/user/<current_user>/oracle_spatial/index_metadata/): 空間索引メタデータの格納先のディレクトリ

- input : 入力データの場所。これは、パス、カンマ区切りのパスのリスト、または正規表現として表すことができます。(indexNameが指定されている場合は無視されます。)

- inputFormat: 入力データを読み取るために使用されるinputFormatクラス実装。(indexNameが指定されている場合は無視されます。)

- recordInfoProvider: InputFormatクラスによって読み取られたレコードから情報を抽出するために使用されるrecordInfoProvider実装。(indexNameが指定されている場合は無視されます。)

- output: 空間索引の格納先のパス

空間引数:

- srid (オプション、デフォルト=0): 空間データの空間参照システム(座標系) ID。

- geodetic (オプション、デフォルトはSRIDによって異なります): ジオメトリが測地であるかどうかを示すブール値。

- tolerance (オプション、デフォルト=0.0): 空間操作の実行時に使用される許容差を表すdouble値。

- boundaries (オプション、デフォルト=unbounded): minX,minY,maxX,maxYの形式でカンマ区切りの値として表される各次元の最小値および最大値

- spatialOperation: 入力データ・セットと階層データ・セットの間で実行する空間操作。使用可能な値は、IsInsideおよびAnyInteractです。

階層データ・セットの引数:

- hierarchyIndex: 既存の階層索引のHDFSパス、または階層索引を生成する必要がある場合に階層索引を格納できるHDFSパス。

- hierarchyInfo: 階層データを記述するために使用されるHierarchyInfoサブクラスの完全修飾名。

- hierarchyDataPaths (オプション、デフォルト=none): 階層データのパスのカンマ区切りのリスト。これらのパスは、階層レベル別に昇順でソートする必要があります。特定の階層データの階層索引パスが存在しない場合、この引数が必要です。

MVSuggest引数:

- mvsLocation: リモート・インスタンスの操作時のサービスURLまたはMVSuggestのローカル・スタンドアロン・インスタンスのMVSuggestディレクトリまたはリポジトリへのパス。この引数は、MVSuggestを操作するときに必要です。

- mvsMatchLayers (オプション、デフォルト=all): カンマ区切りのレイヤーのリスト。指定されている場合、MVSuggestでは、検索の実行時にこれらのレイヤーのみが使用されます。

- mvsMatchCountry (オプション、デフォルト=none): MVSuggestでの照合の実行時により高い優先度が与えられる国名。

- mvsSpatialResponse (オプション、デフォルト=CENTROID): 返された各照合結果に含まれる空間結果のタイプ。使用可能な値は、NONE、FEATURE_GEOMETRY、FEATURE_CENTROIDです。

- mvsInterfaceType (オプション、デフォルト=LOCAL): 使用されるMVSuggestサービスのタイプで、LOCALまたはWEBがあります。

- mvsIsRepository (オプション、デフォルト=false) (LOCALのみ): mvsLocationがMVSディレクトリ全体(false)を指し示すかリポジトリのみ(true)を指し示すかを示すブール値。MVSリポジトリにはJSONテンプレートのみを含めることができます。_config_や_geonames_フォルダが含まれる場合や含まれない場合があります。

- mvsRebuildIndex (オプション、デフォルト=false) (LOCALのみ): リポジトリ索引を再構築する必要があるかどうかを示すブール値。

- mvsPersistentLocation (オプション、デフォルト=none) (LOCALのみ): MVSuggestディレクトリの保存先のHDFSパス。

- mvsIsOverwritePersistentLocation (オプション、デフォルト=false): 既存のmvsPersistentLocationが存在する場合に上書きする必要があるかどうかを示すブール引数。

例: 大陸部、国、および州別にレコード数が含まれるサマリーを作成するためのカテゴリ化ジョブを実行します。この入力は、indexExampleと呼ばれる既存の空間索引です。階層データは、索引が付けられ、パスhierarchyIndexでHDFSに格納されます。

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop/lib/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.Categorization indexName= indexExample  output=/user/hdfs/demo_vector/tweets/hier_count_spatial hierarchyInfo=vectoranalysis.categorization.WorldAdminHierarchyInfo hierarchyIndex=hierarchyIndex  hierarchyDataPaths=file:///templates/world_continents.json,file:///templates/world_countries.json,file:///templates/world_states_provinces.json spatialOperation=IsInside

例: MVSuggestを使用して大陸部、国、州、および都市当たりのツイート数のサマリーを作成するためのカテゴリ化ジョブを実行します。

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop/lib/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.Categorization input="/user/hdfs/demo_vector/tweets/part*" inputFormat=<InputFormat_subclass> recordInfoProvider=<LocalizableRecordInfoProvider_subclass>  output=/user/hdfs/demo_vector/tweets/hier_count_mvs hierarchyInfo=vectoranalysis.categorization.WorldAdminHierarchyInfo hierarchyIndex=hierarchyIndex mvsLocation=file:///mvs_dir mvsMatchLayers=world_continents,world_countries,world_states_provinces spatialOperation=IsInside

2.12.18 クラスタ化結果を作成するジョブの実行

クラスタ化結果を作成するには、次の形式のコマンドを使用します。

hadoop jar <HADOOP_LIB_PATH >/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.KMeansClustering [generic options] input=<path|comma_separated_paths|path_pattern> inputFormat=<InputFormat_subclass> recordInfoProvider=<RecordInfoProvider_subclass> output=<path> [srid=<integer_value>] [geodetic=<true|false>] [tolerance=<double_value>] [boundaries=<min_x,min_y,max_x,max_y>]  k=<number_of_clusters> [clustersPoints=<comma_separated_points_ordinates>] [deleteClusterFiles=<true|false>] [maxIterations=<integer_value>] [critFunClass=<CriterionFunction_subclass>] [shapeGenClass=<ClusterShapeGenerator_subclass>] [maxMemberDistance=<double_value>]

新しいHadoop API形式を使用するには、oracle.spatial.hadoop.vector.mapred.job.KMeansClusteringをoracle.spatial.hadoop.vector.mapreduce.job.KMeansClusteringに置き換えます。

入力/出力引数:

- input : 入力データの場所。これは、パス、カンマ区切りのパスのリスト、または正規表現として表すことができます。

- inputFormat: 入力データを読み取るために使用されるinputFormatクラス実装。

- recordInfoProvider: InputFormatクラスによって読み取られたレコードから情報を抽出するために使用されるrecordInfoProvider実装。

- output: 空間索引の格納先のパス

空間引数:

- srid (オプション、デフォルト=0): 空間データの空間参照システム(座標系) ID。

- geodetic (オプション、デフォルトはSRIDによって異なります): ジオメトリが測地であるかどうかを示すブール値。

- tolerance (オプション、デフォルト=0.0): 空間操作の実行時に使用される許容差を表すdouble値。

- boundaries (オプション、デフォルト=unbounded): minX,minY,maxX,maxYの形式でカンマ区切りの値として表される各次元の最小値および最大値

- spatialOperation: 入力データ・セットと階層データ・セットの間で実行する空間操作。使用可能な値は、IsInsideおよびAnyInteractです。

クラスタ化の引数:

- k: 検出されるクラスタの数。

- clusterPoints (オプション、デフォルト=none): p1_x,p1_y,p2_x,p2_y,…,pk_x,pk_y形式の点座標のカンマ区切りのリストである初期のクラスタの中心

- deleteClusterFiles (オプション、デフォルト=true): 各反復の間に生成される中間クラスタ・ファイルを削除する必要があるかどうかを示すブール引数

- maxIterations (オプション、デフォルト=数値kに基づいて計算されます): ジョブが完了するまでに許可される反復の最大回数。

- critFunClass (オプション、デフォルト=oracle.spatial.hadoop.vector.cluster.kmeans.SquaredErrorCriterionFunction): CriterionFunctionサブクラスの完全修飾名。

- shapeGenClass (オプション、デフォルト=oracle.spatial.hadoop.vector.cluster.kmeans.ConvexHullClusterShapeGenerator) クラスタのジオメトリを生成するために使用されるClusterShapeGeneratorサブクラスの完全修飾名。

- maxMemberDistance (オプション、デフォルト=undefined): クラスタの中心とクラスタ・メンバーの間の最大距離を示すdouble値。

例: 5つのクラスタを生成するクラスタ化ジョブを実行します。シェルされたクラスタ・ジオメトリはすべての凸包になります。

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop/lib/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.KMeansClustering input="/user/hdfs/demo_vector/tweets/part*" output=/user/hdfs/demo_vector/tweets/result inputFormat=oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat recordInfoProvider=oracle.spatial.hadoop.vector.geojson.GeoJsonRecordInfoProvider srid=8307 geodetic=true tolerance=0.5 k=5 shapeGenClass=oracle.spatial.hadoop.vector.cluster.kmeans.ConvexHullClusterShapeGenerator

2.12.19 ビニング結果を作成するジョブの実行

ビニング結果を作成するには、次の形式のコマンドを使用します。

hadoop jar <HADOOP_LIB_PATH >/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.Binning [generic options] (indexName=<INDEX_NAME> [indexMetadataDir=<INDEX_METADATA_DIRECTORY>]) | (input=<DATA_PATH> inputFormat=<INPUT_FORMAT_CLASS> recordInfoProvider=<RECORD_INFO_PROVIDER_CLASS> [srid=<SRID>] [geodetic=<GEODETIC>] [tolerance=<TOLERANCE>]) output=<RESULT_PATH> cellSize=<CELL_SIZE> gridMbr=<GRID_MBR> [cellShape=<CELL_SHAPE>] [aggrFields=<EXTRA_FIELDS>]

新しいHadoop API形式を使用するには、oracle.spatial.hadoop.vector.mapred.job.Binningをoracle.spatial.hadoop.vector.mapreduce.job.Binningに置き換えます。

入力/出力引数:

- indexName: 既存の空間索引の名前。索引情報は、indexMetadataDirによって示されるパスで参照します。使用されている場合、引数inputは無視されます。

- indexMetadataDir (オプション、デフォルト=hdfs://server:port/user/<current_user>/oracle_spatial/index_metadata/): 空間索引メタデータの格納先のディレクトリ

- input : 入力データの場所。これは、パス、カンマ区切りのパスのリスト、または正規表現として表すことができます。

- inputFormat: 入力データを読み取るために使用されるinputFormatクラス実装。

- recordInfoProvider: InputFormatクラスによって読み取られたレコードから情報を抽出するために使用されるrecordInfoProvider実装。

- output: 空間索引の格納先のパス

空間引数:

- srid (オプション、デフォルト=0): 空間データの空間参照システム(座標系) ID。

- geodetic (オプション、デフォルトはSRIDによって異なります): ジオメトリが測地であるかどうかを示すブール値。

- tolerance (オプション、デフォルト=0.0): 空間操作の実行時に使用される許容差を表すdouble値。

ビニングの引数:

- cellSize: width,heightの形式のセルのサイズ

- gridMbr : minX,minY,maxX,maxYの形式のグリッドの最小および最大次元値

- cellShape (オプション、デフォルト=RECTANGLE): セルの形状。使用可能な値は、RECTANGLEまたはHEXAGONです

- aggrFields (オプション、デフォルト=none): 集計されるフィールド名のカンマ区切りのリスト。

例: 六角形のセルのグリッドを生成し、フィールドSALESの値を集計する空間ビニング・ジョブを実行します。

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop/lib/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.Binning indexName=indexExample indexMetadataDir=indexMetadataDir output=/user/hdfs/demo_vector/result cellShape=HEXAGON cellSize=5 gridMbr=-175,-85,175,85 aggrFields=SALES

2.12.20 空間をフィルタ処理するジョブの実行

空間フィルタ処理を実行するには、次の形式のコマンドを使用します。

hadoop jar <HADOOP_LIB_PATH >/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.SpatialFilter [generic options] ( indexName=<indexName> [indexMetadataDir=<path>] )  |
(
(input=<path|comma_separated_paths|path_pattern> isInputIndex=true)  | (input=<path|comma_separated_paths|path_pattern> inputFormat=<InputFormat_subclass> recordInfoProvider=<RecordInfoProvider_subclass>)
[srid=<integer_value>] [geodetic=<true|false>] [tolerance=<double_value>] [boundaries=<min_x,min_y,max_x,max_y>]
) output=<path>  spatialOperation=<[IsInside, AnyInteract]> queryWindow=<json-geometry>

新しいHadoop API形式を使用するには、oracle.spatial.hadoop.vector.mapred.job.SpatialFilterをoracle.spatial.hadoop.vector.mapreduce.job.SpatialFilterに置き換えます。

入力/出力引数:

- indexName: 既存の空間索引の名前。索引情報は、indexMetadataDirによって示されるパスで参照します。使用されている場合、引数inputは無視されます。

- indexMetadataDir (オプション、デフォルト=hdfs://server:port/user/<current_user>/oracle_spatial/index_metadata/): 空間索引メタデータの格納先のディレクトリ

- input : 入力データの場所。これは、パス、カンマ区切りのパスのリスト、または正規表現として表すことができます。

- inputFormat: 入力データを読み取るために使用されるinputFormatクラス実装。

- recordInfoProvider: InputFormatクラスによって読み取られたレコードから情報を抽出するために使用されるrecordInfoProvider実装。

- output: 空間索引の格納先のパス

空間引数:

- srid (オプション、デフォルト=0): 空間データの空間参照システム(座標系) ID。

- geodetic (オプション、デフォルトはSRIDによって異なります): ジオメトリが測地であるかどうかを示すブール値。

- tolerance (オプション、デフォルト=0.0): 空間操作の実行時に使用される許容差を表すdouble値。

ビニングの引数:

- cellSize: width,heightの形式のセルのサイズ

- gridMbr : minX,minY,maxX,maxYの形式のグリッドの最小および最大次元値

- cellShape (オプション、デフォルト=RECTANGLE): セルの形状。使用可能な値は、RECTANGLEまたはHEXAGONです

- aggrFields (オプション、デフォルト=none): 集計されるフィールド名のカンマ区切りのリスト。

- boundaries (オプション、デフォルト=unbounded): minX,minY,maxX,maxYの形式でカンマ区切りの値として表される各次元の最小値および最大値

- spatialOperation: 入力データ・セットからのジオメトリとqueryWindowの間で適用する操作

- queryWindow: 入力データ・セットをフィルタ処理するために使用されるジオメトリ。

例: 空間フィルタ処理操作を実行します。

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop/lib/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.SpatialFilter indexName=indexExample indexMetadataDir=indexMetadataDir output=/user/hdfs/demo_vector/result spatialOperation=IsInside queryWindow='{"type":"Polygon", "coordinates":[[-106, 25, -106, 30, -104, 30, -104, 25, -106, 25]]}'

2.12.21 場所の提案を取得するジョブの実行

場所の提案を取得するジョブを作成するには、次の形式のコマンドを使用します。

hadoop jar <HADOOP_LIB_PATH >/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.SuggestService [generic options] input=<path|comma_separated_paths|path_pattern> inputFormat=<InputFormat_subclass> recordInfoProvider=<RecordInfoProvider_subclass> output=<path> mvsLocation=<path|URL> [mvsMatchLayers=<comma_separated_layers>] [mvsMatchCountry=<country_name>] [mvsSpatialResponse=<[NONE, FEATURE_GEOMETRY, FEATURE_CENTROID]>] [mvsInterfaceType=<[UNDEFINED, LOCAL, WEB]>] [mvsIsRepository=<true|false>] [mvsRebuildIndex=<true|false>] [mvsPersistentLocation=<hdfs_path>] [mvsOverwritePersistentLocation=<true|false>] [mvsMaxRequestRecords=<integer_number>]

新しいHadoop API形式を使用するには、oracle.spatial.hadoop.vector.mapred.job.SuggestServiceをoracle.spatial.hadoop.vector.mapreduce.job.SuggestServiceに置き換えます。

入力/出力引数:

- input : 入力データの場所。これは、パス、カンマ区切りのパスのリスト、または正規表現として表すことができます。(indexNameが指定されている場合は無視されます。)

- inputFormat: 入力データを読み取るために使用されるinputFormatクラス実装。(indexNameが指定されている場合は無視されます。)

- recordInfoProvider: InputFormatクラスによって読み取られたレコードから情報を抽出するために使用されるrecordInfoProvider実装。(indexNameが指定されている場合は無視されます。)

- output: 空間索引の格納先のパス

MVSuggest引数:

- mvsLocation: リモート・インスタンスの操作時のサービスURLまたはMVSuggestのローカル・スタンドアロン・インスタンスのMVSuggestディレクトリまたはリポジトリへのパス。この引数は、MVSuggestを操作するときに必要です。

- mvsMatchLayers (オプション、デフォルト=all): カンマ区切りのレイヤーのリスト。指定されている場合、MVSuggestでは、検索の実行時にこれらのレイヤーのみが使用されます。

- mvsMatchCountry (オプション、デフォルト=none): MVSuggestでの照合の実行時により高い優先度が与えられる国名。

- mvsSpatialResponse (オプション、デフォルト=CENTROID): 返された各照合結果に含まれる空間結果のタイプ。使用可能な値は、NONE、FEATURE_GEOMETRY、FEATURE_CENTROIDです。

- mvsInterfaceType (オプション、デフォルト=LOCAL): 使用されるMVSuggestサービスのタイプで、LOCALまたはWEBがあります。

- mvsIsRepository (オプション、デフォルト=false) (LOCALのみ): mvsLocationがMVSディレクトリ全体(false)を指し示すかリポジトリのみ(true)を指し示すかを示すブール値。MVSリポジトリにはJSONテンプレートのみを含めることができます。_config_や_geonames_フォルダが含まれる場合や含まれない場合があります。

- mvsRebuildIndex (オプション、デフォルト=false) (LOCALのみ): リポジトリ索引を再構築する必要があるかどうかを示すブール値。

- mvsPersistentLocation (オプション、デフォルト=none) (LOCALのみ): MVSuggestディレクトリの保存先のHDFSパス。

- mvsIsOverwritePersistentLocation (オプション、デフォルト=false): 既存のmvsPersistentLocationが存在する場合に上書きする必要があるかどうかを示すブール引数。

例: 入力データ・セットからの場所テキストに基づいて提案を取得します。

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop/lib/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.SuggestService input="/user/hdfs/demo_vector/tweets/part*" inputFormat=<InputFormat_subclass> recordInfoProvider=<LocalizableRecordInfoProvider_subclass> output=/user/hdfs/demo_vector/tweets/suggest_res mvsLocation=file:///mvs_dir mvsMatchLayers=world_continents,world_countries,world_states_provinces

2.12.22 空間結合を実行するジョブの実行

2つのデータ・セットに対して空間結合ジョブを実行するには、次の形式のコマンドを使用します。

hadoop jar <HADOOP_LIB_PATH >/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job. SpatialJoin [generic options]
inputList={
{
( indexName=<dataset1_spatial_index_name>  indexMetadataDir=<dataset1_spatial_index_metadata_dir_path> )
|
( input=<dataset1_path|comma_separated_paths|path_pattern> inputFormat=<dataset1_InputFormat_subclass> recordInfoProvider=<dataset1_RecordInfoProvider_subclass> )
[boundaries=<min_x,min_y,max_x,max_y>]
}
{
(indexName=<dataset2_spatial_index_name> indexMetadataDir=<dataset2_spatial_index_metadata_dir_path>
)
|
( input=<dataset2_path|comma_separated_paths|path_pattern> inputFormat=<dataset2_InputFormat_subclass> recordInfoProvider=<dataset2_RecordInfoProvider_subclass>
)
[boundaries=<min_x,min_y,max_x,max_y>]
}
} output=<path>[srid=<integer_value>] [geodetic=<true|false>] [tolerance=<double_value>] boundaries=<min_x,min_y,max_x,max_y> spatialOperation=<AnyInteract|IsInside|WithinDistance> [distance=<double_value>] [samplingRatio=<decimal_value_between_0_and_1> | partitioningResult=<path>]

新しいHadoop API形式を使用するには、oracle.spatial.hadoop.vector.mapred.job.SpatialJoinをoracle.spatial.hadoop.vector.mapreduce.job.SpatialJoinに置き換えます。

InputList: 2つの入力データ・セットのリスト。このリストは、中カッコ({})で囲まれます。各リスト要素は、中カッコで囲まれた入力データ・セットです。入力データ・セットには、データ・セットを空間索引として指定するかどうかに応じて、次の情報が含まれます。

空間索引として指定される場合:

- indexName: 既存の空間索引の名前。

- indexMetadataDir : 空間索引メタデータが配置されるディレクトリ

空間索引として指定されない場合:

- input : 入力データの場所。これは、パス、カンマ区切りのパスのリスト、または正規表現として表すことができます。(indexNameが指定されている場合は無視されます。)

- inputFormat: 入力データを読み取るために使用されるinputFormatクラス実装。(indexNameが指定されている場合は無視されます。)

- recordInfoProvider: InputFormatクラスによって読み取られたレコードから情報を抽出するために使用されるrecordInfoProvider実装。(indexNameが指定されている場合は無視されます。)

output: 結果の格納先のパス

空間引数:

- srid (オプション、デフォルト=0): 空間データの空間参照システム(座標系) ID。

- geodetic (オプション、デフォルトはSRIDによって異なります): ジオメトリが測地であるかどうかを示すブール値。

- tolerance (オプション、デフォルト=0.0): 空間操作の実行時に使用される許容差を表すdouble値。

- boundaries (オプション、デフォルト=unbounded): minX,minY,maxX,maxYの形式でカンマ区切りの値として表される各次元の最小値および最大値

- spatialOperation: 入力データ・セットと階層データ・セットの間で実行する空間操作。使用可能な値は、IsInsideおよびAnyInteractです。

- distance: WithinDistance操作に使用される距離。

パーティション化の引数:

- samplingRatio (オプション、デフォルト=0.1): パーティション化を実行する必要がある場合にデータ・セットをサンプリングするために使用される比率

- partitioningResult (オプション、デフォルト=none): 前に生成されたパーティション化結果ファイルへのパス

例: 2つのデータ・セットに対して空間結合を実行します。

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop/lib/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.SpatialJoin inputList="{{input=/user/hdfs/demo_vector/world_countries.json inputFormat=oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat recordInfoProvider=oracle.spatial.hadoop.vector.geojson.GeoJsonRecordInfoProvider} {input=file="/user/hdfs/demo_vector/tweets/part*” inputFormat=oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat recordInfoProvider=oracle.spatial.hadoop.vector.geojson.GeoJsonRecordInfoProvider}}" output=/user/hdfs/demo_vector/spatial_join srid=8307 spatialOperation=AnyInteract boundaries=-180,-90,180,90

2.12.23 パーティション化を実行するジョブの実行

空間パーティション化を実行するには、次の形式のコマンドを使用します。

hadoop jar <HADOOP_LIB_PATH >/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job. SpatialJoin [generic options]
inputList={
{
( indexName=<dataset1_spatial_index_name>  indexMetadataDir=<dataset1_spatial_index_metadata_dir_path> )
|
( input=<dataset1_path|comma_separated_paths|path_pattern> inputFormat=<dataset1_InputFormat_subclass> recordInfoProvider=<dataset1_RecordInfoProvider_subclass> )
[boundaries=<min_x,min_y,max_x,max_y>]
}
[
{
(indexName=<dataset2_spatial_index_name> indexMetadataDir=<dataset2_spatial_index_metadata_dir_path>
)
|
( input=<dataset2_path|comma_separated_paths|path_pattern> inputFormat=<dataset2_InputFormat_subclass> recordInfoProvider=<dataset2_RecordInfoProvider_subclass>
)
[boundaries=<min_x,min_y,max_x,max_y>]
}
……
{
(indexName=<datasetN_spatial_index_name> indexMetadataDir=<datasetN_spatial_index_metadata_dir_path>
)
|
( input=<datasetN_path|comma_separated_paths|path_pattern> inputFormat=<datasetN_InputFormat_subclass> recordInfoProvider=<datasetN_RecordInfoProvider_subclass>
)
[boundaries=<min_x,min_y,max_x,max_y>]
}

}
] output=<path>[srid=<integer_value>] [geodetic=<true|false>] [tolerance=<double_value>] boundaries=<min_x,min_y,max_x,max_y> [samplingRatio=<decimal_value_between_0_and_1>]

新しいHadoop API形式を使用するには、oracle.spatial.hadoop.vector.mapred.job.Partitioningをoracle.spatial.hadoop.vector.mapreduce.job.Partitioningに置き換えます。

InputList: 2つの入力データ・セットのリスト。このリストは、中カッコ({})で囲まれます。各リスト要素は、中カッコで囲まれた入力データ・セットです。入力データ・セットには、データ・セットを空間索引として指定するかどうかに応じて、次の情報が含まれます。

空間索引として指定される場合:

- indexName: 既存の空間索引の名前。

- indexMetadataDir : 空間索引メタデータが配置されるディレクトリ

空間索引として指定されない場合:

- input : 入力データの場所。これは、パス、カンマ区切りのパスのリスト、または正規表現として表すことができます。(indexNameが指定されている場合は無視されます。)

- inputFormat: 入力データを読み取るために使用されるinputFormatクラス実装。(indexNameが指定されている場合は無視されます。)

- recordInfoProvider: InputFormatクラスによって読み取られたレコードから情報を抽出するために使用されるrecordInfoProvider実装。(indexNameが指定されている場合は無視されます。)

output: 結果の格納先のパス

空間引数:

- srid (オプション、デフォルト=0): 空間データの空間参照システム(座標系) ID。

- geodetic (オプション、デフォルトはSRIDによって異なります): ジオメトリが測地であるかどうかを示すブール値。

- tolerance (オプション、デフォルト=0.0): 空間操作の実行時に使用される許容差を表すdouble値。

- boundaries (オプション、デフォルト=unbounded): minX,minY,maxX,maxYの形式でカンマ区切りの値として表される各次元の最小値および最大値

パーティション化の引数:

- samplingRatio (オプション、デフォルト=0.1): パーティション化を実行する必要がある場合にデータ・セットをサンプリングするために使用される比率

例: 2つのデータ・セットをパーティション化します。

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop/lib/sdohadoop-vector.jar oracle.spatial.hadoop.vector.mapred.job.Partitioning inputList="{{input=/user/hdfs/demo_vector/world_countries.json inputFormat=oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat recordInfoProvider=oracle.spatial.hadoop.vector.geojson.GeoJsonRecordInfoProvider} {input=file="/user/hdfs/demo_vector/tweets/part*” inputFormat=oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat recordInfoProvider=oracle.spatial.hadoop.vector.geojson.GeoJsonRecordInfoProvider}}" output=/user/hdfs/demo_vector/partitioning srid=8307 boundaries=-180,-90,180,90

2.12.24 複数の入力の使用

inputListパラメータを使用してコマンド・ライン・インタフェースを介してVectorジョブに対して複数の入力データ・セットを指定できます。inputListパラメータ値は、入力データ・セットのグループです。inputListパラメータの形式は、次のとおりです。

inputList={ {input_data_set_1_params} {input_data_set_2_params} … {input_data_set_N_params} }

各入力データ・セットとして使用可能なのは、次の入力データ・セットのいずれかです。

- 非ファイル入力データ・セット: inputFormat=<InputFormat_subclass> recordInfoProvider=<RecordInfoProvider_subclass> [srid=<integer_value>] [geodetic=<true|false>] [tolerance=<double_value>] [boundaries=<min_x,min_y,max_x,max_y>]

- ファイル入力データ・セット: input=<path|comma_separated_paths|path_pattern> inputFormat=<FileInputFormat_subclass> recordInfoProvider=<RecordInfoProvider_subclass> [srid=<integer_value>] [geodetic=<true|false>] [tolerance=<double_value>] [boundaries=<min_x,min_y,max_x,max_y>]

- 空間索引入力データ・セット: ( ( indexName=<<indexName>> [indexMetadataDir=<<path>>]) | ( isInputIndex=<true> input=<path|comma_separated_paths|path_pattern> ) ) [srid=<integer_value>] [geodetic=<true|false>] [tolerance=<double_value>] [boundaries=<min_x,min_y,max_x,max_y>]

- NoSQL入力データ・セット: kvStore=<kv store name> kvStoreHosts=<comma separated list of hosts> kvParentKey=<parent key> [kvConsistency=<Absolute|NoneRequired|NoneRequiredNoMaster>] [kvBatchSize=<integer value>] [kvDepth=<CHILDREN_ONLY|DESCENDANTS_ONLY|PARENT_AND_CHILDREN|PARENT_AND_DESCENDANTS>] [kvFormatterClass=<fully qualified class name>] [kvSecurity=<properties file path>] [kvTimeOut=<long value>] [kvDefaultEntryProcessor=<fully qualified class name>] [kvEntryGrouper=<fully qualified class name>] [ kvResultEntries={ { minor key 1: a minor key name relative to the major key [fully qualified class name: a subclass of NoSQLEntryProcessor class used to process the entry with the given key] } * } ] [srid=<integer_value>] [geodetic=<true|false>] [tolerance=<double_value>] [boundaries=<min_x,min_y,max_x,max_y>]

注意:

- カテゴリ化ジョブは、複数の入力データ・セットをサポートしていません。

- SpatialJoinジョブは、2つの入力データ・セットのみをサポートしています。

- SpatialIndexingジョブは、空間索引タイプの入力データ・セットを受け入れません。

- NoSQL入力データ・セットを使用できるのは、クラスパス内にkvstore.jarが存在する場合のみです。

2.12.25 ローカル・サーバーからHDFS Hadoopクラスタへのイメージのロード

1. コンソール: http://<oracle_big_data_spatial_vector_console>:8045を開きます。

2. 「Raster」タブをクリックします。

3. 「Select File or Path」をクリックし、一連のハワイのイメージを含むデモ・フォルダ(/opt/shareddir/spatial/data/rasters)を参照します。

4. rastersフォルダをクリックし、「Load images」をクリックします。

「Images loaded successfully」というメッセージが表示されるまで待ちます。

注意:

ラスター・ファイルが見つからない場合は、インストール中に作成される共有ディレクトリ・フォルダにそれらをコピーできます。「Admin」タブでディレクトリの場所を確認し、ラスター・ファイルをその場所にコピーします。

2.12.26 地球でのラスターの視覚化

地球でラスターを視覚化する前に、ローカル・サーバーからHDFS Hadoopクラスタへのイメージのロードで説明されているように、ラスター・ファイルをHDFSにアップロードする必要があります。

1. コンソール: http://<oracle_big_data_spatial_vector_console>:8045を開きます。

2. 「Raster」タブをクリックします。

3. 「Hadoop Viewer」タブをクリックします。

4. 「Refresh Footprints」をクリックして地球の足跡を更新し、すべての足跡が地球に表示されるまで待ちます。

同一のラスターは黄色のエッジで表示されます

2.12.27 単一のラスターまたは同じMBRを持つ複数のラスターの処理

地球でラスターを視覚化する前に、ローカル・サーバーからHDFS Hadoopクラスタへのイメージのロードで説明されているように、ラスター・ファイルをHDFSにアップロードする必要があります。

同じMBR(最小外接矩形)を持つラスターを処理するには、ローカル・サーバーからHDFS Hadoopクラスタへのイメージのロードで説明されているように、ラスター・ファイルをHDFSにアップロードし、地球でのラスターの視覚化で説明されているように、ラスターを視覚化する必要があります。

1. ラスターを右クリックします。赤または黄色のエッジを持つラスターを選択した場合、ラスターのリストを含むツールチップが表示されることがあります。

2. 「Process rasters with same MBR」をクリックします。各行の右側にあるXボタンをクリックして、ラスターをプロセスから除外できます。単一のラスターを選択した場合、「Process Image (No Mosaic)」をクリックします。

3. ラスター・プロセス・ダイアログで、スクロール・ダウンして「Create Mosaic」をクリックします。

4. 「Refresh Footprints」をクリックして地球の足跡を更新します。

すべての足跡が地球に表示されるまで待ちます。

5. オプションで、「Download Full Size Image」をクリックして結果をダウンロードします。

2.12.28 地球からのモザイクの直接作成

モザイク・イメージを作成する前に、ローカル・サーバーからHDFS Hadoopクラスタへのイメージのロードで説明されているように、ラスター・ファイルをHDFSにアップロードする必要があります。

1. コンソール: http://<oracle_big_data_spatial_vector_console>:8045を開きます。

2. 「Raster」タブをクリックします。

3. 「Hadoop Viewer」タブをクリックします。

4. 「Refresh Footprints」をクリックして地球の足跡を更新し、すべての足跡が地球に表示されるまで待ちます。

同一のラスターは黄色のエッジで表示されます

5. 「Select and crop coordinates of Footprints」をクリックします。

6. ラスター(少なくとも1つ)および目的の領域を覆う矩形を描き、必要に応じてズームインまたはズームアウトします。

7. 地図を右クリックし、「Generate Mosaic」を選択します。

8. ラスター・プロセス・ダイアログで、スクロール・ダウンして「Create Mosaic」をクリックします

ラスター処理が終了するまで待ちます。結果が「Result」タブに表示されます。

9. オプションで、「Download Full Size Image」をクリックして結果をダウンロードします。

2.12.29 ラスター処理に対する演算の追加

ラスター処理またはイメージ・モザイク作成に対して代数演算を追加する前に、単一のラスターまたは同じMBRを持つ複数のラスターの処理または地球からのモザイクの直接作成の手順に従って、ラスター処理ダイアログが表示されるようにします。「Create Mosaic」をクリックする前に、次の手順を実行します。

1. 「Advanced options」をクリックします。

新しい要素のグループが拡張オプションの追加用に表示されます。

2. ラスター演算が表示されるまでスクロール・ダウンします。

3. リストからラスター演算を選択します。複雑な演算を追加する場合は、「Hide Complex Operations」チェック・ボックスを切り替えます。

ラスター処理アクションごとに、1つの複雑な演算のみが許可されます。

4. 左のリストから演算を選択した後、右矢印をクリックしてその演算をプロセスに追加します。

一部の演算にはパラメータも必要です。

5. 必要に応じてさらに演算を追加します。

演算を削除するには、右のリストでその演算を選択してから左矢印をクリックします。リストのすべての演算を削除することもできます。

6. 「Create Mosaic」をクリックします。

ラスター処理が終了するまで待ちます。結果が「Result」タブに表示されます。

7. オプションで、「Download Full Size Image」をクリックして結果をダウンロードします。

2.12.30 地球からの傾斜イメージの直接作成

1. 「Hadoop Raster Viewer」タブに移動します(または留まります)。

2. 「Refresh Footprint」をクリックし、すべての足跡がパネルに表示されるまで待ちます。

3. 必要に応じて、ラスターを削除または無視します。

結果内に同一のラスターがある場合、これらは黄色で表示されます

4. イメージを右クリックし、「Process Image(No Mosaic)」を選択します。

5. 傾斜イメージを配置する出力フォルダを指定するか、既存の構成ファイルをロードします。

6. 6.正しいピクセル・タイプを選択します。(通常、これらのイメージはFloat 32ビットです。)

7. 7.「Add Process Class」をクリックし、プロセス・クラスを追加します。フレームワークには、傾斜用のデフォルトのプロセス・クラスoracle.spatial.hadoop.imageprocessor.process.ImageSlopeが用意されています。

8. モザイク内のすべてのピクセルに演算を追加するには、「Advanced Configuration」をクリックします。

9. 「Create Mosaic」をクリックし、結果を待ちます。

10. I10.別の傾斜を生成する必要がある場合、「Go Back」をクリックします。

注意:

モザイクをHDFS上で作成することを要求した場合、HDFSにイメージがロードされるまで待ちます。

11. オプションで、イメージをダウンロードして格納するには、「Download」をクリックします。

2.12.31 地球からのイメージ・ファイル形式の変更

イメージ・ファイル形式を変更する前に、単一のラスターまたは同じMBRを持つ複数のラスターの処理または地球からのモザイクの直接作成の手順に従って、ラスター処理ダイアログが表示されるようにします。「Create Mosaic」をクリックする前に、次の手順を実行します。

1. 目的のイメージの「Output Format」を選択します。

2. スクロール・ダウンし、「Create Mosaic」をクリックします。

ラスター処理が終了するまで待ちます。結果が「Result」タブに表示されます。

3. オプションで、「Download Full Size Image」をクリックして結果をダウンロードします。

2.13 Oracle Big Data Spatial and Graph Image Serverコンソールの使用

Oracle Big Data Spatial and Graph Image Serverコンソールを使用して、モザイクを作成するためのイメージのロードなどのタスクを実行できます。

- モザイクを作成するためのHDFS Hadoopクラスタへのイメージのロード

2.13.1 モザイクを作成するためのHDFS Hadoopクラスタへのイメージのロード

次の手順に従ってモザイクを作成します。

1. http://<oracle_big_data_image_server_console>:8080/spatialviewer/を開きます。

2. ユーザー名とパスワードを入力します。

3. 「Configuration」タブをクリックして、「Hadoop configuration」セクションを確認します。

アプリケーションはデフォルトでHadoopクラスタを使用するよう構成されており、その他の構成は必要ありません。

注意:

このセクションは、管理ユーザーのみが変更を行えます。

4. 「Hadoop Loader」タブをクリックして、表示されている手順またはアラートを確認します。

5. 手順に従い、必要に応じてランタイム構成を更新します。

6. 「Folder」アイコンをクリックします。

「File System」ダイアログにイメージ・ファイルとフォルダのリストが表示されます。

7. 必要に応じてフォルダまたはファイルを選択し、「Ok」をクリックします。

イメージ・ファイルへの完全パスが表示されます。

8. 「Load Images」をクリックします。

イメージのロードが完了するまで待ちます。メッセージが表示されます。

9. エラーが表示されなければ、モザイクの作成を続行します。

3 Big Data Spatial and GraphとOracle Databaseとの統合

Oracle Big Data Connectorsを使用して、Big Data Spatial and GraphとOracle Databaseとの間の空間データ・アクセスを簡略化できます。

この章では、次に関する知識があることを前提としています。

- Oracle SQL Connector for HDFS
詳細は、「Oracle SQL Connector for Hadoop Distributed File System」を参照してください。

- Oracle Loader for Hadoop
詳細は、「Oracle Loader for Hadoop」を参照してください

- Apache Hive
詳細は、Apache Hiveのドキュメント(https://cwiki.apache.org/confluence/display/Hive/Home#Home-UserDocumentation)を参照してください。

- 区切りテキスト・ファイルを使用したOracle SQL Connector for HDFSの使用
このトピックは、HDFS内のファイルが区切りテキスト・ファイルである(フィールドはカンマやタブなどの単一文字のマーカーを使用して区切る必要があります)と同時に、空間データがGeoJSONまたはWKT形式で格納されている場合に適用されます。

- Hive表を使用したOracle SQL Connector for HDFSの使用
Oracle SQL Connector for HDFS (OSCH)は、HDFSで定義されたHIVE表を直接サポートします。

- Oracle Loader for Hadoopによって生成されたファイルを使用したOracle SQL Connector for HDFSの使用
Oracle Loader for Hadoop (OLH)によって生成されたファイルを使用してOracle SQL Connector for HDFS (OSCH)を使用するには、OLHを使用してHDFSからOracle Databaseにデータを移動する方法を理解する必要があります。

- Oracle Big Data SQLを使用したOracle DatabaseとのHDFS空間データの統合
Oracle Big Data SQLを使用して、HDFSとOracle Databaseとの間の空間データのアクセスを容易にすることができます。

3.1 区切りテキスト・ファイルを使用したOracle SQL Connector for HDFSの使用

このトピックは、HDFS内のファイルが区切りテキスト・ファイルである(フィールドはカンマやタブなどの単一文字のマーカーを使用して区切る必要があります)と同時に、空間データがGeoJSONまたはWKT形式で格納されている場合に適用されます。

このようなデータがBig Data Spatial and Graphによって使用され、Oracle SQL Connector for HDFSを使用してOracleデータベースからアクセスされる場合、特定の構成ステップが必要です。

この例では、次のように、改行によって区切られたレコードがHDFS内のファイルに含まれ、各レコード内のフィールドがタブによって区切られていることを前提としています。

"6703"    1    62    "Hong Kong"    3479846    POINT (114.18306 22.30693)
"6702"    57    166    "Singapore"    1765655    POINT (103.85387 1.29498)

1. Hadoopクラスタのノードにログインします。

2. 次の例のように、OSCH (Oracle SQL Connector for HDFS)に必要な構成ファイルを作成します。

<?xml version="1.0"?>
<configuration>
<property>
<name>oracle.hadoop.exttab.tableName</name>
<value>TWEETS_EXT_TAB_FILE</value>
</property>
<property>
<name>oracle.hadoop.exttab.sourceType</name>
<value>text</value>
</property>
<property>
<name>oracle.hadoop.exttab.dataPaths</name>
<value>/user/scott/simple_tweets_data/*.log</value>
</property>
<property>
<name>oracle.hadoop.connection.url</name>
<value>jdbc:oracle:thin:@//myhost:1521/myservicename</value>
</property>
<property>
<name>oracle.hadoop.connection.user</name>
<value>scott</value>
</property>
<property>
<name>oracle.hadoop.exttab.fieldTerminator</name>
<value>\u0009</value>
</property>
<property>
<name>oracle.hadoop.exttab.columnNames</name>
<value>ID,FOLLOWERS_COUNT,FRIENDS_COUNT,LOCATION,USER_ID,GEOMETRY</value>
</property>
<property>
<name>oracle.hadoop.exttab.defaultDirectory</name>
<value>TWEETS_DT_DIR</value>
</property>
</configuration>

3. 構成ファイルにtweets_text.xmlという名前を付けます。

4. Hadoopクラスタのノード上で、次のコマンドを実行します。

hadoop jar $OSCH_HOME/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable \
-conf /home/oracle/tweets_text.xml \
-createTable

コマンドを実行すると、データベース・パスワードを要求されます。

OSCH_HOME環境変数を作成することも、コマンド構文のOSCH_HOMEをOracle SQL Connector for HDFSのインストール・ディレクトリのフル・パスに置き換えることもできます。Oracle Big Data Applianceの場合、このディレクトリは/opt/oracle/orahdfs-versionです

これで、表TWEETS_EXT_TAB_FILEに対して問い合せることが可能になります。データベースから他の任意の表と同じように問い合せることができます。このデータベースは、前述のステップで構成ファイルに指定されているターゲット・データベースです。次の問合せでは、表内の行の数を選択します。

select count(*) from TWEETS_EXT_TAB_FILE;

データベース内の他の任意の空間表の場合と同じように、この表に対して空間操作を実行できます。次の例では、特定の映画館から半径4分の1マイル(0.25マイル)内でツイートしているユーザーに関する情報を取得します。

select sdo_geom.SDO_DISTANCE(ci.geometry, SDO_GEOMETRY(tw.geometry, 8307), 0.05, 'UNIT=MILE'), ci.name, tw.user_id
from CINEMA ci, TWEETS_EXT_TAB_FILE tw where SDO_WITHIN_DISTANCE(ci.geometry, SDO_GEOMETRY(tw.geometry, 8307), 'DISTANCE=0.25 UNIT=MILE') = 'TRUE'

ここでは、表CINEMAはOracleデータベース内の空間表であり、HDFS表TWEETS_EXT_TAB_FILEを使用してこの表に対して問い合せることができます。ツイート表からのデータはWKT (Well-Known Text)として読み込まれ、SDO_GEOMETRYのWKTコンストラクタを使用してこのデータがデータベース内のジオメトリとしてマテリアライズされます。

ジオメトリのSRIDは8307です。また、空間データがGeoJSON形式である場合、問合せは次のようにする必要があります。

select sdo_geom.SDO_DISTANCE(ci.geometry, SDO_UTIL.FROM_GEOJSON(tw.geometry, '', 8307), 0.05, 'UNIT=MILE'), ci.name, tw.user_id
from CINEMA ci, TWEETS_EXT_TAB_FILE tw where SDO_WITHIN_DISTANCE(ci.geometry, SDO_UTIL.FROM_GEOJSON(tw.geometry, '', 8307), 'DISTANCE=0.25 UNIT=MILE') = 'TRUE'

3.2 Hive表を使用したOracle SQL Connector for HDFSの使用

Oracle SQL Connector for HDFS (OSCH)は、HDFSで定義されたHIVE表を直接サポートします。

Hive表は、パーティション化せずに、ROW FORMAT DELIMITED and FILE FORMAT TEXTFILE句を使用して定義する必要があります。空間データは、GeoJSONまたはWKT形式である必要があります。

Hive管理表とHive外部表はどちらもサポートされます。

たとえば、「区切りテキスト・ファイルを使用したOracle SQL Connector for HDFSの使用」で説明されているファイル上で表を作成するためのHiveコマンドは、次のとおりです。ここでは、HDFSデータに定義されたHive表をユーザーがすでに所有していることが前提です。HDFS内のデータがサポート対象の形式である必要があり、空間データがGeoJSONまたはWKT形式である必要があります。

CREATE EXTERNAL TABLE IF NOT EXISTS TWEETS_HIVE_TAB(
ID string,
FOLLOWERS_COUNT int,
FRIENDS_COUNT int,
LOCATION string,
USER_ID int,
GEOMETRY string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'/user/scott/simple_tweets_data';

次の例では、表に対して問い合せます。

select ID, FOLLOWERS_COUNT, FRIENDS_COUNT, LOCATION, USER_ID, GEOMETRY from TWEETS_HIVE_TAB limit 10;

出力内容は次のようになります。

"6703"    1    62    "Hong Kong"    3479846    POINT (114.18306 22.30693)
"6702"    57    166    "Singapore"    1765655    POINT (103.85387 1.29498)

1. Hadoopクラスタのノードにログインします。

2. 次の例のように、OSCH (Oracle SQL Connector for HDFS)に必要な構成ファイルを作成します。

<?xml version="1.0"?>
<configuration>
<property>
<name>oracle.hadoop.exttab.tableName</name>
<value>TWEETS_EXT_TAB_HIVE</value>
</property>
<property>
<name>oracle.hadoop.exttab.sourceType</name>
<value>hive</value>
</property>
<property>
<name>oracle.hadoop.exttab.hive.tableName</name>
<value>TWEETS_HIVE_TAB</value>
</property>
<property>
<name>oracle.hadoop.exttab.hive.databaseName</name>
<value>default</value>
</property>
<property>
<name>oracle.hadoop.connection.url</name>
<value>jdbc:oracle:thin:@//myhost:1521/myservicename</value>
</property>
<property>
<name>oracle.hadoop.connection.user</name>
<value>scott</value>
</property>
<property>
<name>oracle.hadoop.exttab.defaultDirectory</name>
<value>TWEETS_DT_DIR</value>
</property>
</configuration>

3. 構成ファイルにtweets_text.xmlという名前を付けます。

4. Hadoopクラスタのノード上で、次のコマンドを実行します。

# Add HIVE_HOME/lib* to HADOOP_CLASSPATH.
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*
hadoop jar $OSCH_HOME/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable \
-conf /home/oracle/tweets_hive.xml \
-createTable

コマンドを実行すると、データベース・パスワードを要求されます。OSCH_HOME環境変数を作成することも、コマンド構文のOSCH_HOMEをOracle SQL Connector for HDFSのインストール・ディレクトリのフル・パスに置き換えることもできます。Oracle Big Data Applianceの場合、このディレクトリは/opt/oracle/orahdfs-versionです

Hiveインストール・ディレクトリを指し示すように環境変数HIVE_HOMEを設定します(/usr/lib/hiveなど)。

これで、表TWEETS_EXT_TAB_FILEに対して問い合せることが可能になります。データベースから他の任意の表と同じように問い合せることができます。次の問合せでは、表内の行の数を選択します。

select count(*) from TWEETS_EXT_TAB_HIVE;;

データベース内の他の任意の空間表の場合と同じように、この表に対して空間操作を実行できます。次の例では、特定の映画館から半径4分の1マイル(0.25マイル)内でツイートしているユーザーに関する情報を取得します。

select sdo_geom.SDO_DISTANCE(ci.geometry, SDO_GEOMETRY(tw.geometry, 8307), 0.05, 'UNIT=MILE), ci.name, tw.user_id
from CINEMA ci, TWEETS_EXT_TAB_HIVE tw where SDO_WITHIN_DISTANCE(ci.geometry, SDO_GEOMETRY(tw.geometry, 8307), 'DISTANCE=0.25 UNIT=MILE') = 'TRUE'

ここでは、表CINEMAはOracleデータベース内の空間表であり、HDFS表TWEETS_EXT_TAB_FILEを使用してこの表に対して問い合せることができます。ツイート表からのデータはWKT (Well-Known Text)として読み込まれ、SDO_GEOMETRYのWKTコンストラクタを使用してこのデータがデータベース内のジオメトリとしてマテリアライズされます。

ジオメトリのSRIDは8307です。また、空間データがGeoJSON形式である場合、問合せは次のようにする必要があります。

select sdo_geom.SDO_DISTANCE(ci.geometry, SDO_UTIL.FROM_GEOJSON(tw.geometry, '', 8307), 0.05, 'UNIT=MILE), ci.name, tw.user_id
from CINEMA ci, TWEETS_EXT_TAB_HIVE tw where SDO_WITHIN_DISTANCE(ci.geometry, SDO_UTIL.FROM_GEOJSON(tw.geometry, '', 8307), 'DISTANCE=0.25 UNIT=MILE') = 'TRUE'

3.3 Oracle Loader for Hadoopによって生成されたファイルを使用したOracle SQL Connector for HDFSの使用

Oracle Loader for Hadoop (OLH)によって生成されたファイルを使用してOracle SQL Connector for HDFS (OSCH)を使用するには、OLHを使用してHDFSからOracle Databaseにデータを移動する方法を理解する必要があります。

Big Data Spatial and Graph空間データをデータベースに移動するには、変更が必要です。通常、このソリューションは、HDFS内の任意の種類のファイルまたは任意の種類のHiveデータに適用されます。空間情報は、ウェル・ノウン形式またはカスタム形式にすることができます。

最初は、空間情報がユーザー定義の形式で含まれるHDFS内のファイルから外部表を作成する方法の例です。HDFS内のファイルには次の形式のレコードが含まれることを前提とします。

{
"type":"Feature",
"id":"6703",
"followers_count":1,
"friends_count":62,
"location":"Hong Kong",
"user_id":3479846,
"longitude":114.18306,
"latitude":22.30693
}

{
"type":"Feature",
"id":"6702",
"followers_count":57,
"friends_count":166,
"location":"Singapore",
"user_id":1765655,
"longitude":103.85387,
"latitude":1.29498
}

これらのレコード用の表を作成するためのHiveコマンドは、次のとおりです。

add jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/ojdbc8.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdoutl.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdoapi.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdohadoop-vector.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdohadoop-vector-hive.jar
… (add here jars containing custom SerDe and/or InputFormats);
CREATE EXTERNAL TABLE IF NOT EXISTS CUST_TWEETS_HIVE_TAB (id STRING, geometry STRING, followers_count STRING, friends_count STRING, location STRING, user_id STRING)
ROW FORMAT SERDE 'mypackage.TweetsSerDe'
STORED AS INPUTFORMAT 'oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '/user/scott/simple_tweets_data';

InputFormatオブジェクトoracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormatは、これらのレコードが厳密なGeoJSONでない場合でも、これらを読み込むことができます。このため、前述の例では、カスタムInputFormat仕様は必要ありません。ただし、経度および緯度をWKTまたはGeoJSONジオメトリに変換するためのカスタムHive Serializer and Deserializer (SerDe)は必要です。そのためには、次の例のように、SerDeのデシリアライズ関数でSpatial Java APIを使用できます

@Override
public Object deserialize(Writable w) throws SerDeException {
Text rowText = (Text) w;
List<Text> row = new ArrayList<Text>(columnNames.size());

//default all values to null
for(int i=0;i<columnNames.size();i++){
row.add(null);
}

// Try parsing row into JSON object
JsonNode recordNode = null;

try {
String txt = rowText.toString().trim();
recordNode = jsonMapper.readTree(txt);
row.set(columnNames.indexOf("id"), new Text(recordNode.get("id").getTextValue()));
row.set(columnNames.indexOf("followers_count"), new Text(recordNode.get("followers_count").toString()));
row.set(columnNames.indexOf("friends_count"), new Text(recordNode.get("friends_count").toString()));
row.set(columnNames.indexOf("location"), new Text(recordNode.get("location").getTextValue()));
row.set(columnNames.indexOf("user_id"), new Text(recordNode.get("user_id").toString()));

Double longitude = recordNode.get("longitude").getDoubleValue();
Double latitude = recordNode.get("latitude").getDoubleValue();

//use the Spatial API to create the geometry
JGeometry geom = JGeometry.createPoint(new double[]{
longitude,
latitude},
2, //dimensions
8307 //SRID
);
//Transform the JGeometry to WKT
String geoWKT = new String(wkt.fromJGeometry(geom));
row.set(columnNames.indexOf("geometry"), new Text(geoWKT));
} catch (Exception e) {
throw new SerDeException("Exception parsing JSON: " +e.getMessage(), e);
}

return row;
}

前述の例では、ジオメトリをGeoJSON形式で返すために、置換元として次の部分を、

String geoWKT = new String(wkt.fromJGeometry(geom));
row.set(columnNames.indexOf("geometry"), new Text(geoWKT));

次のようにします。

row.set(columnNames.indexOf("geometry"), new Text(geom.toGeoJson()));

Spatial Java APIを使用してGeoJSON、WKTまたはESRI Shapefile内のデータを変換する別のSerDeの例は、フォルダ/opt/oracle/oracle-spatial-graph/spatial/vector/examples/hive/java/src/oracle/spatial/hadoop/vector/hive/java/src/serde内にあります

次の例では、Hive表に対して問い合せます。

select ID, FOLLOWERS_COUNT, FRIENDS_COUNT, LOCATION, USER_ID, GEOMETRY from CUST_TWEETS_HIVE_TAB limit 10;

出力は次のようになります。

6703    1    62    Hong Kong    3479846    POINT (114.18306 22.30693)
6702    57    166    Singapore    1765655    POINT (103.85387 1.29498)

- HDFSデータ・ポンプ・ファイルまたは区切りテキスト・ファイルの作成

- SQL Connector for HDFSの作成

3.3.1 HDFSデータ・ポンプ・ファイルまたは区切りテキスト・ファイルの作成

「Oracle Loader for Hadoopによって生成されたファイルを使用したOracle SQL Connector for HDFSの使用」のHive表を使用して、HDFSデータ・ポンプ・ファイルまたは区切りテキスト・ファイルを作成できます。

1. 次のように、Oracle Databaseに表を作成します。

CREATE TABLE tweets_t(id INTEGER
PRIMARY KEY, geometry VARCHAR2(4000), followers_count NUMBER,
friends_count NUMBER, location VARCHAR2(4000), user_id NUMBER);

この表は、ターゲット表として使用されます。Oracle Loader for HadoopはOracleデータベースの表のメタデータを使用して列名、データ型、パーティションおよび他の情報を識別します。簡単にするために、Hive表と同じ列(フィールド)を使用してこの表を作成します。外部表が作成された後、この表を削除することも、この表を使用して外部表からターゲット表に行を挿入することもできます。(ターゲット表の詳細は、「ターゲット表のメタデータについて」を参照してください。

2. 次の例のように、ローダー構成ファイルを作成します。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--                          Input settings                             -->
<property>
<name>mapreduce.inputformat.class</name>
<value>oracle.hadoop.loader.lib.input.HiveToAvroInputFormat</value>
</property>
<property>
<name>oracle.hadoop.loader.input.hive.databaseName</name>
<value>default</value>
</property>
<property>
<name>oracle.hadoop.loader.input.hive.tableName</name>
<value>CUST_TWEETS_HIVE_TAB</value>
</property>
<!--                          Output settings                             -->
<property>
<name>mapreduce.outputformat.class</name>
<value>oracle.hadoop.loader.lib.output.DataPumpOutputFormat</value>
</property>
<property>
<name>mapred.output.dir</name>
<value>/user/scott/data_output</value>
</property>
<!--                          Table information                            -->
<property>
<name>oracle.hadoop.loader.loaderMap.targetTable</name>
<value>tweets_t</value>
</property>
<!--                          Connection information                      -->
<property>
<name>oracle.hadoop.loader.connection.url</name>
<value>jdbc:oracle:thin:@//myhost:1521/myservicename</value>
</property>
<property>
<name>oracle.hadoop.loader.connection.user</name>
<value>scott</value>
</property>
<property>
<name>oracle.hadoop.loader.connection.password</name>
<value>welcome1</value>
<description> Having the password in cleartext is NOT RECOMMENDED. Use Oracle Wallet instead. </description>
</property>
</configuration>

この構成により、データ・ポンプ・ファイルがHDFSに作成されます。区切りテキスト・ファイルを出力として使用するには、置換元として次の部分を、

oracle.hadoop.loader.lib.output.DataPumpOutputFormat

次のようにします。

oracle.hadoop.loader.lib.output.DelimitedTextOutputFormat

3. 構成ファイルにtweets_hive_to_data_pump.xmlという名前を付けます。

4. データ・ポンプ・ファイルを作成します。

# Add HIVE_HOME/lib* and the Hive configuration directory to HADOOP_CLASSPATH.
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*:$HIVE_CONF_DIR
# Add Oracle Spatial libraries to HADOOP_CLASSPATH.
export ORACLE_SPATIAL_VECTOR_LIB_PATH=/opt/oracle/oracle-spatial-graph/spatial/vector/jlib

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$ORACLE_SPATIAL_VECTOR_LIB_PATH/ojdbc8.jar:$ORACLE_SPATIAL_VECTOR_LIB_PATH/sdoutl.jar:$ORACLE_SPATIAL_VECTOR_LIB_PATH/sdoapi.jar:$ORACLE_SPATIAL_VECTOR_LIB_PATH/sdohadoop-vector.jar:$ORACLE_SPATIAL_VECTOR_LIB_PATH/sdohadoop-vector-hive.jar

# The Oracle Spatial libraries need to be added to the libjars option as well.
export LIBJARS=$ORACLE_SPATIAL_VECTOR_LIB_PATH/ojdbc8.jar,$ORACLE_SPATIAL_VECTOR_LIB_PATH/sdoutl.jar,$ORACLE_SPATIAL_VECTOR_LIB_PATH/sdoapi.jar,$ORACLE_SPATIAL_VECTOR_LIB_PATH/sdohadoop-vector.jar,$ORACLE_SPATIAL_VECTOR_LIB_PATH/sdohadoop-vector-hive.jar

# And the following HIVE jar files have to be added to the libjars option.
export LIBJARS=$LIBJARS,$HIVE_HOME/lib/hive-exec-*.jar,$HIVE_HOME/lib/hive-metastore-*.jar,$HIVE_HOME/lib/libfb303*.jar

hadoop jar ${OLH_HOME}/jlib/oraloader.jar \
oracle.hadoop.loader.OraLoader \
-conf /home/oracle/tweets_hive_to_data_pump.xml \
-libjars $LIBJARS

前述の例の場合:

- 環境変数OLH_HOMEをインストール・ディレクトリに設定する必要があることを確認してください。

- Hiveインストール・ディレクトリを指し示すように環境変数HIVE_HOMEを設定します(/usr/lib/hiveなど)。

- Hive構成ディレクトリを指し示すように環境変数HIVE_CONF_DIRを設定します(/etc/hive/confなど)。

- 次のHive JARファイルを、カンマ区切りリスト形式で、hadoopコマンドの-libjarsオプションに追加します。アスタリスク(*)を完全なファイル名に置き換えます。

hive-exec-*.jar
hive-metastore-*.jar
libfb303*.jar

- oracle.kv.hadoop.hive.table.TableStorageHandlerを使用してHive表を(Oracle NoSQL Databaseから取得するデータを使用して)作成する場合、JARファイル$KVHOME/lib/kvclient.jar (KVHOMEは、Oracle NoSQL Databaseがインストールされているディレクトリです)をhadoopコマンドの-libjarsオプションに追加することも必要です。

- org.apache.hadoop.hive.hbase.HBaseStorageHandlerを使用してHive表を(Apache HBaseから取得するデータを使用して)作成する場合、次のJARファイルを、カンマ区切りリスト形式で、hadoopコマンドの-libjarsオプションに追加することも必要です。

$HIVE_HOME/lib/hbase-server.jar
$HIVE_HOME/lib/hive-hbase-handler.jar
$HIVE_HOME/lib/hbase-common.jar
$HIVE_HOME/lib/hbase-client.jar
$HIVE_HOME/lib/hbase-hadoop2-compat.jar
$HIVE_HOME/lib/hbase-hadoop-compat.jar
$HIVE_HOME/lib/hbase-protocol.jar
$HIVE_HOME/lib/htrace-core.jar

3.3.2 SQL Connector for HDFSの作成

SQL Connector fo HDFSを作成するには、このトピックの手順を実行します。

1. 次の例のように、SQL Connector for HDFSの構成ファイルを作成します。

<?xml version="1.0"?>
<configuration>
<property>
<name>oracle.hadoop.exttab.tableName</name>
<value>TWEETS_EXT_TAB_DP</value>
</property>
<property>
<name>oracle.hadoop.exttab.sourceType</name>
<value>datapump</value>
</property>
<property>
<name>oracle.hadoop.exttab.dataPaths</name>
<value>/user/scott/data_output/oraloader-0000*.dat</value>
</property>
<property>
<name>oracle.hadoop.connection.url</name>
<value>jdbc:oracle:thin:@//myhost:1521/myservicename</value>
</property>
<property>
<name>oracle.hadoop.connection.user</name>
<value>scott</value>
</property>
<property>
<name>oracle.hadoop.exttab.defaultDirectory</name>
<value>TWEETS_DT_DIR</value>
</property>
</configuration>

ファイルが区切りテキスト・ファイルである場合、「区切りテキスト・ファイルを使用したOracle SQL Connector for HDFSの使用」のステップを実行します。

2. 構成ファイルにtweets_ext_from_dp.xmlという名前を付けます。

3. 外部表を作成します。

hadoop jar $OSCH_HOME/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable \
-conf /home/oracle/tweets_ext_from_dp.xml\
-createTable

前述のコマンドでは、OSCH_HOME環境変数を作成することも、コマンドのOSCH_HOMEをOracle SQL Connector for HDFSのインストール・ディレクトリのフル・パスに置き換えることもできます。Oracle Big Data Applianceの場合、このディレクトリは/opt/oracle/orahdfs-versionです

これで、表TWEETS_EXT_TAB_DPに対して問い合せることが可能になります。データベース内の他の任意の表と同じように問い合せることができます。次に例を示します。

select count(*) from TWEETS_EXT_TAB_DP;

この表に対して次の例のような空間操作を実行し、映画館の半径4分の1マイル以内でツイートしているユーザーを取得できます。

select sdo_geom.SDO_DISTANCE(ci.geometry, SDO_GEOMETRY(tw.geometry, 8307), 0.5, 'UNIT=YARD'), ci.name, tw.user_id
from CINEMA ci, TWEETS_EXT_TAB_DP tw where SDO_WITHIN_DISTANCE(ci.geometry, SDO_GEOMETRY(tw.geometry, 8307), 'DISTANCE=200 UNIT=MILE') = 'TRUE';

この情報をさらに使用して広告カスタマイズすることもできます。

ジオメトリのSRIDは8307です。また、空間データがGeoJSON形式である場合、問合せは次のようにする必要があります。

select sdo_geom.SDO_DISTANCE(ci.geometry, SDO_UTIL.FROM_GEOJSON(tw.geometry, '', 8307), 0.5, 'UNIT=YARD'), ci.name, tw.user_id
from CINEMA ci, TWEETS_EXT_TAB_DP tw where SDO_WITHIN_DISTANCE(ci.geometry, SDO_UTIL.FROM_GEOJSON(tw.geometry, '', 8307), 'DISTANCE=200 UNIT=MILE') = 'TRUE';

3.4 Oracle Big Data SQLを使用したOracle DatabaseとのHDFS空間データの統合

Oracle Big Data SQLを使用して、HDFSとOracle Databaseとの間の空間データ・アクセスを簡略化できます。

Oracle Big Data SQL内の空間機能を有効にするには、ファイルbigdata.propertiesを更新し、末尾に次の行を追加します($ORACLE_SPATIAL_VECTOR_LIB_PATHはOracle Spatialライブラリへのパスに置き換えます)。

java.classpath.user=$ORACLE_SPATIAL_VECTOR_LIB_PATH/ojdbc8.jar:
$ORACLE_SPATIAL_VECTOR_LIB_PATH/sdoutl.jar: $ORACLE_SPATIAL_VECTOR_LIB_PATH/sdoapi.jar:
$ORACLE_SPATIAL_VECTOR_LIB_PATH/sdohadoop-vector.jar:
$ORACLE_SPATIAL_VECTOR_LIB_PATH/sdohadoop-vector-hive.jar
(Also add here jars containing custom SerDe and/or InputFormat specifications.)

ファイルがHDFS内にある場合、次のソリューションを使用できます。

- Big Data SQLを使用したHDFSファイル用のOracle外部表の作成

- Big Data SQLを使用したHive表の使用によるOracle外部表の作成

Oracle NoSQL DatabaseまたはApache HBaseから空間データにアクセスする場合、「Big Data SQLを使用したHive表の使用によるOracle外部表の作成」のソリューションを使用できます。

Oracle Loader for Hadoop (OLH)によって生成されたファイルを使用してOracle SQL Connector for HDFS (OSCH)を使用するには、OLHを使用してHDFSからOracle Databaseにデータを移動する方法を理解する必要があります。

Big Data Spatial and Graph空間データをデータベースに移動するには、変更が必要です。通常、このソリューションは、HDFS内の任意の種類のファイルまたは任意の種類のHiveデータに適用されます。空間情報は、ウェル・ノウン形式またはカスタム形式にすることができます。

最初は、空間情報がユーザー定義の形式で含まれるHDFS内のファイルから外部表を作成する方法の例です。HDFS内のファイルには次の形式のレコードが含まれることを前提とします。

{
"type":"Feature",
"id":"6703",
"followers_count":1,
"friends_count":62,
"location":"Hong Kong",
"user_id":3479846,
"longitude":114.18306,
"latitude":22.30693
}

{
"type":"Feature",
"id":"6702",
"followers_count":57,
"friends_count":166,
"location":"Singapore",
"user_id":1765655,
"longitude":103.85387,
"latitude":1.29498
}

これらのレコード用の表を作成するためのHiveコマンドは、次のとおりです。

add jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/ojdbc8.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdoutl.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdoapi.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdohadoop-vector.jar
/opt/oracle/oracle-spatial-graph/spatial/vector/jlib/sdohadoop-vector-hive.jar
… (add here jars containing custom SerDe and/or InputFormats);
CREATE EXTERNAL TABLE IF NOT EXISTS CUST_TWEETS_HIVE_TAB (id STRING, geometry STRING, followers_count STRING, friends_count STRING, location STRING, user_id STRING)
ROW FORMAT SERDE 'mypackage.TweetsSerDe'
STORED AS INPUTFORMAT 'oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '/user/scott/simple_tweets_data';

InputFormatオブジェクトoracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormatは、これらのレコードが厳密なGeoJSONでない場合でも、これらを読み込むことができます。このため、前述の例では、カスタムInputFormat仕様は必要ありません。ただし、経度および緯度をWKTまたはGeoJSONジオメトリに変換するためのカスタムHive Serializer and Deserializer (SerDe)は必要です。そのためには、次の例のように、SerDeのデシリアライズ関数でSpatial Java APIを使用できます

@Override
public Object deserialize(Writable w) throws SerDeException {
Text rowText = (Text) w;
List<Text> row = new ArrayList<Text>(columnNames.size());

//default all values to null
for(int i=0;i<columnNames.size();i++){
row.add(null);
}

// Try parsing row into JSON object
JsonNode recordNode = null;

try {
String txt = rowText.toString().trim();
recordNode = jsonMapper.readTree(txt);
row.set(columnNames.indexOf("id"), new Text(recordNode.get("id").getTextValue()));
row.set(columnNames.indexOf("followers_count"), new Text(recordNode.get("followers_count").toString()));
row.set(columnNames.indexOf("friends_count"), new Text(recordNode.get("friends_count").toString()));
row.set(columnNames.indexOf("location"), new Text(recordNode.get("location").getTextValue()));
row.set(columnNames.indexOf("user_id"), new Text(recordNode.get("user_id").toString()));

Double longitude = recordNode.get("longitude").getDoubleValue();
Double latitude = recordNode.get("latitude").getDoubleValue();

//use the Spatial API to create the geometry
JGeometry geom = JGeometry.createPoint(new double[]{
longitude,
latitude},
2, //dimensions
8307 //SRID
);
//Transform the JGeometry to WKT
String geoWKT = new String(wkt.fromJGeometry(geom));
row.set(columnNames.indexOf("geometry"), new Text(geoWKT));
} catch (Exception e) {
throw new SerDeException("Exception parsing JSON: " +e.getMessage(), e);
}

return row;
}

前述の例では、ジオメトリをGeoJSON形式で返すために、置換元として次の部分を、

String geoWKT = new String(wkt.fromJGeometry(geom));
row.set(columnNames.indexOf("geometry"), new Text(geoWKT));

次のようにします。

row.set(columnNames.indexOf("geometry"), new Text(geom.toGeoJson()));

Spatial Java APIを使用してGeoJSON、WKTまたはESRI Shapefile内のデータを変換する別のSerDeの例は、フォルダ/opt/oracle/oracle-spatial-graph/spatial/vector/examples/hive/java/src/oracle/spatial/hadoop/vector/hive/java/src/serde内にあります

次の例では、Hive表に対して問い合せます。

select ID, FOLLOWERS_COUNT, FRIENDS_COUNT, LOCATION, USER_ID, GEOMETRY from CUST_TWEETS_HIVE_TAB limit 10;

出力は次のようになります。

6703    1    62    Hong Kong    3479846    POINT (114.18306 22.30693)
6702    57    166    Singapore    1765655    POINT (103.85387 1.29498)

- Big Data SQLを使用したHDFSファイル用のOracle外部表の作成

- Big Data SQLを使用したHive表の使用によるOracle外部表の作成

3.4.1 Big Data SQLを使用したHDFSファイル用のOracle外部表の作成

HDFS内の任意の種類のファイル用としてOracle外部表を作成できます。空間情報は、ウェル・ノウン形式またはカスタム形式にすることができます。

ジオメトリ形式がWKTまたはGeoJSONでない場合、フォルダ/opt/oracle/oracle-spatial-graph/spatial/vector/examples/hive/java/src/oracle/spatial/hadoop/vector/hive/java/src/serde内に用意されているSerDeの例の1つを使用するか、「Oracle Loader for Hadoopによって生成されたファイルを使用したOracle SQL Connector for HDFSの使用」の例のようにカスタムSerDeを作成します。

その後、次の例のように、Oracle外部表を作成します。

CREATE TABLE SAMPLE_TWEETS (id VARCHAR2(4000),
geometry VARCHAR2(4000),
followers_count VARCHAR2(4000),
friends_count VARCHAR2(4000),
location VARCHAR2(4000), user_id VARCHAR2(4000)) ORGANIZATION EXTERNAL
(TYPE oracle_hdfs DEFAULT DIRECTORY DEFAULT_DIR
ACCESS PARAMETERS (
com.oracle.bigdata.rowformat: \
SERDE 'mypackage.TweetsSerDe'
com.oracle.bigdata.fileformat: \
INPUTFORMAT 'oracle.spatial.hadoop.vector.geojson.mapred.GeoJsonInputFormat' \
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' \
)
LOCATION ('/user/scott/simple_tweets_data/*.log'));

これで、表SAMPLE_TWEETSに対して問い合せることが可能になります。データベース内の他の任意の表と同じように問い合せることができます。次に例を示します。

select count(*) from SAMPLE_TWEETS;

この表に対して次の例のような空間操作を実行し、映画館の半径4分の1マイル以内でツイートしているユーザーを取得できます。

select sdo_geom.SDO_DISTANCE(ci.geometry, SDO_GEOMETRY(tw.geometry, 8307), 0.5, 'UNIT=YARD'), ci.name, tw.user_id
from CINEMA ci, SAMPLE_TWEETS tw where SDO_WITHIN_DISTANCE(ci.geometry, SDO_GEOMETRY(tw.geometry, 8307), 'DISTANCE=200 UNIT=MILE') = 'TRUE';

この情報をさらに使用して広告カスタマイズすることもできます。

ジオメトリのSRIDは8307です。また、空間データがGeoJSON形式である場合、問合せは次のようにする必要があります。

select sdo_geom.SDO_DISTANCE(ci.geometry, SDO_UTIL.FROM_GEOJSON(tw.geometry, '', 8307), 0.5, 'UNIT=YARD'), ci.name, tw.user_id
from CINEMA ci, SAMPLE_TWEETS tw where SDO_WITHIN_DISTANCE(ci.geometry, SDO_UTIL.FROM_GEOJSON(tw.geometry, '', 8307), 'DISTANCE=200 UNIT=MILE') = 'TRUE';

3.4.2 Big Data SQLを使用したHive表の使用によるOracle外部表の作成

Big Data SQLを使用してHive表を使用してOracle外部表を作成できます。空間情報は、ウェル・ノウン形式またはカスタム形式にすることができます。

Oracle外部表を作成するために使用するHive表は、「Oracle Loader for Hadoopによって生成されたファイルを使用したOracle SQL Connector for HDFSの使用」で説明されているように作成する必要があります。

Hive表Oracleを使用して作成できるOracle外部表を作成します。次に例を示します。

CREATE TABLE SAMPLE_TWEETS (id VARCHAR2(4000),  geometry VARCHAR2(4000),  followers_count VARCHAR2(4000),  friends_count VARCHAR2(4000),  location VARCHAR2(4000), user_id VARCHAR2(4000))  ORGANIZATION EXTERNAL
(TYPE ORACLE_HIVE
DEFAULT DIRECTORY DEFAULT_DIR
ACCESS PARAMETERS (
com.oracle.bigdata.cluster=cluster
com.oracle.bigdata.tablename=default.CUST_TWEETS_HIVE_TAB)
) PARALLEL 2 REJECT LIMIT UNLIMITED;

これで、表SAMPLE_TWEETSに対して問い合せることが可能になります。データベース内の他の任意の表と同じように問い合せることができます。次に例を示します。

select count(*) from SAMPLE_TWEETS;

この表に対して次の例のような空間操作を実行し、映画館の半径4分の1マイル以内でツイートしているユーザーを取得できます。

select sdo_geom.SDO_DISTANCE(ci.geometry, SDO_GEOMETRY(tw.geometry, 8307), 0.5, 'UNIT=YARD'), ci.name, tw.user_id
from CINEMA ci, SAMPLE_TWEETS tw where SDO_WITHIN_DISTANCE(ci.geometry, SDO_GEOMETRY(tw.geometry, 8307), 'DISTANCE=200 UNIT=MILE') = 'TRUE';

この情報をさらに使用して広告カスタマイズすることもできます。

ジオメトリのSRIDは8307です。また、空間データがGeoJSON形式である場合、問合せは次のようにする必要があります。

select sdo_geom.SDO_DISTANCE(ci.geometry, SDO_UTIL.FROM_GEOJSON(tw.geometry, '', 8307), 0.5, 'UNIT=YARD'), ci.name, tw.user_id
from CINEMA ci, SAMPLE_TWEETS tw where SDO_WITHIN_DISTANCE(ci.geometry, SDO_UTIL.FROM_GEOJSON(tw.geometry, '', 8307), 'DISTANCE=200 UNIT=MILE') = 'TRUE';

4 プロパティ・グラフ・サポートの構成

この章では、ビッグ・データ環境でプロパティ・グラフのサポートを構成する方法について説明します。

ここでは、ビッグ・データ・アプライアンス(「Oracle Big Data Appliance上でのOracle Big Data Spatial and Graphのインストール」を参照)、Apache Hadoopシステム(「CDHクラスタまたはその他ハードウェアでのプロパティ・グラフ・サポートのインストール」を参照)またはOracle NoSQL Databaseで、すでにインストールが実行されていると想定しています。

データベースおよびJavaの構成設定を変更することにより、プロパティ・グラフのパフォーマンスを改善できる可能性があります。提供する提案事項はガイドラインであり、ご使用のシステムを慎重かつ徹底的に評価した後にのみ従ってください。

- プロパティ・グラフと併用するためのApache HBaseのチューニング
Apache HBaseおよびJava仮想マシンのデフォルト構成を変更することにより、パフォーマンスを改善できます。

- プロパティ・グラフと併用するためのOracle NoSQL Databaseのチューニング
Oracle NoSQL Databaseから最高のパフォーマンスを得るには、次のようにします。

4.1 プロパティ・グラフと併用するためのApache HBaseのチューニング

Apache HBaseおよびJava仮想マシンのデフォルト構成を変更することにより、パフォーマンスを改善できます。

- Apache HBase構成の変更

- Javaメモリー設定の変更

4.1.1 Apache HBase構成の変更

Apache HBaseの構成を変更するには、この項の該当するCDHリリースに対する手順に従います。(個々の手順は、CDHリリースに応じて変わる可能性があります。)

CDH 5.2.x、CDH 5.3.xおよびCDH 5.4.xの場合:

1. adminユーザーとしてCloudera Managerにログインします。

2. 「Home」ページで、左側のサービスのリストから「HBase」をクリックします。

3. 「HBase」ページで、「Configuration」タブをクリックします。

4. 左側の「Category」パネルで、「Service-Wide」を展開して「Advanced」を選択します。

5. hbase-site.xmlのHBase Service Advanced Configuration Snippet (Safety Valve)の値を次のように編集します。

<property>
<name>hbase.regionserver.handler.count</name>
<value>32</value>
</property>
<property>
<name>hbase.hregion.max.filesize</name>
<value>1610612736</value>
</property>
<property>
<name>hbase.hregion.memstore.block.multiplier</name>
<value>4</value>
</property>
<property>
<name>hbase.hregion.memstore.flush.size</name>
<value>134217728</value>
</property>
<property>
<name>hbase.hstore.blockingStoreFiles</name>
<value>200</value></property>
<property>
<name>hbase.hstore.flusher.count</name>
<value>1</value>
</property>

このプロパティがすでに存在する場合は、必要に応じて値を置換してください。そうでない場合は、XMLプロパティの記述を追加してください。

6. 「Save Changes」をクリックします。

7. 「Actions」メニューを展開し、状況に応じて「Restart」または「Rolling Restart」オプションのうち、最適な方を選択します。

CDH 5.4.xの場合:

1. adminユーザーとしてCloudera Managerにログインします。

2. 「Home」ページで、左側のサービスのリストから「HBase」をクリックします。

3. 「HBase」ページで、「Configuration」タブをクリックします。

4. 「SCOPE」を開きます。

5. 「HBase (Service-wide)」をクリックし、ページの下部までスクロールして「Display All Entries」を選択します(「Display 25 Entries」ではありません)。

6. このページで、hbase-site.xmlのHBase Service Advanced Configuration Snippet (Safety Valve)を見つけて、次の<property>要素の値を入力します。

<property>
<name>hbase.regionserver.handler.count</name>
<value>32</value>
</property>
<property>
<name>hbase.hregion.max.filesize</name>
<value>1610612736</value>
</property>
<property>
<name>hbase.hregion.memstore.block.multiplier</name>
<value>4</value>
</property>
<property>
<name>hbase.hregion.memstore.flush.size</name>
<value>134217728</value>
</property>
<property>
<name>hbase.hstore.blockingStoreFiles</name>
<value>200</value></property>
<property>
<name>hbase.hstore.flusher.count</name>
<value>1</value>
</property>

このプロパティがすでに存在する場合は、必要に応じて値を置換してください。そうでない場合は、XMLプロパティの記述を追加してください。

7. 「Save Changes」をクリックします。

8. 「Actions」メニューを展開し、状況に応じて「Restart」または「Rolling Restart」オプションのうち、最適な方を選択します。

4.1.2 Javaメモリー設定の変更

Javaメモリー設定を変更するには、この項の該当するCDHリリースに対する手順に従います。(個々の手順は、CDHリリースに応じて変わる可能性があります。)

CDH 5.2.xおよびCDH 5.3.xの場合:

1. adminユーザーとしてCloudera Managerにログインします。

2. 「Home」ページで、左側のサービスのリストから「HBase」をクリックします。

3. 「HBase」ページで、「Configuration」タブをクリックします。

4. 「RegionServer Group」(デフォルトおよびその他)で、「Advanced」をクリックし、HBase RegionServerの「Java Configuration Options」で次の値を使用します。

-Xmn256m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly

5. 「Resource Management」をクリックし、HBase RegionServerの「Java Heap Size」に適切な値(18Gなど)を入力します。

6. 「Save Changes」をクリックします。

7. 「Actions」メニューを展開し、状況に応じて「Restart」または「Rolling Restart」オプションのうち、最適な方を選択します。

CDH 5.4.xの場合:

1. adminユーザーとしてCloudera Managerにログインします。

2. 「Home」ページで、左側のサービスのリストから「HBase」をクリックします。

3. 「HBase」ページで、「Configuration」タブをクリックします。

4. 「SCOPE」を開きます。

5. 「RegionServer」をクリックし、ページの下部までスクロールして「Display All Entries」を選択します(「Display 25 Entries」ではありません)。

6. このページで、「Java Configuration Options for HBase RegionServer」に次の値を入力します。

-Xmn256m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly

7. 「Java Heap Size of HBase RegionServer in Bytes」に適切な値(18Gなど)を入力します。

8. 「Save Changes」をクリックします。

9. 「Actions」メニューを展開し、状況に応じて「Restart」または「Rolling Restart」オプションのうち、最適な方を選択します。

関連項目:

Javaガベージ・コレクションの詳細は、次を参照してください。

http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/

すべての設定の説明は、Javaツール・リファレンスを参照してください。

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

4.2 プロパティ・グラフと併用するためのOracle NoSQL Databaseのチューニング

Oracle NoSQL Databaseから最高のパフォーマンスを得るには、次のようにします。

- レプリケーション・グループ(シャード)がバランス調整されていることを確認します。

- ユーザー・プロセス・リソース制限の設定を調整します(ulimit)。次に例を示します。

ulimit -u 131072

- レプリケーション・ノード上のJava仮想マシン(JVM)のヒープ・サイズを、Bツリー索引がメモリーに収まるように設定します。
ヒープ・サイズを設定するには、makebookconfigコマンドの-memory_mbオプションまたはストレージ・ノードのmemory_mbパラメータを使用します。

Oracle NoSQL Databaseでは、ストレージ・ノードで実行するプロセスのヒープ・サイズとしてmemory_mbの85%を使用します。ストレージ・ノードが複数のレプリケーション・ノードをホストしている場合、ヒープはそれらの間で均等に分割されます。各レプリケーション・ノードは、ヒープの70%であるキャッシュを使用します。

たとえば、2つのレプリケーション・ノードをホストしているストレージ・ノードのmemory_mbを3000MBに設定した場合、各レプリケーション・ノードは次のようになります。

- 1275MBヒープ、(3000MB * .85)/2で計算

- 892MBキャッシュ、1275MB * .70で計算

関連項目:

Oracle NoSQL Database FAQ

http://www.oracle.com/technetwork/products/nosqldb/learnmore/nosqldb-faq-518364.html#HowdoesNoSQLDBbudgetmemory

5 ビッグ・データ環境でのプロパティ・グラフの使用

この章では、ビッグ・データ環境でのプロパティ・グラフ・データの作成、格納および操作に関する概念と使用方法の情報を提供します。

- プロパティ・グラフについて
プロパティ・グラフでは、プロパティ(キー値ペア)をグラフの頂点およびエッジに簡単に関連付けることができ、大量のデータ・セット間の関係に基づく分析操作が可能になります。

- プロパティ・グラフのデータ形式について
次のグラフ形式がサポートされています。

- プロパティ・グラフの開始
プロパティ・グラフを開始するには、次の主要手順に従います。

- プロパティ・グラフ・データ用のJava APIの使用
プロパティ・グラフの作成には、Java APIを使用したプロパティ・グラフとそのオブジェクトの作成が含まれます。

- プロパティ・グラフ・データのテキスト索引付けの管理
Oracle Big Data Spatial and Graphの索引付けは、特定のキー/値またはキー/テキスト・ペア別に要素を高速に読み取ることを可能にします。これらの索引は、要素タイプ(頂点またはエッジ)、キー(および値)のセットおよび索引タイプに基づいて作成されます。

- PGQLを使用したプロパティ・グラフ・データに対する問合せ
Oracle Big Data Spatial and Graphは、豊富なグラフ・パターン一致機能セットをサポートしています。

- プロパティ・グラフ・データを使用したApache Sparkの使用
Apache Sparkは、大量のデータを効率的に処理することを可能にし、データを処理するためのライブラリ・セット(SQL、MLlib、Spark StreamingおよびDataFrame)が用意されています。Apache Sparkでは、HDFS、Oracle NoSQL DatabaseおよびApache HBaseなどの様々なソースからデータを読み込むことができます。

- セキュアなOracle NoSQL Databaseのサポート
Oracle Big Data Spatial and Graphプロパティ・グラフ・サポートは、Oracle NoSQL Databaseのセキュア・インストールと非セキュア・インストールの両方で機能します。このトピックでは、セキュアなOracle NoSQL Database設定でプロパティ・グラフ機能を使用する方法についての情報を提供します。

- Apache HBaseに格納されているグラフでのセキュリティの実装
Oracle Big Data Spatial and Graphのプロパティ・グラフを保護するために、Apache HBaseでKerberos認証を使用することが推奨されます。

- プロパティ・グラフ・データでのGroovyシェルの使用
Oracle Big Data Spatial and Graphプロパティ・グラフ・サポートには、組込みのGroovyシェル(オリジナルのGremlin Groovyシェル・スクリプトに基づく)が含まれています。このコマンドライン・シェル・インタフェースを使用して、Java APIを参照できます。

- プロパティ・グラフ・データのRESTサポート
一連のRESTful APIによって、HTTP/RESTプロトコルを介してデータ・アクセス・レイヤーJava APIが公開されます。

- サンプル・プログラムの探索
ソフトウェア・インストールには、プロパティ・グラフの作成および操作方法を習得するために使用できる、プログラムの例のディレクトリが含まれています。

- Oracleフラット・ファイル形式の定義
プロパティ・グラフは、頂点用の記述ファイルとエッジ用の記述ファイルの2つのフラット・ファイルに定義できます。

- Pythonユーザー・インタフェースの例
Oracle Big Data Spatial and Graphのプロパティ・グラフ・サポートには、Pythonユーザー・インタフェースの例が含まれています。これは、様々なプロパティ・グラフ操作を実行するPythonスクリプトおよびモジュールの例のセットを起動できます。

- iPython Notebookユーザー・インタフェースの例
主なプロパティ・グラフ機能に対する次のタイプのiPython Notebookシェル・インタフェースのサポートが提供されています。

5.1 プロパティ・グラフについて

プロパティ・グラフでは、プロパティ(キー値ペア)をグラフの頂点およびエッジに簡単に関連付けることができ、大量のデータ・セット間の関係に基づく分析操作が可能になります。

- プロパティ・グラフとは

- プロパティ・グラフのビッグ・データ・サポートとは

5.1.1 プロパティ・グラフとは

プロパティ・グラフは、オブジェクトまたは頂点のセットと、これらのオブジェクトをつなぐ矢印またはエッジのセットで構成されます。頂点とエッジには複数のプロパティを含めることができ、それらはキー値ペアとして表されます。

各頂点には一意の識別子があり、次のものを含めることができます。

- 出力エッジのセット

- 入力エッジのセット

- プロパティの集まり

各エッジには一意の識別子があり、次のものを含めることができます。

- 出力頂点

- 入力頂点

- 2つの頂点間の関係を示すテキスト・ラベル

- プロパティの集まり

図5-1は、2つの頂点と1つのエッジを持つ非常に単純なプロパティ・グラフを示しています。2つの頂点には、識別子1および2があります。両方の頂点には、プロパティnameおよびageがあります。エッジは、出力頂点1から入力頂点2に向かっています。このエッジは、テキスト・ラベルknowsと、頂点1と2の関係のタイプを識別するプロパティtypeで表されます。

図5-1 単純なプロパティ・グラフの例

Big Data Spatial and Graphプロパティ・グラフ・データ・モデルには標準が用意されていませんが、これはW3C標準ベースのResource Description Framework (RDF)グラフ・データ・モデルに似ています。プロパティ・グラフ・データ・モデルはRDFよりも単純であり、精密ではありません。このような相違点により、これは次のようなユースケースでよい候補になります。

- ソーシャル・ネットワークでの影響の特定

- トレンドおよび顧客行動の予測

- パターン一致に基づく関係の発見

- キャンペーンをカスタマイズするためのクラスタの特定

注意:

データベース側でOracleがサポートしているプロパティ・グラフ・データ・モデルでは、頂点にラベルを使用することはできません。ただし、「頂点のラベルの指定」で説明されているように、指定した頂点プロパティの値を1つ以上のラベルとして扱うことができます。

5.1.2 プロパティ・グラフのビッグ・データ・サポートとは

プロパティ・グラフは、HadoopおよびOracle NoSQL Databaseのビッグ・データに対してサポートされます。このサポートは、データ・アクセス・レイヤーと分析レイヤーで構成されます。Hadoopでのデータベースの選択肢により、スケーラブルで一貫したストレージ管理が提供されます。

図5-2は、Oracleプロパティ・グラフのアーキテクチャを示しています。

図5-2 Oracleプロパティ・グラフのアーキテクチャ

- インメモリー・アナリスト

- データ・アクセス・レイヤー

- ストレージ管理

- RESTful Webサービス

5.1.2.1 インメモリー・アナリスト

インメモリー・アナリスト・レイヤーでは、パラレル・インメモリー実行を使用してプロパティ・グループを分析できます。これは、パス計算、ランキング、コミュニティ検出、推奨ムを含む、35を超える分析機能を提供します。

5.1.2.2 データ・アクセス・レイヤー

データ・アクセス・レイヤーは、プロパティ・グラフの作成および削除、頂点とエッジの追加および削除、キー値ペアを使用した頂点とエッジの検索、テキスト索引の作成、およびその他の操作の実行に使用できる、Java APIのセットを提供します。Java APIには、プロパティ・グラフ・データ・モデル用のTinkerPop Blueprintsグラフ・インタフェースの実装が含まれています。また、これらのAPIは、広く普及しているオープンソースのテキスト索引付けおよび検索エンジンであるApache LuceneおよびApache SolrCloudと統合されています。

5.1.2.3 ストレージ管理

プロパティ・グラフは、Oracle NoSQL DatabaseまたはApache HBaseのいずれかに格納できます。これらのデータベースは両方とも成熟しており、スケーラブルで、効率的なナビゲーション、問合せおよび分析をサポートします。両方とも、プロパティ・グラフの頂点およびエッジをモデル化するために表を使用します。

5.1.2.4 RESTful Webサービス

RESTful Webサービスを使用して、グラフ・データにアクセスしてグラフ操作を実行することもできます。たとえば、Linux curlコマンドを使用して、頂点とエッジを取得したり、グラフ要素を追加および削除したりすることができます。

5.2 プロパティ・グラフのデータ形式について

次のグラフ形式がサポートされます。

- GraphMLデータ形式

- GraphSONデータ形式

- GMLデータ形式

- Oracleフラット・ファイル形式

5.2.1 GraphMLデータ形式

GraphMLファイル形式では、XMLを使用してグラフを記述します。例5-1は、図5-1に示されているプロパティ・グラフのGraphMLの記述を示しています。

関連項目:

『The GraphML File Format』

http://graphml.graphdrawing.org/

例5-1 単純なプロパティ・グラフのGraphMLの記述

<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
<key id="name" for="node" attr.name="name" attr.type="string"/>
<key id="age" for="node" attr.name="age" attr.type="int"/>
<key id="type" for="edge" attr.name="type" attr.type="string"/>
<graph id="PG" edgedefault="directed">
<node id="1">
<data key="name">Alice</data>
<data key="age">31</data>
</node>
<node id="2">
<data key="name">Bob</data>
<data key="age">27</data>
</node>
<edge id="3" source="1" target="2" label="knows">
<data key="type">friends</data>
</edge>
</graph>
</graphml>

5.2.2 GraphSONデータ形式

GraphSONファイル形式では、JavaScript Object Notation (JSON)に基づいてグラフを記述します。例5-2は、図5-1に示されているプロパティ・グラフのGraphSONの記述を示しています。

関連項目:

『GraphSON Reader and Writer Library』

https://github.com/tinkerpop/blueprints/wiki/GraphSON-Reader-and-Writer-Library

例5-2 単純なプロパティ・グラフのGraphSONの記述

{
"graph": {
"mode":"NORMAL",
"vertices": [
{
"name": "Alice",
"age": 31,
"_id": "1",
"_type": "vertex"
},
{
"name": "Bob",
"age": 27,
"_id": "2",
"_type": "vertex"
}
],
"edges": [
{
"type": "friends",
"_id": "3",
"_type": "edge",
"_outV": "1",
"_inV": "2",
"_label": "knows"
}
]
}
}

5.2.3 GMLデータ形式

Graph Modeling Language (GML)ファイル形式では、ASCIIを使用してグラフを記述します。例5-3は、図5-1に示されているプロパティ・グラフのGMLの記述を示しています。

関連項目:

『GML: A Portable Graph File Format』、Michael Himsolt著

http://www.fim.uni-passau.de/fileadmin/files/lehrstuhl/brandenburg/projekte/gml/gml-technical-report.pdf

例5-3 単純なプロパティ・グラフのGMLの記述

graph [
comment "Simple property graph"
directed 1
IsPlanar 1
node [
id 1
label "1"
name "Alice"
age 31
]
node [
id 2
label "2"
name "Bob"
age 27
]
edge [
source 1
target 2
label "knows"
type "friends"
]
]

5.2.4 Oracleフラット・ファイル形式

Oracleフラット・ファイル形式はプロパティ・グラフのみを記述します。これは、その他のファイル形式よりも正確で、より優れたデータ型サポートを提供します。Oracleフラット・ファイル形式は、グラフを記述するために、頂点用とエッジ用にそれぞれ1つずつ、2つのファイルを使用します。レコードのフィールドはカンマで区切られます。

例5-4は、図5-1に示されているプロパティ・グラフを記述するOracleフラット・ファイルを示しています。

関連項目:

「Oracleフラット・ファイル形式の定義」

例5-4 単純なプロパティ・グラフのOracleフラット・ファイルの記述

頂点ファイル:

1,name,1,Alice,,
1,age,2,,31,
2,name,1,Bob,,
2,age,2,,27,

エッジ・ファイル:

1,1,2,knows,type,1,friends,,

5.3 プロパティ・グラフの開始

プロパティ・グラフを開始するには、次の主要手順に従います。

1. プロパティ・グラフを初めて使用する際、ソフトウェアがインストールされ、稼働可能であることを確認します。

2. Java APIで提供されるクラスを使用して、Javaプログラムを作成します。

「プロパティ・グラフ・データ用のJava APIの使用」を参照してください。

5.4 プロパティ・グラフ・データ用のJava APIの使用

プロパティ・グラフの作成には、Java APIを使用したプロパティ・グラフとそのオブジェクトの作成が含まれます。

- Java APIの概要

- グラフ・データのパラレル・ロード
グラフ・データのパラレル・ロードを実行するために、Java APIが提供されています。

- プロパティ・グラフ・インスタンスのオープンおよびクローズ

- 頂点の作成

- エッジの作成

- 頂点およびエッジの削除

- データベースから埋込みインメモリー・アナリストへのグラフの読込み

- 頂点のラベルの指定

- インメモリー・グラフの構築

- プロパティ・グラフの削除

5.4.1 Java APIの概要

プロパティ・グラフで使用できるJava APIには、次のものが含まれます。

- Oracle Big Data Spatial and Graph Java API

- TinkerPop Blueprints Java API

- Apache Hadoop Java API

- Oracle NoSQL Database Java API

- Apache HBase Java API

5.4.1.1 Oracle Big Data Spatial and Graph Java API

Oracle Big Data Spatial and Graphのプロパティ・グラフ・サポートは、Apache HBaseおよびOracle NoSQL Database用のデータベース固有のAPIを提供します。データ・アクセス・レイヤーAPI (oracle.pg.*)は、Oracle NoSQL DatabaseおよびApache HBaseに格納されているプロパティ・グラフ用のTinkerPop Blueprints API、テキスト検索および索引付けを実装します。

Oracle Big Data Spatial and Graph APIを使用するには、次のクラスをJavaプログラムにインポートします。

import oracle.pg.nosql.*; // or oracle.pg.hbase.*
import oracle.pgx.config.*;
import oracle.pgx.common.types.*;

TinkerPop Blueprints Java APIも含めます。

関連項目:

Oracle Big Data Spatial and Graph Java APIリファレンス

5.4.1.2 TinkerPop Blueprints Java API

TinkerPop Blueprintsはプロパティ・グラフ・データ・モデルをサポートします。このAPIは、主にBig Data Spatial and Graphのデータ・アクセス・レイヤーJava APIを介して使用する、グラフ操作のためのユーティリティを提供します。

Blueprints APIを使用するには、次のクラスをJavaプログラムにインポートします。

import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.Edge;

関連項目:

『Blueprints: A Property Graph Model Interface API』

http://www.tinkerpop.com/docs/javadocs/blueprints/2.3.0/index.html

5.4.1.3 Apache Hadoop Java API

Apache Hadoop Java APIを使用すると、JavaコードをHadoop分散フレームワーク内で実行するMapReduceプログラムとして作成できます。

Hadoop Java APIを使用するには、次のクラスをJavaプログラムにインポートします。次に例を示します。

import org.apache.hadoop.conf.Configuration;

関連項目:

『Apache Hadoop Main 2.5.0-cdh5.3.2 API』

http://archive.cloudera.com/cdh5/cdh/5/hadoop/api/

5.4.1.4 Oracle NoSQL Database Java API

The Oracle NoSQL Database APIを使用すると、キー値(KV)ストアを作成および移入し、Hadoop、HiveおよびOracle NoSQL Databaseへのインタフェースを提供できます。

Oracle NoSQL Databaseをグラフ・データ・ストアとして使用するには、次のクラスをJavaプログラムにインポートします。次に例を示します。

import oracle.kv.*;
import oracle.kv.table.TableOperation;

関連項目:

Oracle NoSQL Database Java APIリファレンス

http://docs.oracle.com/cd/NOSQL/html/javadoc/

5.4.1.5 Apache HBase Java API

Apache HBase APIを使用すると、キー値ペアを作成および操作できます。

HBaseをグラフ・データ・ストアとして使用するには、次のクラスをJavaプログラムにインポートします。次に例を示します。

import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.conf.Configuration;

関連項目:

『HBase 0.98.6-cdh5.3.2 API』

http://archive.cloudera.com/cdh5/cdh/5/hbase/apidocs/index.html?overview-summary.html

5.4.2 グラフ・データのパラレル・ロード

グラフ・データのパラレル・ロードを実行するために、Java APIが提供されています。

頂点ファイル(または入力ストリーム)のセットとエッジ・ファイル(または入力ストリーム)のセットがある場合、それらを複数のチャンクに分割し、並列でデータベースにロードできます。チャンクの数は、ユーザーが指定した並列度(DOP)によって決定されます。

並列性は、頂点およびエッジ・フラット・ファイルを複数のチャンクに分割するスプリッタ・スレッドと、別個のデータベース接続を使用して各チャンクをデータベースにロードするローダー・スレッドによって実現されます。スプリッタ・スレッドとローダー・スレッドを接続するために、Javaパイプが使用されます -- スプリッタ: PipedOutputStreamおよびローダー: PipedInputStream。

データ・ロードAPIの最も単純な使用方法は、1つのプロパティ・グラフ・インスタンス、1つの頂点ファイル、1つのエッジ・ファイルおよびDOPを指定することです。

次のロード・プロセスの例では、最適化されたOracleフラット・ファイル形式の頂点ファイルおよびエッジ・ファイルに格納されたグラフ・データをロードし、並列度48でロードを実行します。

opgdl = OraclePropertyGraphDataLoader.getInstance();
vfile = "../../data/connections.opv";
efile = "../../data/connections.ope";
opgdl.loadData(opg, vfile, efile, 48);

- パーティションを使用したパラレル・データ・ロード

- ファインチューニングを使用したパラレル・データ・ロード

- 複数のファイルを使用したパラレル・データ・ロード

- グラフ・データのパラレル取得

- サブグラフ抽出のための要素フィルタ・コールバックの使用

- プロパティ・グラフ・データの読取りでの最適化フラグの使用

- プロパティ・グラフのサブグラフの属性の追加および削除

- プロパティ・グラフ・メタデータの取得

5.4.2.1 パーティションを使用したパラレル・データ・ロード

データ・ロードAPIを使用することにより、複数のパーティションを使用してデータをデータベースにロードできます。このAPIは、プロパティ・グラフ、頂点ファイル、エッジ・ファイル、DOP、パーティション合計数およびパーティション・オフセット(0からパーティション合計数 - 1まで)を必要とします。たとえば、2つのパーティションを使用してデータをロードするには、パーティション・オフセットは0および1である必要があります。つまり、グラフ全体をロードするために2つのデータ・ロードAPIコールがあり、これら2つのAPIコールの相違点は、パーティション・オフセット(0および1)のみになります。

次のコード・フラグメントは、4つのパーティションを使用してグラフ・データをロードします。データ・ローダーの各コールは、単一システム上または複数のシステム上の別々のJavaクライアントを使用して処理できます。

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(
args, szGraphName);

int totalPartitions = 4;
int dop= 32; // degree of parallelism for each client.

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";
SimpleLogBasedDataLoaderListenerImpl dll = SimpleLogBasedDataLoaderListenerImpl.getInstance(100 /* frequency */,
true /* Continue on error */);

// Run the data loading using 4 partitions (Each call can be run from a
// separate Java Client)

// Partition 1
OraclePropertyGraphDataLoader opgdlP1 = OraclePropertyGraphDataLoader.getInstance();
opgdlP1.loadData(opg, szOPVFile, szOPEFile, dop,
4 /* Total number of partitions, default 1 */,
0 /* Partition to load (from 0 to totalPartitions - 1, default 0 */,
dll);

// Partition 2
OraclePropertyGraphDataLoader opgdlP2 = OraclePropertyGraphDataLoader.getInstance();
opgdlP2.loadData(opg, szOPVFile, szOPEFile, dop,  4 /* Total number of partitions, default 1 */,
1 /* Partition to load (from 0 to totalPartitions - 1, default 0 */, dll);

// Partition 3
OraclePropertyGraphDataLoader opgdlP3 = OraclePropertyGraphDataLoader.getInstance();
opgdlP3.loadData(opg, szOPVFile, szOPEFile, dop,  4 /* Total number of partitions, default 1 */,
2 /* Partition to load (from 0 to totalPartitions - 1, default 0 */, dll);

// Partition 4
OraclePropertyGraphDataLoader opgdlP4 = OraclePropertyGraphDataLoader.getInstance();
opgdlP4.loadData(opg, szOPVFile, szOPEFile, dop,  4 /* Total number of partitions, default 1 */,
3 /* Partition to load (from 0 to totalPartitions - 1, default 0 */, dll);

5.4.2.2 ファインチューニングを使用したパラレル・データ・ロード

データ・ロードAPIは、ロードされるソース頂点ファイルおよびエッジ・ファイル内のこれらの行のファインチューニングもサポートします。頂点(またはエッジ)オフセット行数と頂点(またはエッジ)最大行数を指定できます。オフセット行数から最大行数までのデータがロードされます。最大行数が-1である場合、ロード・プロセスはファイルの終わりに達するまでデータをスキャンします。

次のコード・フラグメントは、ファインチューニングを使用してグラフ・データをロードします。

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(
args, szGraphName);

int totalPartitions = 4;
int dop= 32; // degree of parallelism for each client.

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";
SimpleLogBasedDataLoaderListenerImpl dll = SimpleLogBasedDataLoaderListenerImpl.getInstance(100 /* frequency */,
true /* Continue on error */);

// Run the data loading using fine tuning
long lVertexOffsetlines = 0;
long lEdgeOffsetlines = 0;
long lVertexMaxlines = 100;
long lEdgeMaxlines = 100;
int totalPartitions = 1;
int idPartition = 0;

OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile,
lVertexOffsetlines /* offset of lines to start loading
from partition, default 0*/,
lEdgeOffsetlines /* offset of lines to start loading
from partition, default 0*/,
lVertexMaxlines /* maximum number of lines to start loading
from partition, default -1 (all lines in partition)*/,
lEdgeMaxlines /* maximun number of lines to start loading
from partition, default -1 (all lines in partition)*/,
dop,
totalPartitions /* Total number of partitions, default 1 */,
idPartition /* Partition to load (from 0 to totalPartitions - 1,
default 0 */,
dll);

5.4.2.3 複数のファイルを使用したパラレル・データ・ロード

Oracle Big Data Spatial and Graphは、データベースへの複数の頂点ファイルおよび複数のエッジ・ファイルのロードもサポートします。指定された頂点ファイルがDOPチャンクに分割され、DOPスレッドを使用してデータベースに並列にロードされます。同様に、複数のエッジ・ファイルも分割されて、並列にロードされます。

次のコード・フラグメントは、パラレル・データ・ロードAPIを使用して、複数の頂点ファン・ファイルおよびエッジ・ファイルを並列にロードします。この例では、入力ファイルを保持するために2つの文字列配列szOPVFilesおよびszOPEFilesを使用しています。この例では1つの頂点ファイルと1つのエッジ・ファイルのみを使用していますが、これら2つの配列に複数の頂点ファイルと複数のエッジ・ファイルを指定できます。

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(
args, szGraphName);

String[] szOPVFiles = new String[] {"../../data/connections.opv"};
String[] szOPEFiles = new String[] {"../../data/connections.ope"};

// Clear existing vertices/edges in the property graph
opg.clearRepository();
opg.setQueueSize(100); // 100 elements

// This object will handle parallel data loading over the property graph
OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance();

opgdl.loadData(opg, szOPVFiles, szOPEFiles, dop);

System.out.println("Total vertices: " + opg.countVertices());
System.out.println("Total edges: " + opg.countEdges());

5.4.2.4 グラフ・データのパラレル取得

プロパティ・グラフのパラレル問合せは、頂点(またはエッジ)のパラレル・スキャンを実行するための単純なJava APIを提供します。パラレル取得は、バックエンド・データベースとの分割間でのデータの配分を利用する最適化されたソリューションであり、各分割は別個のデータベース接続を使用して問い合せられます。

パラレル取得では、各要素が特定の分割からのすべての頂点(またはエッジ)を保持する配列が生成されます。問い合せられたシャードのサブセットは、特定の開始分割IDと指定された接続の配列のサイズによって分離されます。これにより、サブセットは[開始, 開始 - 1 + 接続の配列のサイズ]の範囲内の分割を考慮します。N分割を含む頂点表にあるすべての分割に、([0, N - 1]の範囲の)整数IDが割り当てられることに注意してください。

次のコードは、Apache HBaseを使用してプロパティ・グラフをロードし、接続の配列を開き、開いた接続を使用してパラレル問合せを実行してすべての頂点およびエッジを取得します。getVerticesPartitioned (getEdgesPartitioned)メソッドの呼出し数は、分割の合計数と使用される接続の数によって制御されます。

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(
args, szGraphName);

// Clear existing vertices/edges in the property graph
opg.clearRepository();

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";

// This object will handle parallel data loading
OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);

// Create connections used in parallel query
HConnection[] hConns= new HConnection[dop];
for (int i = 0; i < dop; i++) {
Configuration conf_new =
HBaseConfiguration.create(opg.getConfiguration());
hConns[i] = HConnectionManager.createConnection(conf_new);
}

long lCountV = 0;
// Iterate over all the vertices’ splits to count all the vertices
for (int split = 0; split < opg.getVertexTableSplits();
split += dop) {
Iterable<Vertex>[] iterables
= opg.getVerticesPartitioned(hConns /* Connection array */,
true /* skip store to cache */,
split /* starting split */);
lCountV += consumeIterables(iterables); /* consume iterables using
threads */
}

// Count all vertices
System.out.println("Vertices found using parallel query: " + lCountV);

long lCountE = 0;
// Iterate over all the edges’ splits to count all the edges
for (int split = 0; split < opg.getEdgeTableSplits();
split += dop) {
Iterable<Edge>[] iterables
= opg.getEdgesPartitioned(hConns /* Connection array */,
true /* skip store to cache */,
split /* starting split */);
lCountE += consumeIterables(iterables); /* consume iterables using
threads */
}

// Count all edges
System.out.println("Edges found using parallel query: " + lCountE);

// Close the connections to the database after completed
for (int idx = 0; idx < hConns.length; idx++) {
hConns[idx].close();
}

Apache HBaseのかわりにOracle NoSQL Database接続を使用してプロパティ・グラフをロードするには、次のコードを使用する必要があります。

// Create connections used in parallel query
hConns = new KVStoreConfig[dop];
kvsc = opg.getKVStoreConfig();

for (i = 0; i < dop; i++) {hConns[i] = kvsc.clone(); }
opg.setNumSplits(dop);

5.4.2.5 サブグラフ抽出のための要素フィルタ・コールバックの使用

Oracle Big Data Spatial and Graphは、ユーザー定義の要素フィルタ・コールバックを使用した、容易なサブグラフ抽出のサポートを提供します。要素フィルタ・コールバックは、サブグラフに頂点(またはエッジ)を保持するために、頂点(またはエッジ)が満たす必要のある条件セットを定義します。ユーザーはVertexFilterCallbackおよびEdgeFilterCallback APIインタフェースを実装することによって、独自の要素フィルタを定義できます。

次のコード・フラグメントは、頂点が政治的役割を持たず、その出生地が米国であるかどうかを検証するVertexFilterCallbackを実装します。

/**
* VertexFilterCallback to retrieve a vertex from the United States
* that does not have a political role
*/
private static class NonPoliticianFilterCallback
implements VertexFilterCallback
{
@Override
public boolean keepVertex(OracleVertexBase vertex)
{
String country = vertex.getProperty("country");
String role = vertex.getProperty("role");

if (country != null && country.equals("United States")) {
if (role == null || !role.toLowerCase().contains("political")) {
return true;
}
}

return false;
}

public static NonPoliticianFilterCallback getInstance()
{
return new NonPoliticianFilterCallback();
}
}

次のコード・フラグメントは、VertexFilterCallbackを使用して特定の入力頂点に接続しているエッジのうち、その接続が政治家ではなく米国出身であるエッジのみを保持するEdgeFilterCallbackを実装します。

/**
* EdgeFilterCallback to retrieve all edges connected to an input
* vertex with "collaborates" label, and whose vertex is from the
* United States with a role different than political
*/
private static class CollaboratorsFilterCallback
implements EdgeFilterCallback
{
private VertexFilterCallback m_vfc;
private Vertex m_startV;

public CollaboratorsFilterCallback(VertexFilterCallback vfc,
Vertex v)
{
m_vfc = vfc;
m_startV = v;
}

@Override
public boolean keepEdge(OracleEdgeBase edge)
{
if ("collaborates".equals(edge.getLabel())) {
if (edge.getVertex(Direction.IN).equals(m_startV) &&
m_vfc.keepVertex((OracleVertex)
edge.getVertex(Direction.OUT))) {
return true;
}
else if (edge.getVertex(Direction.OUT).equals(m_startV) &&
m_vfc.keepVertex((OracleVertex)
edge.getVertex(Direction.IN))) {
return true;
}
}

return false;
}

public static CollaboratorsFilterCallback
getInstance(VertexFilterCallback vfc, Vertex v)
{
return new CollaboratorsFilterCallback(vfc, v);
}

}

前に定義したフィルタ・コールバックを使用して、次のコード・フラグメントは、プロパティ・グラフをロードし、フィルタ・コールバックのインスタンスを作成し、その後に政治家ではなく米国出身であるBarack Obamaのすべての協力者を取得します。

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(
args, szGraphName);

// Clear existing vertices/edges in the property graph
opg.clearRepository();

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";

// This object will handle parallel data loading
OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);

// VertexFilterCallback to retrieve all people from the United States // who are not politicians
NonPoliticianFilterCallback npvfc = NonPoliticianFilterCallback.getInstance();

// Initial vertex: Barack Obama
Vertex v = opg.getVertices("name", "Barack Obama").iterator().next();

// EdgeFilterCallback to retrieve all collaborators of Barack Obama
// from the United States who are not politicians
CollaboratorsFilterCallback cefc = CollaboratorsFilterCallback.getInstance(npvfc, v);

Iterable<<Edge> obamaCollabs = opg.getEdges((String[])null /* Match any
of the properties */,
cefc /* Match the
EdgeFilterCallback */
);
Iterator<<Edge> iter = obamaCollabs.iterator();

System.out.println("\n\n--------Collaborators of Barack Obama from " +
" the US and non-politician\n\n");
long countV = 0;
while (iter.hasNext()) {
Edge edge = iter.next(); // get the edge
// check if obama is the IN vertex
if (edge.getVertex(Direction.IN).equals(v)) {
System.out.println(edge.getVertex(Direction.OUT) + "(Edge ID: " +
edge.getId() + ")"); // get out vertex
}
else {
System.out.println(edge.getVertex(Direction.IN)+ "(Edge ID: " +
edge.getId() + ")"); // get in vertex
}

countV++;
}

デフォルトでは、すべての頂点の取得、すべてのエッジの取得(および並列アプローチ)などのすべての読取り操作は、opg.setVertexFilterCallback(vfc)およびopg.setEdgeFilterCallback(efc)メソッドを使用してプロパティ・グラフに関連付けられたフィルタ・コールバックを使用します。フィルタ・コールバック・セットがない場合は、すべての頂点(またはエッジ)およびエッジが取得されます。

次のコード・フラグメントは、プロパティ・グラフでデフォルトのエッジ・フィルタ・コールバック・セットを使用して、エッジを取得します。

// VertexFilterCallback to retrieve all people from the United States // who are not politicians
NonPoliticianFilterCallback npvfc = NonPoliticianFilterCallback.getInstance();

// Initial vertex: Barack Obama
Vertex v = opg.getVertices("name", "Barack Obama").iterator().next();

// EdgeFilterCallback to retrieve all collaborators of Barack Obama
// from the United States who are not politicians
CollaboratorsFilterCallback cefc = CollaboratorsFilterCallback.getInstance(npvfc, v);

opg.setEdgeFilterCallback(cefc);

Iterable<Edge> obamaCollabs = opg.getEdges();
Iterator<Edge> iter = obamaCollabs.iterator();

System.out.println("\n\n--------Collaborators of Barack Obama from " +
" the US and non-politician\n\n");
long countV = 0;
while (iter.hasNext()) {
Edge edge = iter.next(); // get the edge
// check if obama is the IN vertex
if (edge.getVertex(Direction.IN).equals(v)) {
System.out.println(edge.getVertex(Direction.OUT) + "(Edge ID: " +
edge.getId() + ")"); // get out vertex
}
else {
System.out.println(edge.getVertex(Direction.IN)+ "(Edge ID: " +
edge.getId() + ")"); // get in vertex
}

countV++;
}

5.4.2.6 プロパティ・グラフ・データの読取りでの最適化フラグの使用

最適化フラグを使用すると、グラフ反復のパフォーマンスを向上させることができます。最適化フラグにより、情報がない、または最小限の情報(ID、ラベルおよび入力/出力頂点など)を持つオブジェクトとして、頂点(またはエッジ)を処理できます。これにより、反復中の各頂点またはエッジの処理にかかる時間が削減されます。

次の表に、プロパティ・グラフで頂点またはエッジを処理するときに使用できる最適化フラグを示します。

表5-1 プロパティ・グラフで頂点またはエッジを処理するための最適化フラグ

最適化フラグ

説明

DO_NOT_CREATE_OBJECT

頂点またはエッジを処理するときに、事前定義済の定数オブジェクトを使用します。

JUST_EDGE_ID

エッジの処理時に、IDのみを持つエッジ・オブジェクトを作成します。

JUST_LABEL_EDGE_ID

エッジの処理時に、IDとラベルのみを持つエッジ・オブジェクトを作成します。

JUST_LABEL_VERTEX_EDGE_ID

エッジの処理時に、ID、ラベルおよび入力/出力頂点IDのみを持つエッジ・オブジェクトを作成します。

JUST_VERTEX_EDGE_ID

エッジの処理時に、IDおよび入力/出力頂点IDのみを持つエッジ・オブジェクトを作成します。

JUST_VERTEX_ID

頂点の処理時に、IDのみを持つ頂点オブジェクトを作成します。

次のコード・フラグメントは、最適化フラグのセットを使用して、プロパティ・グラフの頂点およびエッジからすべてのIDのみを取得します。すべての頂点およびエッジの読取りによって取得されたオブジェクトには、IDのみが含まれ、キー/値プロパティや追加情報は含まれません。

import oracle.pg.common.OraclePropertyGraphBase.OptimizationFlag;
OraclePropertyGraph opg = OraclePropertyGraph.getInstance(
args, szGraphName);

// Clear existing vertices/edges in the property graph
opg.clearRepository();

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";

// This object will handle parallel data loading
OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);

// Optimization flag to retrieve only vertices IDs
OptimizationFlag optFlagVertex = OptimizationFlag.JUST_VERTEX_ID;

// Optimization flag to retrieve only edges IDs
OptimizationFlag optFlagEdge = OptimizationFlag.JUST_EDGE_ID;

// Print all vertices
Iterator<Vertex> vertices =
opg.getVertices((String[])null /* Match any of the
properties */,
null /* Match the VertexFilterCallback */,
optFlagVertex /* optimization flag */
).iterator();

System.out.println("----- Vertices IDs----");
long vCount = 0;
while (vertices.hasNext()) {
OracleVertex v = vertices.next();
System.out.println((Long) v.getId());
vCount++;
}
System.out.println("Vertices found: " + vCount);

// Print all edges
Iterator<Edge> edges =
opg.getEdges((String[])null /* Match any of the properties */,
null /* Match the EdgeFilterCallback */,
optFlagEdge /* optimization flag */
).iterator();

System.out.println("----- Edges ----");
long eCount = 0;
while (edges.hasNext()) {
Edge e = edges.next();
System.out.println((Long) e.getId());
eCount++;
}
System.out.println("Edges found: " + eCount);

デフォルトでは、すべての頂点の取得、すべてのエッジの取得(および並列アプローチ)などのすべての読取り操作は、opg.setDefaultVertexOptFlag(optFlagVertex)およびopg.setDefaultEdgeOptFlag(optFlagEdge)メソッドを使用してプロパティ・グラフに関連付けられた最適化フラグを使用します。頂点またはエッジの処理に対する最適化フラグが定義されていない場合、頂点およびエッジに関するすべての情報が取得されます。

次のコード・フラグメントは、プロパティ・グラフでデフォルト最適化フラグのセットを使用して、その頂点およびエッジからすべてのIDのみを取得します。

import oracle.pg.common.OraclePropertyGraphBase.OptimizationFlag;

// Optimization flag to retrieve only vertices IDs
OptimizationFlag optFlagVertex = OptimizationFlag.JUST_VERTEX_ID;

// Optimization flag to retrieve only edges IDs
OptimizationFlag optFlagEdge = OptimizationFlag.JUST_EDGE_ID;

opg.setDefaultVertexOptFlag(optFlagVertex);
opg.setDefaultEdgeOptFlag(optFlagEdge);

Iterator<Vertex> vertices = opg.getVertices().iterator();
System.out.println("----- Vertices IDs----");
long vCount = 0;
while (vertices.hasNext()) {
OracleVertex v = vertices.next();
System.out.println((Long) v.getId());
vCount++;
}
System.out.println("Vertices found: " + vCount);

// Print all edges
Iterator<Edge> edges = opg.getEdges().iterator();
System.out.println("----- Edges ----");
long eCount = 0;
while (edges.hasNext()) {
Edge e = edges.next();
System.out.println((Long) e.getId());
eCount++;
}
System.out.println("Edges found: " + eCount);

5.4.2.7 プロパティ・グラフのサブグラフの属性の追加および削除

Oracle Big Data Spatial and Graphは、ユーザーがカスタマイズした操作コールバックを使用した、頂点またはエッジ(あるいはその両方)のサブグラフへの属性(キー/値ペア)の更新をサポートします。操作コールバックは、(特定の属性および値を追加または削除することによって)頂点(またはエッジ)を更新するために、頂点(またはエッジ)が満たす必要のある条件セットを定義します。

VertexOpCallbackおよびEdgeOpCallback APIインタフェースを実装することにより、独自の属性操作を定義できます。更新操作に含まれる頂点(またはエッジ)によって満たされる必要のある条件を定義するneedOpメソッド、および要素の更新時に使用されるキー名とキー値をそれぞれ返すgetAttributeKeyNameメソッドとgetAttributeKeyValueメソッドをオーバーライドする必要があります。

次のコード・フラグメントは、Barack Obamaの協力者のみに関連付けられたobamaCollaborator属性を操作するVertexOpCallbackを実装します。このプロパティの値は、協力者の役職に基づいて指定されます。

private static class CollaboratorsVertexOpCallback
implements VertexOpCallback
{
private OracleVertexBase m_obama;
private List<Vertex> m_obamaCollaborators;

public CollaboratorsVertexOpCallback(OraclePropertyGraph opg)
{
// Get a list of Barack Obama'sCollaborators
m_obama = (OracleVertexBase) opg.getVertices("name",
"Barack Obama")
.iterator().next();

Iterable<Vertex> iter = m_obama.getVertices(Direction.BOTH,
"collaborates");
m_obamaCollaborators = OraclePropertyGraphUtils.listify(iter);
}

public static CollaboratorsVertexOpCallback
getInstance(OraclePropertyGraph opg)
{
return new CollaboratorsVertexOpCallback(opg);
}

/**
* Add attribute if and only if the vertex is a collaborator of Barack
* Obama
*/
@Override
public boolean needOp(OracleVertexBase v)
{
return m_obamaCollaborators != null &&
m_obamaCollaborators.contains(v);
}

@Override
public String getAttributeKeyName(OracleVertexBase v)
{
return "obamaCollaborator";
}

/**
* Define the property's value based on the vertex role
*/
@Override
public Object getAttributeKeyValue(OracleVertexBase v)
{
String role = v.getProperty("role");
role = role.toLowerCase();
if (role.contains("political")) {
return "political";
}
else if (role.contains("actor") || role.contains("singer") ||
role.contains("actress") || role.contains("writer") ||
role.contains("producer") || role.contains("director")) {
return "arts";
}
else if (role.contains("player")) {
return "sports";
}
else if (role.contains("journalist")) {
return "journalism";
}
else if (role.contains("business") || role.contains("economist")) {
return "business";
}
else if (role.contains("philant")) {
return "philanthropy";
}
return " ";
}
}

次のコード・フラグメントは、Barack Obamaの敵対者のみに関連付けられたobamaFeud属性を操作するEdgeOpCallbackを実装します。このプロパティの値は、協力者の役職に基づいて指定されます。

private static class FeudsEdgeOpCallback
implements EdgeOpCallback
{
private OracleVertexBase m_obama;
private List<Edge> m_obamaFeuds;

public FeudsEdgeOpCallback(OraclePropertyGraph opg)
{
// Get a list of Barack Obama's feuds
m_obama = (OracleVertexBase) opg.getVertices("name",
"Barack Obama")
.iterator().next();

Iterable<Edge> iter = m_obama.getEdges(Direction.BOTH,
"feuds");
m_obamaFeuds = OraclePropertyGraphUtils.listify(iter);
}

public static FeudsEdgeOpCallback getInstance(OraclePropertyGraph opg)
{
return new FeudsEdgeOpCallback(opg);
}

/**
* Add attribute if and only if the edge is in the list of Barack Obama's
* feuds
*/
@Override
public boolean needOp(OracleEdgeBase e)
{
return m_obamaFeuds != null && m_obamaFeuds.contains(e);
}

@Override
public String getAttributeKeyName(OracleEdgeBase e)
{
return "obamaFeud";
}

/**
* Define the property's value based on the in/out vertex role
*/
@Override
public Object getAttributeKeyValue(OracleEdgeBase e)
{
OracleVertexBase v = (OracleVertexBase) e.getVertex(Direction.IN);
if (m_obama.equals(v)) {
v = (OracleVertexBase) e.getVertex(Direction.OUT);
}
String role = v.getProperty("role");
role = role.toLowerCase();

if (role.contains("political")) {
return "political";
}
else if (role.contains("actor") || role.contains("singer") ||
role.contains("actress") || role.contains("writer") ||
role.contains("producer") || role.contains("director")) {
return "arts";
}
else if (role.contains("journalist")) {
return "journalism";
}
else if (role.contains("player")) {
return "sports";
}
else if (role.contains("business") || role.contains("economist")) {
return "business";
}
else if (role.contains("philanthropist")) {
return "philanthropy";
}
return " ";
}
}

前に定義した操作コールバックを使用して、次のコード・フラグメントはプロパティ・グラフをロードし、操作コールバックのインスタンスを作成し、その後にOraclePropertyGraphでaddAttributeToAllVerticesおよびaddAttributeToAllEdgesメソッドを使用して属性を適切な頂点およびエッジに追加します。

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(
args, szGraphName);

// Clear existing vertices/edges in the property graph
opg.clearRepository();

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";

// This object will handle parallel data loading
OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);

// Create the vertex operation callback
CollaboratorsVertexOpCallback cvoc = CollaboratorsVertexOpCallback.getInstance(opg);

// Add attribute to all people collaborating with Obama based on their role
opg.addAttributeToAllVertices(cvoc, true /** Skip store to Cache */, dop);

// Look up for all collaborators of Obama
// The function getVerticesAsString prints the vertices in the given iterable
Iterable<Vertex> collaborators = opg.getVertices("obamaCollaborator", "political");
System.out.println("Political collaborators of Barack Obama " + getVerticesAsString(collaborators));

collaborators = opg.getVertices("obamaCollaborator", "business");
System.out.println("Business collaborators of Barack Obama " +
getVerticesAsString(collaborators));

// Add an attribute to all people having a feud with Barack Obama to set
// the type of relation they have
FeudsEdgeOpCallback feoc = FeudsEdgeOpCallback.getInstance(opg);
opg.addAttributeToAllEdges(feoc, true /** Skip store to Cache */, dop);

// Look up for all feuds of Obama
// The function getEdgesAsString prints the edges in the given iterable
Iterable<Edge> feuds = opg.getEdges("obamaFeud", "political");
System.out.println("\n\nPolitical feuds of Barack Obama " + getEdgesAsString(feuds));

feuds = opg.getEdges("obamaFeud", "business");
System.out.println("Business feuds of Barack Obama " +
getEdgesAsString(feuds));

次のコード・フラグメントは、属性obamaCollaboratorにphilanthropyという値を持つ頂点を削除した後でAPI removeAttributeFromAllVerticesをコールするために使用できるVertexOpCallbackの実装を定義します。また、属性obamaFeudにbusinessという値を持つエッジを削除した後でAPI removeAttributeFromAllEdgesをコールするために使用できるEdgeOpCallbackの実装も定義します。

System.out.println("\n\nRemove 'obamaCollaborator' property from all the" +
"philanthropy collaborators");
PhilanthropyCollaboratorsVertexOpCallback pvoc = PhilanthropyCollaboratorsVertexOpCallback.getInstance();

opg.removeAttributeFromAllVertices(pvoc);

System.out.println("\n\nRemove 'obamaFeud' property from all the" + "business feuds");
BusinessFeudsEdgeOpCallback beoc = BusinessFeudsEdgeOpCallback.getInstance();

opg.removeAttributeFromAllEdges(beoc);

/**
* Implementation of a EdgeOpCallback to remove the "obamaCollaborators"
* property from all people collaborating with Barack Obama that have a
* philanthropy role
*/
private static class PhilanthropyCollaboratorsVertexOpCallback implements VertexOpCallback
{
public static PhilanthropyCollaboratorsVertexOpCallback getInstance()
{
return new PhilanthropyCollaboratorsVertexOpCallback();
}

/**
* Remove attribute if and only if the property value for
* obamaCollaborator is Philanthropy
*/
@Override
public boolean needOp(OracleVertexBase v)
{
String type = v.getProperty("obamaCollaborator");
return type != null && type.equals("philanthropy");
}

@Override
public String getAttributeKeyName(OracleVertexBase v)
{
return "obamaCollaborator";
}

/**
* Define the property's value. In this case can be empty
*/
@Override
public Object getAttributeKeyValue(OracleVertexBase v)
{
return " ";
}
}

/**
* Implementation of a EdgeOpCallback to remove the "obamaFeud" property
* from all connections in a feud with Barack Obama that have a business role
*/
private static class BusinessFeudsEdgeOpCallback implements EdgeOpCallback
{
public static BusinessFeudsEdgeOpCallback getInstance()
{
return new BusinessFeudsEdgeOpCallback();
}

/**
* Remove attribute if and only if the property value for obamaFeud is
* business
*/
@Override
public boolean needOp(OracleEdgeBase e)
{
String type = e.getProperty("obamaFeud");
return type != null && type.equals("business");
}

@Override
public String getAttributeKeyName(OracleEdgeBase e)
{
return "obamaFeud";
}

/**
* Define the property's value. In this case can be empty
*/
@Override
public Object getAttributeKeyValue(OracleEdgeBase e)
{
return " ";
}
}

5.4.2.8 プロパティ・グラフ・メタデータの取得

データベース内のすべてのグラフ名など、グラフのメタデータと統計を取得できます。各グラフについて、最小/最大頂点ID、最小/最大エッジID、頂点プロパティ名、エッジ・プロパティ名、グラフ頂点内の分割の数、およびパラレル表スキャンをサポートするエッジ表などを取得します。

次のコード・フラグメントは、バックエンド・データベース(Oracle NoSQL DatabaseまたはApache HBase)に格納されている既存のプロパティ・グラフのメタデータおよび統計を取得します。必要な引数は、各データベースで異なります。

// Get all graph names in the database
List<String> graphNames = OraclePropertyGraphUtils.getGraphNames(dbArgs);

for (String graphName : graphNames) {
OraclePropertyGraph opg = OraclePropertyGraph.getInstance(args,
graphName);

System.err.println("\n Graph name: " + graphName);
System.err.println(" Total vertices: " +
opg.countVertices(dop));

System.err.println(" Minimum Vertex ID: " +
opg.getMinVertexID(dop));
System.err.println(" Maximum Vertex ID: " +
opg.getMaxVertexID(dop));

// The function getPropertyNamesAsString prints the given set of properties
Set<String> propertyNamesV = new HashSet<String>();
opg.getVertexPropertyNames(dop, 0 /* timeout,0 no timeout */,
propertyNamesV);

System.err.println(" Vertices property names: " +
getPropertyNamesAsString(propertyNamesV));

System.err.println("\n\n Total edges: " + opg.countEdges(dop));
System.err.println(" Minimum Edge ID: " + opg.getMinEdgeID(dop));
System.err.println(" Maximum Edge ID: " + opg.getMaxEdgeID(dop));

Set<String> propertyNamesE = new HashSet<String>();
opg.getEdgePropertyNames(dop, 0 /* timeout,0 no timeout */,
propertyNamesE);

System.err.println(" Edge property names: " +
getPropertyNamesAsString(propertyNamesE));

System.err.println("\n\n Table Information: ");
System.err.println("Vertex table number of splits: " +
(opg.getVertexTableSplits()));
System.err.println("Edge table number of splits: " +
(opg.getEdgeTableSplits()));
}

5.4.3 プロパティ・グラフ・インスタンスのオープンおよびクローズ

プロパティ・グラフを記述する際、次のOracle Property Graphクラスを使用して、プロパティ・グラフ・インスタンスを適切にオープンおよびクローズします。

- OraclePropertyGraph.getInstance: Oracleプロパティ・グラフのインスタンスをオープンします。このメソッドには、接続情報とグラフ名の2つのパラメータがあります。接続情報のフォーマットは、バックエンド・データベースとしてHBaseまたはOracle NoSQL Databaseのいずれを使用しているかによって異なります。

- OraclePropertyGraph.clearRepository: プロパティ・グラフ・インスタンスからすべての頂点およびエッジを削除します。

- OraclePropertyGraph.shutdown: グラフ・インスタンスをクローズします。

さらに、Oracle NoSQL DatabaseまたはHBase APIからの適切なクラスを使用する必要があります。

- Oracle NoSQL Databaseの使用

- Apache HBaseの使用

5.4.3.1 Oracle NoSQL Databaseの使用

Oracle NoSQL Databaseでは、OraclePropertyGraph.getInstanceメソッドはKVストア名、ホスト・コンピュータ名およびポート番号を接続に使用します。

String kvHostPort = "cluster02:5000";
String kvStoreName = "kvstore";
String kvGraphName = "my_graph";

// Use NoSQL Java API
KVStoreConfig kvconfig = new KVStoreConfig(kvStoreName, kvHostPort);

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(kvconfig, kvGraphName);
opg.clearRepository();
//     .
//     .  Graph description
//     .
// Close the graph instance
opg.shutdown();

アプリケーションでインメモリー・アナリスト機能が必要な場合、GraphConfigBuilderを使用してOracle NoSQL Databaseに対してグラフconfigを作成し、引数としてconfigを指定してOraclePropertyGraphをインスタンス化することをお薦めします。

例として、次のコード・スニペットはグラフconfigを作成し、OraclePropertyGraphインスタンスを取得し、いくつかのデータをそのグラフにロードして、インメモリー・アナリストを取得します。

import oracle.pgx.config.*;
import oracle.pgx.api.*;
import oracle.pgx.common.types.*;

...

String[] hhosts = new String[1];
hhosts[0]          = "my_host_name:5000"; // need customization
String szStoreName =  "kvstore";          // need customization
String szGraphName = "my_graph";
int dop            =  8;

PgNosqlGraphConfig cfg = GraphConfigBuilder.forPropertyGraphNosql()
.setName(szGraphName)
.setHosts(Arrays.asList(hhosts))
.setStoreName(szStoreName)
.addEdgeProperty("lbl", PropertyType.STRING, "lbl")
.addEdgeProperty("weight", PropertyType.DOUBLE, "1000000")
.build();

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(cfg);

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";

// perform a parallel data load
OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);

...
PgxSession session = Pgx.createSession("session-id-1");
PgxGraph g = session.readGraphWithProperties(cfg);

Analyst analyst = session.createAnalyst();
...

5.4.3.2 Apache HBaseの使用

Apache HBaseでは、OraclePropertyGraph.getInstanceメソッドはHadoopノードとApache HBaseポート番号を接続に使用します。

String hbQuorum = "bda01node01.example.com, bda01node02.example.com, bda01node03.example.com";
String hbClientPort = "2181"
String hbGraphName = "my_graph";

// Use HBase Java APIs
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", hbQuorum);
conf.set("hbase.zookeper.property.clientPort", hbClientPort);
HConnection conn = HConnectionManager.createConnection(conf);

// Open the property graph
OraclePropertyGraph opg = OraclePropertyGraph.getInstance(conf, conn, hbGraphName);
opg.clearRepository();
//     .
//     .  Graph description
//     .
// Close the graph instance
opg.shutdown();
// Close the HBase connection
conn.close();

アプリケーションでインメモリー・アナリスト機能が必要な場合、GraphConfigBuilderを使用してグラフconfigを作成し、引数としてconfigを指定してOraclePropertyGraphをインスタンス化することをお薦めします。

例として、次のコード・スニペットはインメモリー分析の構成を設定し、Apache HBaseに対してグラフconfigを作成し、OraclePropertyGraphインスタンスをインスタンス化し、インメモリー・アナリストを取得して、グラフ内のトライアングルの数をカウントします。

confPgx = new HashMap<PgxConfig.Field, Object>();
confPgx.put(PgxConfig.Field.ENABLE_GM_COMPILER, false);
confPgx.put(PgxConfig.Field.NUM_WORKERS_IO, dop + 2);
confPgx.put(PgxConfig.Field.NUM_WORKERS_ANALYSIS, 8); // <= # of physical cores
confPgx.put(PgxConfig.Field.NUM_WORKERS_FAST_TRACK_ANALYSIS, 2);
confPgx.put(PgxConfig.Field.SESSION_TASK_TIMEOUT_SECS, 0);// no timeout set
confPgx.put(PgxConfig.Field.SESSION_IDLE_TIMEOUT_SECS, 0);  // no timeout set
ServerInstance instance = Pgx.getInstance();
instance.startEngine(confPgx);

int iClientPort = Integer.parseInt(hbClientPort);
int splitsPerRegion = 2;

PgHbaseGraphConfig cfg = GraphConfigBuilder.forPropertyGraphHbase()
.setName(hbGraphName)
.setZkQuorum(hbQuorum)
.setZkClientPort(iClientPort)
.setZkSessionTimeout(60000)
.setMaxNumConnections(dop)
.setSplitsPerRegion(splitsPerRegion)
.addEdgeProperty("lbl", PropertyType.STRING, "lbl")
.addEdgeProperty("weight", PropertyType.DOUBLE, "1000000")
.build();

PgxSession session = Pgx.createSession("session-id-1");
PgxGraph g = session.readGraphWithProperties(cfg);
Analyst analyst = session.createAnalyst();

long triangles = analyst.countTriangles(g, false);

5.4.4 頂点の作成

頂点を作成するには、次のOracle Property Graphメソッドを使用します。

- OraclePropertyGraph.addVertex: グラフに頂点インスタンスを追加します。

- OracleVertex.setProperty: 頂点にキー値プロパティを割り当てます。

- OraclePropertyGraph.commit: すべての変更をプロパティ・グラフ・インスタンスに保存します。

次のコード・フラグメントは、opgプロパティ・グラフ・インスタンスに年齢、名前、体重、身長、性別のプロパティを指定して、V1およびV2という名前の2つの頂点を作成します。v1プロパティはデータ型を明示的に設定します。

// Create vertex v1 and assign it properties as key-value pairs
Vertex v1 = opg.addVertex(1l);
v1.setProperty("age",  Integer.valueOf(31));
v1.setProperty("name", "Alice");
v1.setProperty("weight", Float.valueOf(135.0f));
v1.setProperty("height", Double.valueOf(64.5d));
v1.setProperty("female", Boolean.TRUE);

Vertex v2 = opg.addVertex(2l);
v2.setProperty("age",  27);
v2.setProperty("name", "Bob");
v2.setProperty("weight", Float.valueOf(156.0f));
v2.setProperty("height", Double.valueOf(69.5d));
v2.setProperty("female", Boolean.FALSE);

5.4.5 エッジの作成

エッジを作成するには、次のOracle Property Graphメソッドを使用します。

- OraclePropertyGraph.addEdge: グラフにエッジ・インスタンスを追加します。

- OracleEdge.setProperty: エッジにキー値プロパティを割り当てます。

次のコード・フラグメントは、2つの頂点(v1およびv2)と1つのエッジ(e1)を作成します。

// Add vertices v1 and v2
Vertex v1 = opg.addVertex(1l);
v1.setProperty("name", "Alice");
v1.setProperty("age", 31);

Vertex v2 = opg.addVertex(2l);
v2.setProperty("name", "Bob");
v2.setProperty("age", 27);

// Add edge e1
Edge e1 = opg.addEdge(1l, v1, v2, "knows");
e1.setProperty("type", "friends");

5.4.6 頂点およびエッジの削除

頂点インスタンスとエッジ・インスタンスを個別に、またはすべて同時に削除できます。次のメソッドを使用します。

- OraclePropertyGraph.removeEdge: 指定されたエッジをグラフから削除します。

- OraclePropertyGraph.removeVertex: 指定された頂点をグラフから削除します。

- OraclePropertyGraph.clearRepository: プロパティ・グラフ・インスタンスからすべての頂点およびエッジを削除します。

次のコード・フラグメントは、グラフ・インスタンスからエッジe1と頂点v1を削除します。頂点を削除するときに、隣接するエッジもグラフから削除されます。これは、すべてのエッジは開始頂点と終了頂点を持っている必要があるためです。開始頂点または終了頂点を削除した後、そのエッジは有効なエッジではなくなります。

// Remove edge e1
opg.removeEdge(e1);

// Remove vertex v1
opg.removeVertex(v1);

OraclePropertyGraphインスタンスからすべてのコンテンツを削除するには、OraclePropertyGraph.clearRepositoryメソッドを使用できます。ただし、この操作は元に戻せないため、慎重に使用してください。

5.4.7 データベースから埋込みインメモリー・アナリストへのグラフの読込み

Apache HBaseまたはOracle NoSQL Databaseから、同じクライアントJavaアプリケーション(単一のJVM)に埋め込まれたインメモリー・アナリストにグラフを読み込むことができます。次のApache HBaseの例の場合:

- 正しいjava.io.tmpdir設定が必要です。

- dop + 2は、リリース1.1.2よりも前のパフォーマンスの問題に対処する方法です。リリース1.1.2で有効ですが、かわりにdop値を構成設定に直接指定できます。

int dop = 8;                    // need customization
Map<PgxConfig.Field, Object> confPgx = new HashMap<PgxConfig.Field, Object>();
confPgx.put(PgxConfig.Field.ENABLE_GM_COMPILER, false);
confPgx.put(PgxConfig.Field.NUM_WORKERS_IO, dop + 2);   // use dop directly with release 1.1.2 or newer
confPgx.put(PgxConfig.Field.NUM_WORKERS_ANALYSIS, dop); // <= # of physical cores
confPgx.put(PgxConfig.Field.NUM_WORKERS_FAST_TRACK_ANALYSIS, 2);
confPgx.put(PgxConfig.Field.SESSION_TASK_TIMEOUT_SECS, 0);  // no timeout set
confPgx.put(PgxConfig.Field.SESSION_IDLE_TIMEOUT_SECS, 0);  // no timeout set

PgHbaseGraphConfig cfg = GraphConfigBuilder.forPropertyGraphHbase()
.setName("mygraph")
.setZkQuorum("localhost") // quorum, need customization
.setZkClientPort(2181)
.addNodeProperty("name", PropertyType.STRING, "default_name")
.build();

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(cfg);
ServerInstance localInstance = Pgx.getInstance();
localInstance.startEngine(confPgx);
PgxSession session = localInstance.createSession("session-id-1"); // Put your session description here.

Analyst analyst = session.createAnalyst();

// The following call will trigger a read of graph data from the database
PgxGraph pgxGraph = session.readGraphWithProperties(opg.getConfig());

long triangles = analyst.countTriangles(pgxGraph, false);
System.out.println("triangles " + triangles);
// After reading a graph in memory, modifying the graph on the database side should not affect in memory results:
// Remove edge e1
opg.removeEdge(e1);

// Remove vertex v1
opg.removeVertex(v1);

5.4.8 頂点のラベルの指定

「プロパティ・グラフとは」で説明されているように、データベースおよびデータ・アクセス・レイヤーには、頂点用のラベルは用意されていません。ただし、指定した頂点プロパティの値を1つ以上のラベルとして扱うことができます。このような変換が関連するのは、インメモリー・アナリストの場合のみです。

次の例では、プロパティ"country"がsetUseVertexPropertyValueAsLabel()への呼出しに指定されており、カンマ区切り","がsetPropertyValueDelimiter()への呼出しに指定されています。これら2つをまとめると、country頂点プロパティの値がカンマ区切りの頂点ラベルとして扱われることを意味します。たとえば、頂点Xの国プロパティの文字列値が"US"である場合、頂点ラベルはUSになり、頂点Yの文字列値が"UK,CN"である場合、2つのラベルUKおよびCNを持ちます。

GraphConfigBuilder.forPropertyGraph...
.setName("<your_graph_name>")
...
.setUseVertexPropertyValueAsLabel("country")
.setPropertyValueDelimiter(",")
.build();

5.4.9 インメモリー・グラフの構築

「グラフ・データのメモリーへの読込み」以外にも、インメモリー・グラフをプログラムで作成できます。これにより、グラフのサイズが小さい場合やグラフのコンテンツが非常に動的である場合、開発を簡略化できます。主要なJavaクラスは、addVertexおよびaddEdge APIを使用して追加された頂点とエッジのセットを累計できるGraphBuilderです。すべての変更が行われた後、GraphBuilderによってインメモリー・グラフ・インスタンス(PgxGraph)を作成できます。

次のJavaコード・スニペットは、グラフの構築フローを示します。まだ存在していない頂点は隣接するエッジが作成されるときに動的に追加されるため、addVertexに対する明示的な呼出しはありません。

import oracle.pgx.api.*;

PgxSession session = Pgx.createSession("example");
GraphBuilder<Integer> builder = session.newGraphBuilder();

builder.addEdge(0, 1, 2);
builder.addEdge(1, 2, 3);
builder.addEdge(2, 2, 4);
builder.addEdge(3, 3, 4);
builder.addEdge(4, 4, 2);

PgxGraph graph = builder.build();

頂点プロパティを使用してグラフを構築するには、作成された頂点オブジェクトに対してsetPropertyを使用できます。

PgxSession session = Pgx.createSession("example");
GraphBuilder<Integer> builder = session.newGraphBuilder();

builder.addVertex(1).setProperty("double-prop", 0.1);
builder.addVertex(2).setProperty("double-prop", 2.0);
builder.addVertex(3).setProperty("double-prop", 0.3);
builder.addVertex(4).setProperty("double-prop", 4.56789);

builder.addEdge(0, 1, 2);
builder.addEdge(1, 2, 3);
builder.addEdge(2, 2, 4);
builder.addEdge(3, 3, 4);
builder.addEdge(4, 4, 2);

PgxGraph graph = builder.build();

頂点およびエッジ識別子としてLong整数を使用するには、GraphBuilderの新しいインスタンスの取得時にIdType.LONGを指定します。次に例を示します。

import oracle.pgx.common.types.IdType;
GraphBuilder<Long> builder = session.newGraphBuilder(IdType.LONG);

エッジの構築時に、addEdgeへの呼出しで前に作成した頂点オブジェクトを直接使用できます。

v1 = builder.addVertex(1l).setProperty("double-prop", 0.5)
v2 = builder.addVertex(2l).setProperty("double-prop", 2.0)

builder.addEdge(0, v1, v2)

頂点の場合と同じように、エッジもプロパティを持つことができます。次の例では、setLabelを使用してエッジ・ラベルを設定します。

builder.addEdge(4, v4, v2).setProperty("edge-prop", "edge_prop_4_2").setLabel("label")

5.4.10 プロパティ・グラフの削除

データベースからプロパティ・グラフを削除するには、OraclePropertyGraphUtils.dropPropertyGraphメソッドを使用します。このメソッドには、接続情報とグラフ名の2つのパラメータがあります。

接続情報のフォーマットは、バックエンド・データベースとしてHBaseまたはOracle NoSQL Databaseのいずれを使用しているかによって異なります。これは、OraclePropertyGraph.getInstanceに指定する接続情報と同じです。

- Oracle NoSQL Databaseの使用

- Apache HBaseの使用

5.4.10.1 Oracle NoSQL Databaseの使用

Oracle NoSQL Databaseでは、OraclePropertyGraphUtils.dropPropertyGraphメソッドはKVストア名、ホスト・コンピュータ名およびポート番号を接続に使用します。このコード・フラグメントは、my_graphという名前のグラフをOracle NoSQL Databaseから削除します。

String kvHostPort = "cluster02:5000";
String kvStoreName = "kvstore";
String kvGraphName = "my_graph";

// Use NoSQL Java API
KVStoreConfig kvconfig = new KVStoreConfig(kvStoreName, kvHostPort);

// Drop the graph
OraclePropertyGraphUtils.dropPropertyGraph(kvconfig, kvGraphName);

5.4.10.2 Apache HBaseの使用

Apache HBaseでは、OraclePropertyGraphUtils.dropPropertyGraphメソッドはHadoopノードとApache HBaseポート番号を接続に使用します。このコード・フラグメントは、my_graphという名前のグラフをApache HBaseから削除します。

String hbQuorum = "bda01node01.example.com, bda01node02.example.com, bda01node03.example.com";
String hbClientPort = "2181";
String hbGraphName = "my_graph";

// Use HBase Java APIs
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", hbQuorum);
conf.set("hbase.zookeper.property.clientPort", hbClientPort);

// Drop the graph
OraclePropertyGraphUtils.dropPropertyGraph(conf, hbGraphName);

5.5 プロパティ・グラフ・データのテキスト索引付けの管理

Oracle Big Data Spatial and Graphの索引付けは、特定のキー/値またはキー/テキスト・ペア別に要素を高速に読み取ることを可能にします。これらの索引は、要素タイプ(頂点またはエッジ)、キー(および値)のセットおよび索引タイプに基づいて作成されます。

Oracle Big Data Spatial and Graphは、手動と自動の2つのタイプの索引付け構造をサポートしています。

- 自動テキスト索引は、プロパティ・キーのセット別に頂点またはエッジの自動索引付けを行います。この主な目的は、特定のキー/値ペアに基づく頂点およびエッジの問合せパフォーマンスを向上させることです。

- 手動テキスト索引付けでは、プロパティ・グラフの指定された頂点およびエッジのセットに対して複数の索引を定義できます。索引に含めるグラフ要素を指定する必要があります。

Oracle Big Data Spatial and Graphは、Oracle NoSQL DatabaseおよびApache HBaseのプロパティ・グラフに対して手動および自動テキスト索引を作成するためのAPIを提供します。索引は、使用可能な検索エンジン、Apache LuceneおよびSolrCloudを使用して管理されます。この節の続きでは、データ・アクセス・レイヤーのプロパティ・グラフ機能を使用してテキスト索引を作成する方法に焦点を当てます。

- プロパティ・グラフ・データのテキスト索引の構成

- プロパティ・グラフ・データの自動索引の使用

- プロパティ・グラフ・データの手動索引の使用

- プロパティ・グラフ・テキスト索引に対する検索問合せの実行

- データ型の処理

- ZookeeperへのコレクションのSolrCloud構成のアップロード

- プロパティ・グラフ・データのテキスト索引の構成設定の更新

- プロパティ・グラフ・データのテキスト索引でのパラレル問合せの使用

- プロパティ・グラフ・データのテキスト索引に対するネイティブ問合せオブジェクトの使用

- プロパティ・グラフ・データのテキスト索引に対するネイティブ問合せ結果の使用

5.5.1 プロパティ・グラフ・データのテキスト索引の構成

テキスト索引の構成は、OracleIndexParametersオブジェクトを使用して定義されます。このオブジェクトには、検索エンジン、場所、ディレクトリ(またはシャード)の数、および並列度などの索引に関する情報が含まれます。

デフォルトでは、テキスト索引はメソッドopg.setDefaultIndexParameters(indexParams)を使用してプロパティ・グラフに関連付けられたOracleIndexParametersに基づいて構成されます。自動索引の初期作成により、将来索引付けされるキーのために構成およびテキスト検索エンジンが区切られます。

別のパラメータ・セットを指定して索引を作成することもできます。次のコード・フラグメントは、Luceneエンジンとともに物理ディレクトリを使用して既存のプロパティ・グラフに対して自動テキスト索引を作成します。

// Create an OracleIndexParameters object to get Index configuration (search engine, etc).
OracleIndexParameters indexParams = OracleIndexParameters.buildFS(args)

// Create auto indexing on above properties for all vertices
opg.createKeyIndex("name", Vertex.class, indexParams.getParameters());

テキスト索引の初期構成を変更するには、最初に既存のグラフを削除してから、新しい構成を使用して索引を再作成する必要がある場合があります。

- Apache Lucene検索エンジンを使用したテキスト索引の構成

- SolrCloud検索エンジンを使用したテキスト索引の構成

Apache Lucene検索エンジンを使用したテキスト索引の構成

Apache Lucene検索エンジンを使用したテキスト索引では、LuceneIndexParameters構成オブジェクトを使用します。Lucene検索エンジンを使用した索引の構成パラメータには、次が含まれます。

- ディレクトリの数: 自動索引に使用するApache Luceneディレクトリの数を指定する整数。複数のディレクトリを使用すると、記憶域とパフォーマンスのスケーラビリティを実現できます。デフォルト値は1に設定されています。

- バッチ・サイズ: Apache Luceneでのバッチ処理用のドキュメントに使用するバッチ・サイズを指定する整数。デフォルトで使用されるバッチ・サイズは10000です。

- バッチのコミット・サイズ:コミット操作が実行される前にApache Lucene索引に追加されるドキュメントの数を指定する整数。デフォルトで使用されるバッチのコミット・サイズは500000です。

- データ型処理フラグ: Apache Luceneのデータ型処理を有効にするかどうかを指定するブール。データ型処理を有効にすると、数値および日時データ型に対する検索が高速になります。

- ディレクトリ名: Apache Luceneディレクトリが作成されるベース・パスの場所を指定する文字列配列。

次のコード・フラグメントは、Apache Lucene検索エンジンとともに物理ディレクトリを使用してテキスト索引の構成を作成します。

OracleIndexParameters indexParams =
OracleIndexParameters.buildFS(4, 4, 10000, 50000, true,
"/home/data/text-index");

SolrCloud検索エンジンを使用したテキスト索引の構成

SolrCloud検索エンジンを使用したテキスト索引は、バックグラウンドでSolrIndexParametersオブジェクトを使用して、索引構築時に使用されるSolrCloudホスト名、シャードの数およびレプリケーション・ファクタを識別します。SolrCloud検索エンジンを使用した索引の構成パラメータには、次が含まれます。

- 構成名: Oracle Property GraphのSolrCloud構成ファイルが格納されるApache Zookeeperディレクトリの名前。例: opgconfig。構成ファイルには、必要なフィールドのスキーマ(schema.xml)および記憶域設定(solrconfig.xml)が含まれます。

- サーバーURL: SolrCloudサービスに接続するために使用されるSolrCloudサーバーURL。例: http://localhost:2181/solr

- SolrCloudノード・セット: コレクションのシャードが格納されるSolrCloudサービス内のノードのホスト名。例: node01:8983_solr,node02:8983_solr,node03:8983_solr。値がnullに設定されている場合、コレクションはサービス内で使用可能なすべてのSolrCloudノードを使用して作成されます。

- Zookeeperのタイムアウト: Zookeeper接続を待機するために使用されるタイムアウト(秒単位)を表す正の整数。

- シャードの数: テキスト索引コレクション用として作成するシャードの数。SolrCloud構成でHDFSディレクトリを使用している場合、シャードの数が、SolrCloudノード・セットに指定されているSolrCloudノードの数を超えないようにする必要があります。

- レプリケーション・ファクタ: SolrCloudコレクションで使用されるレプリケーション・ファクタ。デフォルト値は1に設定されています。

- ノード当たりのシャードの最大数: 各SolrCloudノードで作成できるシャードの最大数。この値は、シャードの数をSolrCloudノード・セット内のノードの数で割った値より小さくしないようにする必要があります。

- DOP: プロパティ・グラフから頂点(またはエッジ)を読み込み、キー/値ペアに索引を付けるときに使用する並列度。デフォルト値は1に設定されています。

- バッチ・サイズ: Apache SolrCloudでのバッチ処理用のドキュメントに使用するバッチ・サイズを指定する整数。デフォルトで使用されるバッチ・サイズは10000です。

- バッチのコミット・サイズ:コミット操作が実行される前にApache SolrCloud索引に追加されるドキュメントの数を指定する整数。デフォルトで使用されるバッチのコミット・サイズは500000 (50万)です。

- 書込みタイムアウト: 索引操作が完了するまで待機するために使用するタイムアウト(秒単位)。通信エラーが原因で索引操作が失敗した場合、タイムアウトに達するか操作が完了するまで必要に応じて操作が繰り返し再試行されます。

次のコード・フラグメントは、SolrCloudを使用してテキスト索引の構成を作成します。

String configName = "opgconfig";
String solrServerUrl = "nodea:2181/solr"
String solrNodeSet = "nodea:8983_solr,nodeb:8983_solr," +
"nodec:8983_solr,noded:8983_solr";

int zkTimeout = 15;
int numShards = 4;
int replicationFactor = 1;
int maxShardsPerNode = 1;

OracleIndexParameters indexParams =
OracleIndexParameters.buildSolr(configName,
solrServerUrl,
solrNodeSet,
zkTimeout,
numShards,
replicationFactor,
maxShardsPerNode,
4,
10000,
500000,
15);

SolrCloudを使用する場合、「ZookeeperへのコレクションのSolrCloud構成のアップロード」で説明されているように、最初にテキスト索引のためのコレクションの構成をApache Zookeeperにロードする必要があります。

5.5.2 プロパティ・グラフ・データの自動索引の使用

自動テキスト索引は、プロパティ・キーのセット別に頂点またはエッジの自動索引付けを行います。その主な目的は、特定のキー/値ペアに基づく頂点およびエッジに対する索引速度を上げることです。特定のキーの自動索引が有効である場合、データベース索引を実行する代わりに、キー/値ペアの索引が索引に対してテキスト索引として実行されます。

プロパティ・グラフに対する自動索引を記述する場合、次のOracleプロパティ・グラフ・メソッドを使用して自動索引を作成、削除および操作します。

- OraclePropertyGraph.createKeyIndex(String key, Class elementClass, Parameter[] parameters): 特定のプロパティ・キー別にelementClass型の要素すべての自動索引を作成します。索引は、指定したパラメータに基づいて構成されます。

- OraclePropertyGraph.createKeyIndex(String[] keys, Class elementClass, Parameter[] parameters): プロパティ・キー・セット別にelementClass型の要素すべての自動索引を作成します。索引は、指定したパラメータに基づいて構成されます。

- OraclePropertyGraph.dropKeyIndex(String key, Class elementClass): 特定のプロパティ・キー別にelementClass型の要素すべての自動索引を削除します。

- OraclePropertyGraph.dropKeyIndex(String[] keys, Class elementClass): 特定のプロパティ・キー・セット別にelementClass型の要素すべての自動索引を削除します。

- OraclePropertyGraph.getAutoIndex(Class elementClass): elementClass型の自動索引の索引インスタンスを取得します。

- OraclePropertyGraph.getIndexedKeys(Class elementClass): elementClass型の要素すべての自動索引で現在使用されている索引付けされたキー・セットを取得します。

提供されているExampleNoSQL6およびExampleHBase6の例では、入力ファイルからプロパティ・グラフを作成し、頂点に自動テキスト索引を作成し、Apache Luceneを使用していくつかのテキスト検索問合せを実行します。

次のコード・フラグメントは、name、role、religion、countryのプロパティ・キーを指定して、既存のプロパティ・グラフの頂点に自動索引を作成します。自動テキスト索引は、/home/data/text-indexディレクトリの下にある4つのサブディレクトリに格納されます。Apache Luceneデータ型処理が有効になります。この例では、再索引付けタスクのためにDOP (並列度) 4を使用しています。

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(
args,  szGraphName);

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";

// Do a parallel data loading
OraclePropertyGraphDataLoader opgdl =
OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);

// Create an automatic index using Apache Lucene engine.
// Specify Index Directory parameters (number of directories,
// number of connections to database, batch size, commit size,
// enable datatypes, location)
OracleIndexParameters indexParams =
OracleIndexParameters.buildFS(4, 4, 10000, 50000, true,
"/home/data/text-index ");
opg.setDefaultIndexParameters(indexParams);

// specify indexed keys
String[] indexedKeys = new String[4];
indexedKeys[0] = "name";
indexedKeys[1] = "role";
indexedKeys[2] = "religion";
indexedKeys[3] = "country";

// Create auto indexing on above properties for all vertices
opg.createKeyIndex(indexedKeys, Vertex.class);

デフォルトでは、索引はopg.setDefaultIndexParameters(indexParams)メソッドを使用してプロパティ・グラフに関連付けられたOracleIndexParametersに基づいて構成されます。

別のパラメータ・セットを指定して索引を作成することもできます。これは次のコード・スニペットに示されています。

// Create an OracleIndexParameters object to get Index configuration (search engine, etc).
OracleIndexParameters indexParams = OracleIndexParameters.buildFS(args)

// Create auto indexing on above properties for all vertices
opg.createKeyIndex("name", Vertex.class, indexParams.getParameters());

次の例のコード・フラグメントは、すべての頂点に対して問合せを実行し、キー値ペアname:Barack Obamaを持つすべての一致する頂点を検索します。この操作は、テキスト索引の検索を実行します。

さらに、getVertices APIコールでuseWildCardsパラメータを指定することにより、ワイルドカード検索がサポートされます。ワイルドカード検索は、指定されたプロパティ・キーに対して自動索引が有効化されている場合にのみサポートされます。Apache Luceneを使用したテキスト検索構文の詳細は、https://lucene.apache.org/core/2_9_4/queryparsersyntax.htmlを参照してください。

// Find all vertices with name Barack Obama.
Iterator<Vertices> vertices = opg.getVertices("name", "Barack Obama").iterator();
System.out.println("----- Vertices with name Barack Obama -----");
countV = 0;
while (vertices.hasNext()) {
System.out.println(vertices.next());
countV++;
}
System.out.println("Vertices found: " + countV);

// Find all vertices with name including keyword "Obama"
// Wildcard searching is supported.
boolean useWildcard = true;
Iterator<Vertices> vertices = opg.getVertices("name", "*Obama*",useWildcard).iterator();
System.out.println("----- Vertices with name *Obama* -----");
countV = 0;
while (vertices.hasNext()) {
System.out.println(vertices.next());
countV++;
}
System.out.println("Vertices found: " + countV);

前述のコード例では、次のような出力が生成されます。

----- Vertices with name Barack Obama-----
Vertex ID 1 {name:str:Barack Obama, role:str:political authority, occupation:str:44th president of United States of America, country:str:United States, political party:str:Democratic, religion:str:Christianity}
Vertices found: 1

----- Vertices with name *Obama* -----
Vertex ID 1 {name:str:Barack Obama, role:str:political authority, occupation:str:44th president of United States of America, country:str:United States, political party:str:Democratic, religion:str:Christianity}
Vertices found: 1

関連項目:

- プロパティ・グラフ・テキスト索引に対する検索問合せの実行

- サンプル・プログラムの探索

5.5.3 プロパティ・グラフ・データの手動索引の使用

手動索引は、プロパティ・グラフの頂点およびエッジに対して複数の索引の定義をサポートしています。手動索引の場合、索引の要素を手動で挿入、取得および選択する必要があります。

プロパティ・グラフに対する手動索引を記述する場合、次のOracleプロパティ・グラフ・メソッドを使用して手動索引を追加、削除および操作します。

- OraclePropertyGraph.createIndex(String name, Class elementClass, Parameter[] parameters): elementClass型の要素すべてに指定した名前を使用して手動索引を作成します。

- OraclePropertyGraph.dropIndex(String name): 特定の手動索引を削除します。

- OraclePropertyGraph.getIndex(String name, Class elementClass): elementClass型の特定の手動索引の索引インスタンスを取得します。

- OraclePropertyGraph.getIndices(): プロパティ・グラフ内で作成したすべての手動で索引の索引インスタンスの配列を取得します。

提供されているExampleNoSQL7およびExampleHBase7の例では、入力ファイルからプロパティ・グラフを作成し、エッジに手動テキスト索引を作成し、いくつかのデータを索引に含めて、Apache SolrCloudを使用していくつかのテキスト検索問合せを実行します。

SolrCloudを使用する場合、「ZookeeperへのコレクションのSolrCloud構成のアップロード」で説明されているように、最初にテキスト索引のためのコレクションの構成をApache Zookeeperにロードする必要があります。

次のコード・フラグメントは、4つのシャード(ノードごとに1つのシャード)とレプリケーション係数1を使用して既存のプロパティ・グラフに手動テキスト索引を作成します。シャードの数は、SolrCloudクラスタ上のノードの数と一致します。

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(args,
szGraphName);

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";

// Do a parallel data loading
OraclePropertyGraphDataLoader opgdl =
OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);

// Create a manual text index using SolrCloud// Specify Index Directory parameters: configuration name, Solr Server URL, Solr Node set,
// replication factor, zookeeper timeout (secs),
// maximum number of shards per node,
// number of connections to database, batch size, commit size,
// write timeout (in secs)
String configName = "opgconfig";
String solrServerUrl = "nodea:2181/solr"
String solrNodeSet = "nodea:8983_solr,nodeb:8983_solr," +
"nodec:8983_solr,noded:8983_solr";

int zkTimeout = 15;
int numShards = 4;
int replicationFactor = 1;
int maxShardsPerNode = 1;

OracleIndexParameters indexParams =
OracleIndexParameters.buildSolr(configName,
solrServerUrl,
solrNodeSet,
zkTimeout,
numShards,
replicationFactor,
maxShardsPerNode,
4,
10000,
500000,
15);
opg.setDefaultIndexParameters(indexParams);

// Create manual indexing on above properties for all vertices
OracleIndex<Edge> index = ((OracleIndex<Edge>) opg.createIndex("myIdx", Edge.class));

Vertex v1 = opg.getVertices("name", "Barack Obama").iterator().next();

Iterator<Edge> edges
= v1.getEdges(Direction.OUT, "collaborates").iterator();

while (edges.hasNext()) {
Edge edge = edges.next();
Vertex vIn = edge.getVertex(Direction.IN);
index.put("collaboratesWith", vIn.getProperty("name"), edge);
}

次のコード・フラグメントは、手動索引に対して問合せを実行して、キー値ペアcollaboratesWith:Beyonceを持つすべてのエッジを取得します。さらに、get APIコールでuseWildCardsパラメータを指定することにより、ワイルドカード検索がサポートされます。

// Find all edges with collaboratesWith Beyonce.
// Wildcard searching is supported using true parameter.
edges = index.get("collaboratesWith", "Beyonce").iterator();
System.out.println("----- Edges with name Beyonce -----");
countE = 0;
while (edges.hasNext()) {
System.out.println(edges.next());
countE++;
}
System.out.println("Edges found: "+ countE);

// Find all vertices with name including Bey*.
// Wildcard searching is supported using true parameter.
edges = index.get("collaboratesWith", "*Bey*", true).iterator();
System.out.println("----- Edges with collaboratesWith Bey* -----");
countE = 0;
while (edges.hasNext()) {
System.out.println(edges.next());
countE++;
}
System.out.println("Edges found: " + countE);

前述のコード例では、次のような出力が生成されます。

----- Edges with name Beyonce -----
Edge ID 1000 from Vertex ID 1 {country:str:United States, name:str:Barack Obama, occupation:str:44th president of United States of America, political party:str:Democratic, religion:str:Christianity, role:str:political authority} =[collaborates]=> Vertex ID 2 {country:str:United States, music genre:str:pop soul , name:str:Beyonce, role:str:singer actress} edgeKV[{weight:flo:1.0}]
Edges found: 1

----- Edges with collaboratesWith Bey* -----
Edge ID 1000 from Vertex ID 1 {country:str:United States, name:str:Barack Obama, occupation:str:44th president of United States of America, political party:str:Democratic, religion:str:Christianity, role:str:political authority} =[collaborates]=> Vertex ID 2 {country:str:United States, music genre:str:pop soul , name:str:Beyonce, role:str:singer actress} edgeKV[{weight:flo:1.0}]
Edges found: 1

関連項目:

- プロパティ・グラフ・テキスト索引に対する検索問合せの実行

- サンプル・プログラムの探索

5.5.4 プロパティ・グラフ・テキスト索引に対する検索問合せの実行

自動および手動テキスト索引に対してテキスト検索問合せを実行できます。これらの機能は、特定のキー/値ペアに基づく問合せと、(ワイルドカード、ファジー検索および範囲問合せなどの拡張問合せオプションを使用した)単一または複数のキーに対するテキスト検索の実行とでは異なります。

- Apache Luceneを使用したテキスト索引に対する索引問合せの実行

- SolrCloudを使用したテキスト索引に対する索引問合せの実行

Apache Luceneを使用したテキスト索引に対する索引問合せの実行

次のコード・フラグメントは、Apache Luceneを使用して自動索引を作成し、特定のキー/値ペアを指定してテキスト索引に対する問合せを実行します。

// Do a parallel data loading
OraclePropertyGraphDataLoader opgdl =
OraclePropertyGraphDataLoader.getInstance();

opgdl.loadData(opg, szOPVFile, szOPEFile, dop);

// Create an automatic index using Apache Lucene engine.
// Specify Index Directory parameters (number of directories,
// number of connections to database, batch size, commit size,
// enable datatypes, location)
OracleIndexParameters indexParams =
OracleIndexParameters.buildFS(4, 4, 10000, 50000, true,
"/home/data/text-index ");
opg.setDefaultIndexParameters(indexParams);

// Create manual indexing on above properties for all vertices
OracleIndex<Edge> index = ((OracleIndex<Edge>) opg.createIndex("myIdx", Edge.class));

Vertex v1 = opg.getVertices("name", "Barack Obama").iterator().next();

Iterator<Edge> edges
= v1.getEdges(Direction.OUT, "collaborates").iterator();

while (edges.hasNext()) {
Edge edge = edges.next();
Vertex vIn = edge.getVertex(Direction.IN);
index.put("collaboratesWith", vIn.getProperty("name"), edge);
index.put("country", vIn.getProperty("country"), edge);
}

// Wildcard searching is supported using true parameter.
Iterator<Edge> edges = index.get("country", "United States").iterator();
System.out.println("----- Edges with query: " + queryExpr + " -----");
long countE = 0;
while (edges.hasNext()) {
System.out.println(edges.next());
countE++;
}
System.out.println("Edges found: "+ countE);

この場合、テキスト索引により、キーおよび値オブジェクトから索引問合せが生成されます。また、useWildcardsフラグが指定または有効化されていない場合、取得される結果には正確な一致のみが含まれます。値オブジェクトが数値または日時値である場合、生成される問合せは、値によって下限および上限が定義されているかどうかとは関係なく、両端を含む範囲問合せになります。数値または日時の一致のみが取得されます。

値が文字列である場合、データ型とは関係なく一致するすべてのキー/値ペアが取得されます。このタイプの問合せの結果として生成されるテキスト問合せは、オプションの検索条件セット(サポート対象のデータ型ごとに1つずつ)が含まれるブール問合せです。データ型の処理の詳細は、「データ型の処理」を参照してください。

したがって、前のコード例では、問合せ式country1:"United States" OR country9:"United States" OR … OR countryE:"United States" (Luceneのデータ型処理が有効である場合)、または country:"1United States" OR country:"2United States" OR … OR country:"EUnited States" (Luceneのデータ型処理が無効である場合)を生成します。

文字列値オブジェクトでワイルドカードが有効である場合、値はApache Lucene構文を使用して書き込む必要があります。Apache Luceneを使用したテキスト検索構文の詳細は、https://lucene.apache.org/core/2_9_4/queryparsersyntax.htmlを参照してください

問合せの実行対象のデータ型クラスを指定することにより、一致するキー/値ペアのデータ型をフィルタできます。次のコード・フラグメントは、文字列データ型のみを持つ単一のキー/値ペアを使用してテキスト索引に対して問合せを実行します。次のコードは、問合せ式country1:"United States" (Luceneのデータ型処理が有効である場合)またはcountry:"1United States" (Luceneのデータ型処理が無効である場合)を生成します。

// Wildcard searching is supported using true parameter.
Iterator<Edge> edges = index.get("country", "United States", true, String.class).iterator();

System.out.println("----- Edges with query: " + queryExpr + " -----");
long countE = 0;
while (edges.hasNext()) {
System.out.println(edges.next());
countE++;
}
System.out.println("Edges found: "+ countE);

ブール演算子を使用して処理する場合は、問合せで適切な一致が見つかるように、後続の各キー/値ペアにデータ型の接頭辞/接尾辞を追加する必要があります。自動および手動テキスト索引に必要な問合せ構文およびデータ型識別子を使用して独自のLuceneテキスト検索問合せを作成するユーザーを支援するためにユーティリティが用意されています。

LuceneIndex内のメソッドbuildSearchTerm(key, value, dtClass)は、キー(または値)にデータ型識別子を追加し、特定のデータ型およびApache Luceneのデータ型処理構成に基づいて値を必要な文字列表現に変換することにより、field:query_expr形式の問合せ式を作成します。

次のコード・フラグメントは、buildSearchTermメソッドを使用して、前の例で使用した問合せ式country1:United* (Luceneのデータ型処理が有効である場合)またはcountry:1United* (Luceneのデータ型処理が無効である場合)を生成します。

String szQueryStrCountry = index.buildSearchTerm("country",
"United*", String.class);

キーおよび値を個別オブジェクトとして扱ってWildcardQueryのような異なるLucene問合せを構築するために、LuceneIndex内のメソッドappendDatatypesSuffixToKey(key, dtClass)およびappendDatatypesSuffixToValue(value, dtClass)は、適切なデータ型識別子を追加し、特定のデータ型に基づいて値を必要なLucene文字列表現に変換します。

次のコード・フラグメントは、appendDatatypesSuffixToKeyメソッドを使用してLuceneテキスト問合せで必要なフィールド名を生成します。Luceneのデータ型処理が有効である場合、返される文字列により、文字列データ型識別子がキー(country1)の接尾辞として追加されます。それ以外の場合、取得された文字列は元のキー(country)になります。

String key = index.appendDatatypesSuffixToKey("country", String.class);

次のコード・フラグメントは、appendDatatypesSuffixToValueメソッドを使用して、Luceneテキスト問合せで必要な問合せ本体式を生成します。Luceneのデータ型処理が無効である場合、返される文字列により、文字列データ型識別子がキー(1United*)の接頭辞として追加されます。他のすべての場合、返される文字列は、値の文字列表現(United*)になります。

String value = index.appendDatatypesSuffixToValue("United*", String.class);

LuceneIndexは、メソッドbuildSearchTermObject(key, value, dtClass)を使用した条件オブジェクトの生成もサポートしています。条件オブジェクトは通常、取得対象のドキュメントのフィールドおよび値を制約するためにLucene問合せオブジェクトの様々な型の間で使用されます。次のコード・フラグメントは、buildSearchTermObjectメソッドを使用してWildcardQueryオブジェクトを作成する方法を示します。

Term term = index.buildSearchTermObject("country", "United*", String.class);
Query query = new WildcardQuery(term);

SolrCloudを使用したテキスト索引に対する索引問合せの実行

次のコード・フラグメントは、SolrCloudを使用して自動索引を作成し、特定のキー/値ペアを指定してテキスト索引に対する問合せを実行します。

// Create a manual text index using SolrCloud// Specify Index Directory parameters: configuration name, Solr Server URL, Solr Node set,
// replication factor, zookeeper timeout (secs),
// maximum number of shards per node,
// number of connections to database, batch size, commit size,
// write timeout (in secs)
String configName = "opgconfig";
String solrServerUrl = "nodea:2181/solr"
String solrNodeSet = "nodea:8983_solr,nodeb:8983_solr," +
"nodec:8983_solr,noded:8983_solr";

int zkTimeout = 15;
int numShards = 4;
int replicationFactor = 1;
int maxShardsPerNode = 1;

OracleIndexParameters indexParams =
OracleIndexParameters.buildSolr(configName,
solrServerUrl,
solrNodeSet,
zkTimeout,
numShards,
replicationFactor,
maxShardsPerNode,
4,
10000,
500000,
15);
opg.setDefaultIndexParameters(indexParams);

// specify indexed keys
String[] indexedKeys = new String[4];
indexedKeys[0] = "name";
indexedKeys[1] = "role";
indexedKeys[2] = "religion";
indexedKeys[3] = "country";

// Create auto indexing on above properties for all vertices
opg.createKeyIndex(indexedKeys, Vertex.class);

// Create manual indexing on above properties for all vertices
OracleIndex<Vertex> index = ((OracleIndex<Vertex>) opg.getAutoIndex(Vertex.class);

Iterator<Vertex> vertices = index.get("country", "United States").iterator();
System.out.println("----- Vertices with query: " + queryExpr + " -----");
countV = 0;
while (vertices.hasNext()) {
System.out.println(vertices.next());
countV++;
}
System.out.println("Vertices found: "+ countV);

この場合、テキスト索引により、値オブジェクトから索引が生成されます。また、useWildcardsフラグが指定または有効化されていない場合、取得される結果には正確な一致のみが含まれます。値オブジェクトが数値または日時値である場合、生成される問合せは、値によって下限および上限が定義されているかどうかとは関係なく、両端を含む範囲問合せになります。数値または日時の一致のみが取得されます。

値が文字列である場合、データ型とは関係なく一致するすべてのキー/値ペアが取得されます。このタイプの問合せの結果として生成されるテキスト問合せは、オプションの検索条件セット(サポート対象のデータ型ごとに1つずつ)が含まれるブール問合せです。データ型の処理の詳細は、「データ型の処理」を参照してください。

したがって、前のコード例では、問合せ式country_str:"United States" OR country_ser:"United States" OR … OR country_json:"United States"を生成します。

ワイルドカードが有効な状態で文字列値オブジェクトを使用するには、値がApache Lucene構文を使用して書き込まれる必要があります。Apache Luceneを使用したテキスト検索構文の詳細は、「データ型の処理」を参照してください

問合せの実行対象のデータ型クラスを指定することにより、一致するキー/値ペアのデータ型をフィルタできます。次のコード・フラグメントは、文字列データ型のみを持つ単一のキー/値ペアを使用してテキスト索引に対して問合せを実行します。次のコードは、問合せ式country_str:"United States"を作成します。

// Wildcard searching is supported using true parameter.
Iterator<Edge> edges = index.get("country", "United States", true, String.class).iterator();
System.out.println("----- Edges with query: " + queryExpr + " -----");
countE = 0;
while (edges.hasNext()) {
System.out.println(edges.next());
countE++;
}
System.out.println("Edges found: "+ countE);

ブール演算子を使用して処理する場合は、問合せで適切な一致が見つかるように、後続の各キー/値ペアにデータ型の接頭辞/接尾辞を追加する必要があります。自動および手動テキスト索引に必要な問合せ構文およびデータ型識別子を使用して独自のSolrCloudテキスト検索問合せを作成するユーザーを支援するためにユーティリティ・セットが用意されています。

SolrIndex内のメソッドbuildSearchTerm(key, value, dtClass)は、キー(または値)にデータ型識別子を追加し、索引に必要なデータ型形式を使用して値を必要な文字列表現に変換することにより、field:query_expr形式の問合せ式を作成します。

次のコード・フラグメントは、buildSearchTermメソッドを使用して、前の例で使用した問合せ式country_str:United*を作成します。

String szQueryStrCountry = index.buildSearchTerm("country",
"United*", String.class);

キーおよび値を個別オブジェクトとして扱ってWildcardQueryのような異なるSolrClud問合せを構築するために、SolrIndex内のメソッドappendDatatypesSuffixToKey(key, dtClass)およびappendDatatypesSuffixToValue(value, dtClass)は、適切なデータ型識別子を追加し、特定のデータ型に基づいてキーおよび値を必要なSolrCloud文字列表現に変換します。

次のコード・フラグメントは、appendDatatypesSuffixToKeyメソッドを使用してSolrCloudテキスト問合せで必要なフィールド名を生成します。取得した文字列は、文字列データ型識別子をキーの接尾辞(country_str)として追加します。

String key = index.appendDatatypesSuffixToKey("country", String.class);

次のコード・フラグメントは、appendDatatypesSuffixToValueメソッドを使用して、SolrCloudテキスト問合せで必要な問合せ本体式を生成します。返される文字列は、値の文字列表現(United*)になります。

String value = index.appendDatatypesSuffixToValue("United*", String.class);

5.5.5 データ型の処理

Oracleのプロパティ・グラフ・サポートは、値のデータ型に基づいて要素のキー/値ペアを索引付けおよび格納します。データ型処理の主な目的は、数値や日付範囲の問合せなど、包括的な問合せのサポートを提供することです。

デフォルトでは、特定のキー/値ペアに対する検索は、その値のデータ型に基づく問合せ式まで行われます。たとえば、キー値ペアage:30を持つ頂点を検索する場合は、整数のデータ型が指定されたすべての年齢フィールドに対して問合せが実行されます。値が問合せ式である場合は、API get(String key, Object value, Class dtClass, Boolean useWildcards)をコールすることにより、検索する値のデータ型クラスも指定できます。データ型が指定されていない場合、問合せ式はすべての使用可能なデータ型と一致します。

ブール演算子を使用して処理する場合は、問合せで適切な一致が見つかるように、後続の各キー/値ペアにデータ型の接頭辞/接尾辞を追加する必要があります。次の各トピックでは、Apache LuceneおよびSolrCloudでこの接頭辞/接尾辞を追加する方法について説明します。

- Apache Luceneでのデータ型識別子の追加

- SolrCloudでのデータ型識別子の追加

5.5.5.1 Apache Luceneでのデータ型識別子の追加

Luceneのデータ型処理が有効化されている場合、問合せ式のキーの接尾辞として適切なデータ型識別子を追加する必要があります。これは、キーに対してString.concat()の演算を実行することによって行うことができます。Luceneのデータ型処理が無効化されている場合、データ型識別子を値Stringに接頭辞として挿入する必要があります。表5-1は、Apache Luceneを使用したテキスト索引付けに使用可能なデータ型識別子を示しています(LuceneIndexのJavadocも参照)。

表5-2 Apache Luceneデータ型識別子

Luceneデータ型識別子

説明

TYPE_DT_STRING

String

TYPE_DT_BOOL

Boolean

TYPE_DT_DATE

Date

TYPE_DT_FLOAT

Float

TYPE_DT_DOUBLE

Double

TYPE_DT_INTEGER

Integer

TYPE_DT_LONG

Long

TYPE_DT_CHAR

Character

TYPE_DT_SHORT

Short

TYPE_DT_BYTE

Byte

TYPE_DT_SPATIAL

Spatial

TYPE_DT_SERIALIZABLE

Serializable

次のコード・フラグメントは、Luceneのデータ型処理を使用してエッジに手動索引を作成し、データを追加してから、手動索引に対して問合せを実行し、ワイルドカードを使用してキー/値ペアcollaboratesWith:Beyonce AND country1:United*を持つすべてのエッジを取得します。

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(args,
szGraphName);

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";

// Do a parallel data loading
OraclePropertyGraphDataLoader opgdl =
OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);

// Specify Index Directory parameters (number of directories,
// number of connections to database, batch size, commit size,
// enable datatypes, location)
OracleIndexParameters indexParams =
OracleIndexParameters.buildFS(4, 4, 10000, 50000, true,
"/home/data/text-index ");
opg.setDefaultIndexParameters(indexParams);
// Create manual indexing on above properties for all edges
OracleIndex<Edge> index = ((OracleIndex<Edge>) opg.createIndex("myIdx", Edge.class));

Vertex v1 = opg.getVertices("name", "Barack Obama").iterator().next();

Iterator<Edge> edges
= v1.getEdges(Direction.OUT, "collaborates").iterator();

while (edges.hasNext()) {
Edge edge = edges.next();
Vertex vIn = edge.getVertex(Direction.IN);
index.put("collaboratesWith", vIn.getProperty("name"), edge);
index.put("country", vIn.getProperty("country"), edge);
}

// Wildcard searching is supported using true parameter.
String key = "country";
key = key.concat(String.valueOf(oracle.pg.text.lucene.LuceneIndex.TYPE_DT_STRING));

String queryExpr = "Beyonce AND " + key + ":United*";
edges = index.get("collaboratesWith", queryExpr, true /*UseWildcard*/).iterator();
System.out.println("----- Edges with query: " + queryExpr + " -----");
countE = 0;
while (edges.hasNext()) {
System.out.println(edges.next());
countE++;
}
System.out.println("Edges found: "+ countE);

前述のコード例では、次のような出力が生成される可能性があります。

----- Edges with name Beyonce AND country1:United* -----
Edge ID 1000 from Vertex ID 1 {country:str:United States, name:str:Barack Obama, occupation:str:44th president of United States of America, political party:str:Democratic, religion:str:Christianity, role:str:political authority} =[collaborates]=> Vertex ID 2 {country:str:United States, music genre:str:pop soul , name:str:Beyonce, role:str:singer actress} edgeKV[{weight:flo:1.0}]
Edges found: 1

次のコード・フラグメントは、頂点に自動索引を作成し、Luceneのデータ型処理を無効化し、データを追加してから、前の例からの手動索引に対して問合せを実行し、ワイルドカードを使用してキー/値ペアcountry:United* AND role:1*political*を持つすべての頂点を取得します。

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(args,
szGraphName);

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";

// Do a parallel data loading
OraclePropertyGraphDataLoader opgdl =
OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);

// Create an automatic index using Apache Lucene engine.
// Specify Index Directory parameters (number of directories,
// number of connections to database, batch size, commit size,
// enable datatypes, location)
OracleIndexParameters indexParams =
OracleIndexParameters.buildFS(4, 4, 10000, 50000, false, "/ home/data/text-index ");
opg.setDefaultIndexParameters(indexParams);

// specify indexed keys
String[] indexedKeys = new String[4];
indexedKeys[0] = "name";
indexedKeys[1] = "role";
indexedKeys[2] = "religion";
indexedKeys[3] = "country";

// Create auto indexing on above properties for all vertices
opg.createKeyIndex(indexedKeys, Vertex.class);

// Wildcard searching is supported using true parameter.
String value = "*political*";
value = String.valueOf(LuceneIndex.TYPE_DT_STRING) + value;
String queryExpr = "United* AND role:" + value;

vertices = opg.getVertices("country", queryExpr,  true /*useWildcard*/).iterator();
System.out.println("----- Vertices with query: " + queryExpr + " -----");
countV = 0;
while (vertices.hasNext()) {
System.out.println(vertices.next());
countV++;
}
System.out.println("Vertices found: " + countV);

前述のコード例では、次のような出力が生成される可能性があります。

----- Vertices with query: United* and role:1*political* -----
Vertex ID 30 {name:str:Jerry Brown, role:str:political authority, occupation:str:34th and 39th governor of California, country:str:United States, political party:str:Democratic, religion:str:roman catholicism}
Vertex ID 24 {name:str:Edward Snowden, role:str:political authority, occupation:str:system administrator, country:str:United States, religion:str:buddhism}
Vertex ID 22 {name:str:John Kerry, role:str:political authority, country:str:United States, political party:str:Democratic, occupation:str:68th United States Secretary of State, religion:str:Catholicism}
Vertex ID 21 {name:str:Hillary Clinton, role:str:political authority, country:str:United States, political party:str:Democratic, occupation:str:67th United States Secretary of State, religion:str:Methodism}
Vertex ID 19 {name:str:Kirsten Gillibrand, role:str:political authority, country:str:United States, political party:str:Democratic, occupation:str:junior United States Senator from New York, religion:str:Methodism}
Vertex ID 13 {name:str:Ertharin Cousin, role:str:political authority, country:str:United States, political party:str:Democratic}
Vertex ID 11 {name:str:Eric Holder, role:str:political authority, country:str:United States, political party:str:Democratic, occupation:str:United States Deputy Attorney General}
Vertex ID 1 {name:str:Barack Obama, role:str:political authority, occupation:str:44th president of United States of America, country:str:United States, political party:str:Democratic, religion:str:Christianity}
Vertices found: 8

5.5.5.2 SolrCloudでのデータ型識別子の追加

SolrCloudテキスト索引のブール演算では、問合せ式のキーの接尾辞として適切なデータ型識別子を追加する必要があります。これは、キーに対してString.concat()の演算を実行することによって行うことができます。表5-3は、SolrCloudを使用したテキスト索引付けに使用可能なデータ型識別子を示しています(SolrIndexのJavadocも参照)。

表5-3 SolrCloudデータ型識別子

Solrデータ型識別子

説明

TYPE_DT_STRING

String

TYPE_DT_BOOL

Boolean

TYPE_DT_DATE

Date

TYPE_DT_FLOAT

Float

TYPE_DT_DOUBLE

Double

TYPE_DT_INTEGER

Integer

TYPE_DT_LONG

Long

TYPE_DT_CHAR

Character

TYPE_DT_SHORT

Short

TYPE_DT_BYTE

Byte

TYPE_DT_SPATIAL

Spatial

TYPE_DT_SERIALIZABLE

Serializable

次のコード・フラグメントは、SolrCloudを使用してエッジに手動索引を作成し、データを追加してから、手動索引に対して問合せを実行し、ワイルドカードを使用してキー/値ペアcollaboratesWith:Beyonce AND country1:United*を持つすべてのエッジを取得します。

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(args,
szGraphName);

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";

// Do a parallel data loading
OraclePropertyGraphDataLoader opgdl =
OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);

// Create a manual text index using SolrCloud// Specify Index Directory parameters: configuration name, Solr Server URL, Solr Node set,
// replication factor, zookeeper timeout (secs),
// maximum number of shards per node,
// number of connections to database, batch size, commit size,
// write timeout (in secs)
String configName = "opgconfig";
String solrServerUrl = "nodea:2181/solr";
String solrNodeSet = "nodea:8983_solr,nodeb:8983_solr," +
"nodec:8983_solr,noded:8983_solr";

int zkTimeout = 15;
int numShards = 4;
int replicationFactor = 1;
int maxShardsPerNode = 1;

OracleIndexParameters indexParams =
OracleIndexParameters.buildSolr(configName,
solrServerUrl,
solrNodeSet,
zkTimeout,
numShards,
replicationFactor,
maxShardsPerNode,
4,
10000,
500000,
15);
opg.setDefaultIndexParameters(indexParams);

// Create manual indexing on above properties for all vertices
OracleIndex<Edge> index = ((OracleIndex<Edge>) opg.createIndex("myIdx", Edge.class));

Vertex v1 = opg.getVertices("name", "Barack Obama").iterator().next();

Iterator<Edge> edges
= v1.getEdges(Direction.OUT, "collaborates").iterator();

while (edges.hasNext()) {
Edge edge = edges.next();
Vertex vIn = edge.getVertex(Direction.IN);
index.put("collaboratesWith", vIn.getProperty("name"), edge);
index.put("country", vIn.getProperty("country"), edge);
}

// Wildcard searching is supported using true parameter.
String key = "country";
key = key.concat(oracle.pg.text.solr.SolrIndex.TYPE_DT_STRING);

String queryExpr = "Beyonce AND " + key + ":United*";
edges = index.get("collaboratesWith", queryExpr, true /** UseWildcard*/).iterator();
System.out.println("----- Edges with query: " + queryExpr + " -----");
countE = 0;
while (edges.hasNext()) {
System.out.println(edges.next());
countE++;
}
System.out.println("Edges found: "+ countE);

前述のコード例では、次のような出力が生成される可能性があります。

----- Edges with name Beyonce AND country_str:United* -----
Edge ID 1000 from Vertex ID 1 {country:str:United States, name:str:Barack Obama, occupation:str:44th president of United States of America, political party:str:Democratic, religion:str:Christianity, role:str:political authority} =[collaborates]=> Vertex ID 2 {country:str:United States, music genre:str:pop soul , name:str:Beyonce, role:str:singer actress} edgeKV[{weight:flo:1.0}]
Edges found: 1

5.5.6 ZookeeperへのコレクションのSolrCloud構成のアップロード

Oracle Big Data Spatial and Graphプロパティ・グラフでSolrCloudテキスト索引を使用する前に、コレクションの構成をZookeeperにアップロードする必要があります。これは、SolrCloudクラスタ・ノードのいずれかでZkCliツールを使用して実行できます。

事前定義済のコレクション構成ディレクトリは、インストール・ホームの下にあるdal/opg-solr-configにあります。次に、PropertyGraph構成ディレクトリのアップロード方法の例を示します。

1. インストール・ホームの下にあるdal/opg-solr-configを、Solrクラスタ・ノードのいずれかにある/tmpディレクトリにコピーします。次に例を示します。

scp –r dal/opg-solr-config user@solr-node:/tmp

2. 同じノードでZkCliツールを使用して、次の例のように次のコマンドを実行します。

$SOLR_HOME/bin/zkcli.sh -zkhost 127.0.0.1:2181/solr -cmd upconfig –confname opgconfig -confdir /tmp/opg-solr-config

5.5.7 プロパティ・グラフ・データのテキスト索引の構成設定の更新

Oracleのプロパティ・グラフ・サポートは、Apache LuceneおよびSolrCloudとの統合によって手動および自動テキスト索引を管理します。作成時に、テキスト検索で使用される検索エンジンとその他の構成設定を指定するOracleIndexParametersオブジェクトを作成する必要があります。プロパティ・グラフのテキスト索引が作成された後、これらの構成設定を変更することはできません。自動索引の場合、すべての頂点索引キーは単一のテキスト索引によって管理され、すべてのエッジ索引キーは最初の頂点またはエッジ・キーが索引付けされるときに指定された構成を使用して、異なるテキスト索引によって管理されます。

構成設定を変更する必要がある場合は、最初に現在の索引を無効にしてから、新しいOracleIndexParametersオブジェクトを使用してそれを再度作成する必要があります。次のコード・フラグメントは、既存のプロパティ・グラフに対して2つのApache Luceneベースの自動索引(頂点およびエッジ)を作成し、それらを無効にしてから、SolrCloudを使用するために再作成します。

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(
args,  szGraphName);

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";

// Do parallel data loading
OraclePropertyGraphDataLoader opgdl =
OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);

// Create an automatic index using Apache Lucene.
// Specify Index Directory parameters (number of directories,
// number of connections to database, batch size, commit size,
// enable datatypes, location)
OracleIndexParameters luceneIndexParams =
OracleIndexParameters.buildFS(4, 4, 10000, 50000, true,
"/home/oracle/text-index ");

// Specify indexed keys
String[] indexedKeys = new String[4];
indexedKeys[0] = "name";
indexedKeys[1] = "role";
indexedKeys[2] = "religion";
indexedKeys[3] = "country";

// Create auto indexing on above properties for all vertices
opg.createKeyIndex(indexedKeys, Vertex.class, luceneIndexParams.getParameters());

// Create auto indexing on weight for all edges
opg.createKeyIndex("weight", Edge.class, luceneIndexParams.getParameters());

// Disable auto indexes to change parameters
opg.getOracleIndexManager().disableVertexAutoIndexer();
opg.getOracleIndexManager().disableEdgeAutoIndexer();

// Recreate text indexes using SolrCloud
// Specify Index Directory parameters: configuration name, Solr Server URL, Solr Node set,
// replication factor, zookeeper timeout (secs),
// maximum number of shards per node,
// number of connections to database, batch size, commit size,
// write timeout (in secs)
String configName = "opgconfig";
String solrServerUrl = "nodea:2181/solr";
String solrNodeSet = "nodea:8983_solr,nodeb:8983_solr," +
"nodec:8983_solr,noded:8983_solr";

int zkTimeout = 15;
int numShards = 4;
int replicationFactor = 1;
int maxShardsPerNode = 1;

OracleIndexParameters solrIndexParams =
OracleIndexParameters.buildSolr(configName,
solrServerUrl,
solrNodeSet,
zkTimeout,
numShards,
replicationFactor,
maxShardsPerNode,
4,
10000,
500000,
15);

// Create auto indexing on above properties for all vertices
opg.createKeyIndex(indexedKeys, Vertex.class, solrIndexParams.getParameters());

// Create auto indexing on weight for all edges
opg.createKeyIndex("weight", Edge.class, solrIndexParams.getParameters());

5.5.8 プロパティ・グラフ・データのテキスト索引でのパラレル問合せの使用

Oracle Big Data Spatial and Graphのテキスト索引では、パラレル問合せ実行を使用して、特定のキー/値またはキー/テキスト・ペア別に数百万の頂点およびエッジに対してテキスト問合せを実行できます。

パラレル・テキスト問合せは、SolrCloud(またはApache Luceneのサブディレクトリ)内のシャード間での索引データの配分を利用する最適化されたソリューションであり、各シャードは別個の索引接続を使用して問い合せられます。これには、読取り操作のパフォーマンスを向上させて索引から複数の要素を取得するために、複数のスレッドとSolrCloud (またはApache Lucene)検索エンジンへの接続が関連します。このアプローチでは、スコアに基づく一致結果のランク付けは行われません。

パラレル・テキスト問合せでは、各要素がシャードからの指定されたK/Vペアに一致する属性を持つすべての頂点(またはエッジ)を保持する配列が生成されます。問い合せられたシャードのサブセットは、特定の開始サブディレクトリIDと指定された接続の配列のサイズによって区切られます。これにより、サブセットは[開始, 開始 - 1 + 接続の配列のサイズ]の範囲内のシャードを考慮します。Nシャードを含む索引にあるすべてのシャードに、([0, N - 1]の範囲の)整数IDが割り当てられることに注意してください。

Apache Luceneを使用したパラレル・テキスト問合せ

LuceneIndexでgetPartitionedメソッドを呼び出して、サブディレクトリのセットへの接続の配列(SearcherManagerオブジェクト)、検索するキー/値ペア、および開始サブディレクトリIDを指定することにより、Apache Luceneを使用したパラレル・テキスト問合せを使用できます。各サブディレクトリは索引のその他のサブディレクトリに依存していないため、各接続が適切なサブディレクトリにリンクしている必要があります。

次のコード・フラグメントは、Apache Lucene検索エンジンを使用して自動テキスト索引を生成し、パラレル・テキスト問合せを実行します。LuceneIndexクラスでのgetPartitionedメソッドの呼出し数は、サブディレクトリの合計数と使用される接続の数によって制御されます。

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(
args, szGraphName);

// Clear existing vertices/edges in the property graph
opg.clearRepository();

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";

// This object will handle parallel data loading
OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);

// Create an automatic index
OracleIndexParameters indexParams
= OracleIndexParameters.buildFS(dop /* number of directories */,
dop /* number of connections
used when indexing */,
10000 /* batch size before commit*/,
500000 /* commit size before Lucene commit*/,
true /* enable datatypes */,
"./lucene-index" /* index location */);

opg.setDefaultIndexParameters(indexParams);

// Create auto indexing on name property for all vertices
System.out.println("Create automatic index on name for vertices");
opg.createKeyIndex("name", Vertex.class);

// Get the LuceneIndex object
SearcherManager[] conns = new SearcherManager[dop];
LuceneIndex<Vertex> index = (LuceneIndex<Vertex>) opg.getAutoIndex(Vertex.class);

long lCount = 0;
for (int split = 0; split < index.getTotalShards();
split += conns.length) {
// Gets a connection object from subdirectory split to
//(split + conns.length)
for (int idx = 0; idx < conns.length; idx++) {
conns[idx] = index.getOracleSearcherManager(idx + split);
}

// Gets elements from split to split + conns.length
Iterable<Vertex>[] iterAr
= index.getPartitioned(conns /* connections */,
"name"/* key */,
"*" /* value */,
true /* wildcards */,
split /* start split ID */);

lCount = countFromIterables(iterAr); /* Consume iterables in parallel */

// Do not close the connections to the subdirectories after completion,
// because those connections are used by the LuceneIndex object itself.
}

// Count all vertices
System.out.println("Vertices found using parallel query: " + lCount);

SolrCloudを使用したパラレル・テキスト検索

SolrIndexでgetPartitionedメソッドを呼び出して、SolrCloudへの接続の配列(CloudSolrServerオブジェクト)、検索するキー/値ペア、および開始シャードIDを指定することにより、SolrCloudを使用したパラレル・テキスト問合せを使用できます。

次のコード・フラグメントは、SolrCloud検索エンジンを使用して自動テキスト索引を生成し、パラレル・テキスト問合せを実行します。SolrIndexクラスでのgetPartitionedメソッドの呼出し数は、索引内のシャードの合計数と使用される接続の数によって制御されます。

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(
args, szGraphName);

// Clear existing vertices/edges in the property graph
opg.clearRepository();

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";

// This object will handle parallel data loading
OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);

String configName = "opgconfig";
String solrServerUrl = args[4];//"localhost:2181/solr"
String solrNodeSet = args[5]; //"localhost:8983_solr";

int zkTimeout = 15; // zookeeper timeout in seconds
int numShards = Integer.parseInt(args[6]); // number of shards in the index
int replicationFactor = 1; // replication factor
int maxShardsPerNode = 1; // maximum number of shards per node

// Create an automatic index using SolrCloud
OracleIndexParameters indexParams =
OracleIndexParameters.buildSolr(configName,
solrServerUrl,
solrNodeSet,
zkTimeout /* zookeeper timeout in seconds */,
numShards /* total number of shards */,
replicationFactor /* Replication factor */,
maxShardsPerNode /* maximum number of shardsper node*/,
4 /* dop used for scan */,
10000 /* batch size before commit*/,
500000 /* commit size before SolrCloud commit*/,
15 /* write timeout in seconds */);

opg.setDefaultIndexParameters(indexParams);

// Create auto indexing on name property for all vertices
System.out.println("Create automatic index on name for vertices");
opg.createKeyIndex("name", Vertex.class);

// Get the SolrIndex object
SearcherManager[] conns = new SearcherManager[dop];
SolrIndex<Vertex> index = (SolrIndex<Vertex>) opg.getAutoIndex(Vertex.class);

// Open an array of connections to handle connections to SolrCloud needed for parallel text search
CloudSolrServer[] conns = new CloudSolrServer[dop];

for (int idx = 0; idx < conns.length; idx++) {
conns[idx] = index.getCloudSolrServer(15 /* write timeout in
secs*/);
}

// Iterate to cover all the shards in the index
long lCount = 0;
for (int split = 0; split < index.getTotalShards();
split += conns.length) {
// Gets elements from split to split + conns.length
Iterable<Vertex>[] iterAr = index.getPartitioned(conns /* connections */,
"name"/* key */,
"*" /* value */,
true /* wildcards */,
split /* start split ID */);

lCount = countFromIterables(iterAr); /* Consume iterables in parallel */
}

// Close the connections to the subdirectories after completed
for (int idx = 0; idx < conns.length; idx++) {
conns[idx].shutdown();
}

// Count results
System.out.println("Vertices found using parallel query: " + lCount);

5.5.9 プロパティ・グラフ・データのテキスト索引に対するネイティブ問合せオブジェクトの使用

問合せオブジェクトの直接使用は上級ユーザーを対象としており、これらのユーザーは、テキスト索引エンジン(Apache LuceneまたはSolrCloud)の基礎となる問合せ機能を最大限に活用できるようになります。たとえば、一致スコアにboostを追加したりソート句を追加したりするなど、テキスト検索に制約を追加できます。

テキスト検索とともに問合せオブジェクトを使用すると、制約を満たしながら、テキスト問合せと一致する属性(または属性セット)とともにすべての頂点(またはエッジ)を保持する反復可能オブジェクトが作成されます。このアプローチでは、一致スコアに基づいて結果が自動的にランク付けされます。

問合せ本体内で句を構築するには、照合対象のキー/値ペアによって使用されるデータ型、および使用される検索エンジンの構成を考慮する必要がある場合があります。検索条件の構築の詳細は、「データ型の処理」を参照してください。

Apache Luceneを使用したネイティブ問合せオブジェクトの使用

LuceneIndexでメソッドget(Query)を呼び出すことにより、Apache Luceneを使用してネイティブ問合せオブジェクトを使用できます。LuceneIndexでメソッドgetPartitioned(SearcherManager[], Query, int)を呼び出して、サブディレクトリのセットへの接続の配列(SearcherManagerオブジェクト)、Lucene問合せオブジェクト、および開始サブディレクトリIDを指定することにより、ネイティブ問合せオブジェクトを使用したパラレル・テキスト問合せを使用することもできます。各サブディレクトリは索引のその他のサブディレクトリに依存していないため、各接続が適切なサブディレクトリにリンクしている必要があります。

次のコード・フラグメントは、Apache Lucene検索エンジンを使用して自動テキスト索引を生成し、Lucene問合せを作成し、パラレル・テキスト問合せを実行します。LuceneIndexクラスでのgetPartitionedメソッドの呼出し数は、サブディレクトリの合計数と使用される接続の数によって制御されます。

import oracle.pg.text.lucene.LuceneIndex;
import org.apache.lucene.search.*;
import org.apache.lucene.index.*;

...

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(
args, szGraphName);

// Clear existing vertices/edges in the property graph
opg.clearRepository();

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";

// This object will handle parallel data loading
OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);

// Create an automatic index
OracleIndexParameters indexParams = OracleIndexParameters.buildFS(dop /* number of directories */,
dop /* number of connections
used when indexing */,
10000 /* batch size before commit*/,
500000 /* commit size before Lucene commit*/,
true /* enable datatypes */,
"./lucene-index" /* index location */);

opg.setDefaultIndexParameters(indexParams);

// Create auto indexing on name and country properties for all vertices
System.out.println("Create automatic index on name and country for vertices");
String[] indexedKeys = new String[2];
indexedKeys[0]="name";
indexedKeys[1]="country";
opg.createKeyIndex(indexedKeys, Vertex.class);

// Get the LuceneIndex object
LuceneIndex<Vertex> index = (LuceneIndex<Vertex>) opg.getAutoIndex(Vertex.class);

// Search first for Key name with property value Beyon* using only string
//data types
Term term = index.buildSearchTermObject("name", "Beyo*", String.class);
Query queryBey = new WildcardQuery(term);

// Add another condition to query all the vertices whose country is
//"United States"
String key = index.appendDatatypesSuffixToKey("country", String.class);
String value = index.appendDatatypesSuffixToValue("United States", String.class);

Query queryCountry = new PhraseQuery();
StringTokenizer st = new StringTokenizer(value);
while (st.hasMoreTokens()) {
queryCountry.add(new Term(key, st.nextToken()));
};

//Concatenate queries
BooleanQuery bQuery = new BooleanQuery();
bQuery.add(queryBey, BooleanClause.Occur.MUST);
bQuery.add(queryCountry, BooleanClause.Occur.MUST);

long lCount = 0;
SearcherManager[] conns = new SearcherManager[dop];
for (int split = 0; split < index.getTotalShards(); split += conns.length) {
// Gets a connection object from subdirectory split to
//(split + conns.length). Skip the cache so we clone the connection and
// avoid using the connection used by the index.
for (int idx = 0; idx < conns.length; idx++) {
conns[idx] = index.getOracleSearcherManager(idx + split,
true /* skip looking in the cache*/
);
}

// Gets elements from split to split + conns.length
Iterable<Vertex>[] iterAr = index.getPartitioned(conns /* connections */,
bQuery,
split /* start split ID */);

lCount = countFromIterables(iterAr); /* Consume iterables in parallel */

// Do not close the connections to the sub-directories after completed,
// as those connections are used by the index itself

}

// Count all vertices
System.out.println("Vertices found using parallel query: " + lCount);

SolrCloudを使用したネイティブ問合せオブジェクトの使用

SolrIndexでメソッドget(SolrQuery)を呼び出すことにより、SolrCloudに対してネイティブ問合せオブジェクトを直接使用できます。SolrIndexでメソッドgetPartitioned(CloudSolrServer[],SolrQuery,int)を呼び出して、SolrCloudへの接続の配列 (CloudSolrServerオブジェクト)、SolrQueryオブジェクト、および開始シャードIDを指定することにより、ネイティブ問合せオブジェクトを使用したパラレル・テキスト問合せを使用することもできます。

次のコード・フラグメントは、Apache SolrCloud検索エンジンを使用して自動テキスト索引を生成し、SolrQueryオブジェクトを作成し、パラレル・テキスト問合せを実行します。SolrIndexクラスでのgetPartitionedメソッドの呼出し数は、サブディレクトリの合計数と使用される接続の数によって制御されます。

import oracle.pg.text.solr.*;
import org.apache.solr.client.solrj.*;

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(
args, szGraphName);

// Clear existing vertices/edges in the property graph
opg.clearRepository();

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";

// This object will handle parallel data loading
OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);

String configName = "opgconfig";
String solrServerUrl = args[4];//"localhost:2181/solr"
String solrNodeSet = args[5]; //"localhost:8983_solr";

int zkTimeout = 15; // zookeeper timeout in seconds
int numShards = Integer.parseInt(args[6]); // number of shards in the index
int replicationFactor = 1; // replication factor
int maxShardsPerNode = 1; // maximum number of shards per node

// Create an automatic index using SolrCloud
OracleIndexParameters indexParams =
OracleIndexParameters.buildSolr(configName,
solrServerUrl,
solrNodeSet,
zkTimeout          /* zookeeper timeout in seconds */,
numShards          /* total number of shards */,
replicationFactor  /* Replication factor */,
maxShardsPerNode   /* maximum number of shardsper node*/,
4                  /* dop used for scan */,
10000              /* batch size before commit*/,
500000             /* commit size before SolrCloud commit*/,
15                 /* write timeout in seconds */
);

opg.setDefaultIndexParameters(indexParams);

// Create auto indexing on name property for all vertices
System.out.println("Create automatic index on name and country for vertices");
String[] indexedKeys = new String[2];
indexedKeys[0]="name";
indexedKeys[1]="country";
opg.createKeyIndex(indexedKeys, Vertex.class);

// Get the SolrIndex object
SolrIndex<Vertex> index = (SolrIndex<Vertex>) opg.getAutoIndex(Vertex.class);

// Search first for Key name with property value Beyon* using only string
//data types
String szQueryStrBey = index.buildSearchTerm("name", "Beyo*", String.class);
String key = index.appendDatatypesSuffixToKey("country", String.class);
String value = index.appendDatatypesSuffixToValue("United States", String.class);

String szQueryStrCountry = key + ":" + value;
Solrquery query = new SolrQuery(szQueryStrBey + " AND " + szQueryStrCountry);

//Query using get operation
index.get(query);

// Open an array of connections to handle connections to SolrCloud needed
// for parallel text search
CloudSolrServer[] conns = new CloudSolrServer[dop];

for (int idx = 0; idx < conns.length; idx++) {
conns[idx] = index.getCloudSolrServer(15 /* write timeout in
secs*/);
}

// Iterate to cover all the shards in the index
long lCount = 0;
for (int split = 0; split < index.getTotalShards();
split += conns.length) {
// Gets elements from split to split + conns.length
Iterable<Vertex>[] iterAr = index.getPartitioned(conns /* connections */,
query,
split /* start split ID */);

lCount = countFromIterables(iterAr); /* Consume iterables in parallel */
}

// Close the connections to SolCloud after completion
for (int idx = 0; idx < conns.length; idx++) {
conns[idx].shutdown();
}

// Count results
System.out.println("Vertices found using parallel query: " + lCount);

5.5.10 プロパティ・グラフ・データのテキスト索引に対するネイティブ問合せ結果の使用

プロパティ・グラフ・データに対してネイティブ問合せ結果を直接使用すると、ユーザーがテキスト索引エンジン(Apache LuceneまたはSolrCloud)の問合せ機能を最大限に活用できるようになります。この方法により、ユーザーは、テキスト・エンジンに対して様々なタイプの問合せ(ファセット問合せなど)を実行し、取得した結果を頂点(またはエッジ)オブジェクトに解析できます。

問合せ関係とともにテキスト検索を使用すると、特定の結果オブジェクトからすべての頂点を保持するIterableオブジェクトが生成されます。このアプローチでは、結果セット順序に基づいて結果が自動的にランク付けされます。

Apache LuceneまたはSolrCloud索引に対して検索問合せを直接実行するには、照合対象のキー/値ペアによって使用されるデータ型、および使用される検索エンジンの構成を考慮する必要がある場合があります。検索条件の構築の詳細は、「データ型の処理」を参照してください。

- Apache Luceneを使用したネイティブ問合せ結果の使用

- SolrCloudを使用したネイティブ問合せ結果の使用

Apache Luceneを使用したネイティブ問合せ結果の使用

LuceneIndexでメソッドget(TopDocs)を呼び出すことにより、Apache Luceneを使用してネイティブ問合せ結果を使用できます。TopDocsオブジェクトには、特定のApache Luceneディレクトリに対するテキスト検索問合せと一致するドキュメント・セットが用意されています。LuceneIndexは、TopDocsオブジェクト内で見つかったドキュメントからのすべての頂点(またはエッジ)を保持するIterableオブジェクトを作成します。

Apache Luceneを使用したOracleプロパティ・グラフ・テキスト索引は、複数のApache Luceneディレクトリを使用して作成されます。索引付けされた頂点およびエッジは、記憶域のスケーラビリティおよび問合せのパフォーマンスを高めるためにディレクトリ間で分散されます。プロパティ・グラフのテキスト索引内のすべてのデータに対して問合せを実行する必要がある場合、各Apache Luceneディレクトリに対して問合せを実行します。LuceneIndex内のAPI getOracleSearcherを使用することにより、ディレクトリに関連付けられたIndexSearcherオブジェクトを簡単に取得できます。

次のコード・フラグメントは、Apache Lucene検索エンジンを使用して自動テキスト索引を生成し、Lucene問合せを作成し、これをIndexSearcherオブジェクトに対して実行してTopDocsオブジェクトを取得します。後で、特定の結果オブジェクトから頂点のIterableオブジェクトが作成されます。

import oracle.pg.text.lucene.LuceneIndex;
import org.apache.lucene.search.*;
import org.apache.lucene.index.*;

...

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(
…);

// Create an automatic index
OracleIndexParameters indexParams = OracleIndexParameters.buildFS(dop /* number of directories */,
dop /* number of connections
used when indexing */,
10000 /* batch size before commit*/,
500000 /* commit size before Lucene commit*/,
true /* enable datatypes */,
"./lucene-index" /* index location */);

opg.setDefaultIndexParameters(indexParams);

// Create auto indexing on name and country properties for all vertices
System.out.println("Create automatic index on name and country for vertices");
String[] indexedKeys = new String[2];
indexedKeys[0]="name";
indexedKeys[1]="country";
opg.createKeyIndex(indexedKeys, Vertex.class);

// Get the LuceneIndex object
LuceneIndex<Vertex> index = (LuceneIndex<Vertex>) opg.getAutoIndex(Vertex.class);

// Search first for Key name with property value Beyon* using only string
//data types
Term term = index.buildSearchTermObject("name", "Beyo*", String.class);
Query queryBey = new WildcardQuery(term);

// Add another condition to query all the vertices whose country is
//"United States"
String key = index.appendDatatypesSuffixToKey("country", String.class);
String value = index.appendDatatypesSuffixToValue("United States", String.class);

Query queryCountry = new PhraseQuery();
StringTokenizer st = new StringTokenizer(value);
while (st.hasMoreTokens()) {
queryCountry.add(new Term(key, st.nextToken()));
};

//Concatenate queries
BooleanQuery bQuery = new BooleanQuery();
bQuery.add(queryBey, BooleanClause.Occur.MUST);
bQuery.add(queryCountry, BooleanClause.Occur.MUST);

// Get the IndexSearcher object needed to execute the query.
// The index searcher object is mapped to a single Apache Lucene directory
SearcherManager searcherMgr =
index.getOracleSearcherManager(0, true /* skip looking in the cache*/);
IndexSearcher indexSearcher = searcherMgr.acquire();
// search for the first 1000 results in the current index directory 0
TopDocs docs = index.search(bQuery, 1000);

long lCount = 0;
Iterable<Vertex> it = index.get(docs);

while (it.hasNext()) {
System.out.println(it.next());
lCount++;
}
System.out.println("Vertices found: "+ lCount);

SolrCloudを使用したネイティブ問合せ結果の使用

SolrIndexでメソッドget(QueryResponse)を呼び出すことにより、SolrCloudを使用してネイティブ問合せ結果を使用できます。QueryResponseオブジェクトには、特定のSolrCloudコレクションに対するテキスト検索問合せと一致するドキュメント・セットが用意されています。SolrIndexは、QueryResponseオブジェクト内で見つかったドキュメントからのすべての頂点(またはエッジ)を保持するIterableオブジェクトを作成します。

次のコード・フラグメントは、Apache SolrCloud検索エンジンを使用して自動テキスト索引を生成し、SolrQueryオブジェクトを作成し、これをCloudSolrServerオブジェクトに対して実行してQueryResponseオブジェクトを取得します。後で、特定の結果オブジェクトから頂点のIterableオブジェクトが作成されます。

import oracle.pg.text.solr.*;
import org.apache.solr.client.solrj.*;

OraclePropertyGraph opg = OraclePropertyGraph.getInstance(
…);

String configName = "opgconfig";
String solrServerUrl = args[4];//"localhost:2181/solr"
String solrNodeSet = args[5]; //"localhost:8983_solr";

int zkTimeout = 15; // zookeeper timeout in seconds
int numShards = Integer.parseInt(args[6]); // number of shards in the index
int replicationFactor = 1; // replication factor
int maxShardsPerNode = 1; // maximum number of shards per node

// Create an automatic index using SolrCloud
OracleIndexParameters indexParams =
OracleIndexParameters.buildSolr(configName,
solrServerUrl,
solrNodeSet,
zkTimeout          /* zookeeper timeout in seconds */,
numShards          /* total number of shards */,
replicationFactor  /* Replication factor */,
maxShardsPerNode   /* maximum number of shardsper node*/,
4                  /* dop used for scan */,
10000              /* batch size before commit*/,
500000             /* commit size before SolrCloud commit*/,
15                 /* write timeout in seconds */
);

opg.setDefaultIndexParameters(indexParams);

// Create auto indexing on name property for all vertices
System.out.println("Create automatic index on name and country for vertices");
String[] indexedKeys = new String[2];
indexedKeys[0]="name";
indexedKeys[1]="country";
opg.createKeyIndex(indexedKeys, Vertex.class);

// Get the SolrIndex object
SolrIndex<Vertex> index = (SolrIndex<Vertex>) opg.getAutoIndex(Vertex.class);

// Search first for Key name with property value Beyon* using only string
//data types
String szQueryStrBey = index.buildSearchTerm("name", "Beyo*", String.class);
String key = index.appendDatatypesSuffixToKey("country", String.class);
String value = index.appendDatatypesSuffixToValue("United States", String.class);

String szQueryStrCountry = key + ":" + value;
Solrquery query = new SolrQuery(szQueryStrBey + " AND " + szQueryStrCountry);

CloudSolrServer conn = index.getCloudSolrServer(15 /* write timeout in
secs*/);

//Query using get operation
QueryResponse qr = conn.query(query, SolrRequest.METHOD.POST);
Iterable<Vertex> it = index.get(qr);

long lCount = 0;

while (it.hasNext()) {
System.out.println(it.next());
lCount++;
}

System.out.println("Vertices found: "+ lCount);

5.6 PGQLを使用したプロパティ・グラフ・データに対する問合せ

Oracle Big Data Spatial and Graphは、豊富なグラフ・パターン一致機能セットをサポートしています。

これには、PGQL (Property Graph Query Language)と呼ばれるSQLに似た宣言言語が用意されています。PGQLを使用すると、頂点とエッジ、および頂点とエッジのプロパティに関する制約で構成されたグラフ問合せパターンを表現できます。詳細は、次を参照してください。

- PGQLの仕様: https://docs.oracle.com/cd/E56133_01/latest/reference/pgql-specification.html

プロパティ・グラフ問合せの例を次に示します。これにより、古来の有名な格言である「敵の敵は味方である」から着想を得たグラフ・パターンが定義されます。この例では、変数x、y、zが頂点に使用され、変数e1、 e2がエッジに使用されます。エッジ・ラベルに対する制約があり、問合せによって頂点xおよびyのnameプロパティの値が返されます(予測されます。)。

SELECT x.name, z.name
WHERE
x -[e1:'feuds']-> y,
y -[e2:'feuds']-> z

前の問合せを正常に実行するには、インメモリー・グラフの構築時に、頂点/エッジ・プロパティに加えて、エッジ・ラベルを読み込むために必要なフラグを設定します。Oracle NoSQL Databaseのグラフ構成の例は、次のとおりです。

cfg = GraphConfigBuilder.setName(...) .hasEdgeLabel(true).setLoadEdgeLabel(true) .addEdgeProperty(...).build();

問合せは、Groovyシェル環境で実行することも、Javaから実行することもできます。たとえば、前の問合せをApache HBaseまたはOracle NoSQL Database用のGroovyシェルから実行するには、最初にグラフをデータベースからインメモリー・アナリストに読み込み、インメモリー・グラフを取得し、queryPgql関数を呼び出します。

// Read graph data from a backend database into memory
// Note that opg is an instance of OraclePropertyGraph class
opg-hbase> G = session.readGraphWithProperties(opg.getConfig());
opg-hbase>

resultSet = G.queryPgql("SELECT x.name, z.name WHERE x -[e1 WITH label = 'feuds']-> y,  y -[e2 WITH label = 'feuds']-> z")

結果セット内で最初に予測した変数の型および変数名を取得するには、次を入力できます。

opg-hbase> resultElement = resultElements.get(0)
opg-hbase> type = resultElement.getElementType() // STRING
opg-hbase> varName = resultElement.getVarName() // x.name

また、結果セットを反復することもできます。次に例を示します。

opg-hbase> resultSet.getResults().each { \
// the variable 'it' is implicitly declared to references each PgqlResult instance
}

最後に、結果を表示(出力)できます。たとえば、最初の10の行を表示するには、次のようにします。

opg-hbase> resultSet.print(10) // print the first 10 results

関連項目:

PGQLを使用してインメモリー・グラフに対してパターンマッチング問合せを発行する例は、「グラフを使用したパターンマッチング問合せの使用」を参照してください

5.7 プロパティ・グラフ・データを使用したApache Sparkの使用

Apache Sparkは、大量のデータを効率的に処理することを可能にし、データを処理するためのライブラリ・セット(SQL、MLlib、Spark StreamingおよびDataFrame)が用意されています。Apache Sparkでは、HDFS、Oracle NoSQL DatabaseおよびApache HBaseなどの様々なソースからデータを読み込むことができます。

Oracle NoSQL DatabaseまたはApache HBaseに格納されているグラフ・データに対してApache Sparkジョブを実行するために、ヘルパー・メソッドのセットが用意されています。この方法により、Apache Sparkベースのアプリケーションにグラフを簡単にロードできるため、Spark SQLを使用して情報を問い合せたり、MLlibに用意されている関数を実行したりできるようになります。

インタフェースSparkUtilsBaseには、頂点(およびエッジ)表に格納されている頂点またはエッジの情報をすべて収集するためのメソッドのセットが用意されています。この情報には、頂点(またはエッジ)識別子、プロパティ名と値、およびラベル、入力および出力頂点(エッジの場合のみ)が含まれます。SparkUtilsは、(CDH 5.7および5.9に含まれる) Sparkバージョン1.6を使用します。

SparkUtilsBaseには、バックエンド表からグラフ情報にデータ変換するために次のメソッドが含まれます。

- getGraphElementReprOnDB(dbObj): バックエンド・データベースに格納されている頂点(またはエッジ)のデータベース表現を取得します。

- getElementID(Object graphElementReprOnDB): グラフ要素(頂点またはエッジ) IDを取得します。

- getPropertyValue(Object graphElementReprOnDB, String key): 特定のプロパティ・キーのグラフ要素のプロパティ値を取得します。

- getPropertyNames(Object graphElementReprOnDB): バックエンド・データベースから特定のグラフ要素表現のプロパティ名のセットを返します。

- isElementForVertex(Object graphElementReprOnDB): データベース結果から取得した特定のグラフ要素オブジェクトが頂点の表現であるかどうかを検証します。

- isElementForEdge(Object graphElementReprOnDB): データベース結果から取得した特定のグラフ要素オブジェクトが頂点の表現であるかどうかを検証します。

- getInVertexID(Object graphElementReprOnDB): エッジのデータベース表現から入力頂点IDを取得します。

- getOutVertexID(Object graphElementReprOnDB): エッジのデータベース表現から出力頂点IDを取得します。

- getEdgeLabel(Object graphElementReprOnDB): エッジのデータベース表現からエッジ・ラベルを取得します。

- Apache HBase内のプロパティ・グラフ・データを使用したApache Sparkの使用

- Oracle NoSQL Databaseに格納されているプロパティ・グラフ・データとApache Sparkとの統合

5.7.1 Apache HBase内のプロパティ・グラフ・データを使用したApache Sparkの使用

oracle.pg.hbase.SparkUtilsクラスには、Apache HBaseに格納されている<graph_name>VT. (または<graph_name>GE.)表内の行として表現される頂点(またはエッジ)に関する情報を収集するメソッドが含まれます。Apache HBaseでは、表をスキャンする場合、各行には対応するorg.apache.hadoop.hbase.client.Resultオブジェクトがあります。

SparkUtilsを使用してApache Sparkジョブをプロパティ・グラフに対して実行するには、最初にグラフ・データをApache Spark RDDオブジェクトにロードする必要があります。これを行うには、sc (アプリケーションのSparkコンテキスト)を作成する必要があります。次の例では、Sparkコンテキスト・オブジェクトを作成します。

import org.apache.spark.SparkContext.*;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import oracle.pg.hbase.SparkUtils;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.mapreduce.TableInputFormat;
import org.apache.hadoop.conf.Configuration;

SparkContext sc = new SparkContext(new SparkConf().setAppName("Example")
.setMaster("spark://localhost:7077"));

このコンテキストを使用して、newAPIHadoopRDDメソッドを呼び出すことにより、HadoopファイルからRDDを簡単に取得できます。これを行うには、Apache HBaseに格納されている頂点およびエッジ表にアクセスするためのHadoop構成オブジェクトを最初に作成する必要があります。構成オブジェクトは、Apache HBaseに接続するために使用するパラメータ(Zookeeper定数、Zookeperクライアント・ポートおよび表名など)を指定します。この構成オブジェクトは、newAPIHadoopRDDとともにInputFormatおよびそのキーと値のクラスによって使用されます。このメソッドの結果は、RDD[(ImmutableBytesWritable, Result)]型のRDDになります。

次の例では、Apache HBaseに接続し、グラフの頂点表を読み込むための構成オブジェクトを作成します。socialNetVT.が、グラフの頂点に関する情報が含まれるApache HBase表の名前であることを前提とします。後で、この構成を使用して頂点表からRDDを取得します。

Configuration hBaseConfVertices = HBaseConfiguration.create();
hBaseConfVertices.set(TableInputFormat.INPUT_TABLE, "socialNetVT.")
hBaseConfVertices.set("hbase.zookeeper.quorum", "node041,node042,node043")
hBaseConfVertices.set("hbase.zookeeper.port", "2181")

JavaPairRDD<ImmutableBytesWritable,Result> bytesResultVertices =
sc.newAPIHadoopRDD(hBaseConfVertices,
TableInputFormat.class,
ImmutableBytesWritable.class,
Result.class)

同様に、次の例では、Apache HBaseに格納されているエッジ表に接続し、表の行のRDDを取得するための構成オブジェクトを作成します。socialNetGE.は、エッジ定義が含まれる表の名前です。

Configuration hBaseConfEdges = HBaseConfiguration.create();
hBaseConfEdges.set(TableInputFormat.INPUT_TABLE, "socialNetGE.")
hBaseConfEdges.set("hbase.zookeeper.quorum", "node041,node042,node043")
hBaseConfEdges.set("hbase.zookeeper.port", "2181")

JavaPairRDD<ImmutableBytesWritable,Result> bytesResultEdges =
sc.newAPIHadoopRDD(hbaseConfEdges,
TableInputFormat.class,
ImmutableBytesWritable.class,
Result.class)

各結果オブジェクトにはグラフのエッジの各ノードの属性が含まれるため、その情報を抽出するためにこれらのRDDに変換を適用する必要があります。oracle.pg.hbase.SparkUtilsは、このような変換を定義する上で役に立つ複数のメソッドを実装します。

たとえば、結果オブジェクトから各頂点属性値を抽出し、頂点のIDおよび名前を格納するJava BeanクラスであるMyVertexのオブジェクト・インスタンスを作成する変換を定義できます。次の例では、頂点を表す特定の結果オブジェクトから識別子および名前キー/値ペアを抽出するためにSparkUtilsを使用するメソッドres2vertexを定義します。

public static MyVertex res2vertex(Result res) throws Exception
{
SparkUtils su = SparkUtils.getInstance();
Object dbRepr = su.getGraphElementReprOnDB(res);
long id = su.getElementId(dbRepr);
String name = (String)su.getPropertyValue(dbRepr, "name");
return new MyVertex(id,name);
}

メソッドgetGraphElemetReprOnDBは、Apache HBaseに格納されているグラフ要素表現を返し、パラメータがnullまたは対応するクラスの非インスタンスである場合はIllegalArgumentException例外をスローします。この表現はデータベース固有(Apache HBaseでのみ使用可能)であり、戻り値はインタフェースに定義されている他のAPIのみによって使用される必要があります。Apache HBaseの場合、dbReprはResultクラスのnull以外のインスタンスです。データベース表現オブジェクトが生成されたら、これを、インタフェースに定義されている他の任意のメソッドのパラメータとして渡すことができます。

メソッドgetElementIdは頂点のIDを返し、メソッドgetPropertyValueはオブジェクトdbReprから属性値nameを取得します。不適切なパラメータが渡された場合、例外IOExceptionおよびjava.text.ParseExceptionがスローされます。

次の例では、エッジを表す特定の結果オブジェクトから識別子、ラベルおよび入力/出力頂点を抽出するためにSparkUtilsを使用するメソッドres2edgeを定義します。

public static MyEdge res2Edge( Result res) throws Exception
{
SparkUtils su = SparkUtils.getInstance();
Object dbRepr = su.getGraphElementReprOnDB(res);
long rowId    = su.getElementId(dbRepr);
String label  = (String)su.getEdgeLabel(dbRepr);
long inVertex = (long)su.getInVertexId(dbRepr);
long outVertex = (long)su.getOutVertexId(dbRepr);
return new MyEdge(rowId,inVertex,outVertex,label);
}

これらの変換が生成されたら、これらをbytesResultVerticesおよびbytesResultEdgesの値セットにマップできます。次に例を示します。

JavaRDD<Result> resultVerticesRDD = bytesResult.values();
JavaRDD<Vertex> nodesRDD = resultVerticesRDD.map(result ->  MyConverters.res2vertex(result));
JavaRDD<Result> resultEdgesRDD = bytesResultEdges.values();
JavaRDD<Edge> edgesRDD = resultEdgesRDD.map(result -> MyConverters.res2Edge(result));

これにより、Sparkアプリケーションで、nodesRDDおよびedgesRDDの操作を開始できます。たとえば、Spark SQL問合せを実行するために対応するデータ・フレームを作成できます。次の例では、SQLコンテキストを作成し、nodesRDDおよびedgesRDDから2つのデータ・フレームを取得し、ID 1を持つ頂点のすべての友人を取得する問合せを実行します。

SQLContext sqlCtx = new SQLContext(sc);
DataFrame verticesDF = sqlCtx.createDataFrame(verticesRDD);
verticesDF.registerTempTable("VERTICES_TABLE");

DataFrame edgesDF = sqlCtx.createDataFrame(edgesRDD);
edgesDF.registerTempTable("EDGES_TABLE");

sqlCtx.sql("select name from (select target from EDGES_TABLE WHERE source = 1) REACHABLE
left join VERTICES_TABLE on VERTICES_TABLE.id = REACHABLE.target ").show();

この場合、SparkではクラスMyVertexおよびMyEdgeを使用してデータ・フレームの列名を探すために、これらのクラスが重要な役割を果たします。

Apache HBaseからグラフ・データを直接読み込んだり、Apache Spark内のグラフに対して操作を実行したりする以外にも、「インメモリー・アナリストを使用したApache Spark内のグラフ・データの分析」で説明されているように、インメモリー・アナリストを使用してApache Spark内のグラフ・データを分析できます。

5.7.2 Oracle NoSQL Databaseに格納されているプロパティ・グラフ・データとApache Sparkとの統合

oracle.pg.nosql.SparkUtilsクラスには、Oracle NoSQL Databaseに格納されている<graph_name>VT_ (または<graph_name>GE_)表内の行として表現される頂点(またはエッジ)に関する情報を収集するメソッドが含まれます。Oracle NoSQL Databaseでは、表をスキャンする場合、表内の各行には対応するoracle.kv.table.Rowオブジェクトがあります。

SparkUtilsを使用してApache Sparkジョブをプロパティ・グラフに対して実行するには、最初にグラフ・データをApache Spark RDDオブジェクトにロードする必要があります。これを行うには、sc (アプリケーションのSparkコンテキスト)を作成する必要があります。次の例は、Sparkコンテキスト・オブジェクトを作成する方法を示します。

import java.io.*;
import org.apache.spark.SparkContext.*;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.DataFrame;
import oracle.kv.hadoop.table.TableInputFormat;
import oracle.kv.table.PrimaryKey;
import oracle.kv.table.Row;
import org.apache.hadoop.conf.Configuration;

SparkConf sparkConf = new SparkConf().setAppName("Testing SparkUtils").setMaster(“local”);

JavaSparkContext sc = new JavaSparkContext(sparkConf);

このコンテキストを使用して、newAPIHadoopRDDメソッドを呼び出すことにより、HadoopファイルからRDDを簡単に取得できます。RDDを作成するには、Oracle NoSQL Databaseに格納されている頂点およびエッジ表にアクセスするためのHadoop構成オブジェクトを最初に作成する必要があります。この構成オブジェクトは、newAPIHadoopRDDとともにInputFormatおよびそのキーと値のクラスによって使用されます。このメソッドの結果は、RDD[(PrimaryKey, Row)]型のRDDになります。

次の例では、Oracle NoSQL Databaseに接続し、グラフの頂点表を読み込むための構成オブジェクトを作成します。socialNetVT_が、グラフの頂点情報が含まれる表の名前であることを前提とします。後で、この構成を使用して頂点表からRDDを取得します。

Configuration noSQLNodeConf = new Configuration();
noSQLNodeConf.set("oracle.kv.kvstore", "kvstore");
noSQLNodeConf.set("oracle.kv.tableName", “socialNetVT_”);
noSQLNodeConf.set("oracle.kv.hosts", "localhost:5000");

同様に、次の例では、Oracle NoSQL Databaseに格納されているエッジ表に接続し、表の行のRDDを取得するための構成オブジェクトを作成します。socialNetGE_は、エッジ・データが含まれる表の名前です。

Configuration noSQLEdgeConf = new Configuration();
noSQLEdgeConf.set("oracle.kv.kvstore", "kvstore");
noSQLEdgeConf.set("oracle.kv.tableName", “socialNetGE_”);
noSQLEdgeConf.set("oracle.kv.hosts", "localhost:5000");

JavaPairRDD<PrimaryKey,Row> bytesResultVertices = sc.newAPIHadoopRDD(noSQLNodeConf,
oracle.kv.hadoop.table.TableInputFormat.class,PrimaryKey.class, Row.class);

JavaPairRDD<PrimaryKey,Row> bytesResultEdges = sc.newAPIHadoopRDD(noSQLEdgeConf,
oracle.kv.hadoop.table.TableInputFormat.class,
PrimaryKey.class, Row.class);

行オブジェクトにはグラフの頂点またはエッジの1つ以上の属性が含まれる場合があるため、関連情報を取得するためにこれらのRDDに変換を適用する必要があります。oracle.pg.nosql.SparkUtilsは、このような変換を定義する上で役に立つ複数のメソッドを実装します。

たとえば、結果オブジェクトから頂点プロパティ値を抽出し、頂点のIDおよび名前を格納するJava BeanクラスであるMyVertexのオブジェクト・インスタンスを作成する変換を定義できます。次の例では、頂点を表す特定の行オブジェクトから識別子および名前キー/値ペアを抽出するためにSparkUtilsを使用するメソッドres2vertexを定義します。

public static MyVertex res2vertex(Row res) throws Exception
{
SparkUtils su = SparkUtils.getInstance();
Object dbRepr = su.getGraphElementReprOnDB(res);
long id = su.getElementId(dbRepr);
String name = (String)su.getPropertyValue(dbRepr, "name");
return new MyVertex(id,name);
}

メソッドgetGraphElemetReprOnDBは、Oracle NoSQL Databaseに格納されているグラフ要素表現を返し、パラメータがnullまたは対応するクラスの非インスタンスである場合はIllegalArgumentException例外をスローします。この表現はデータベース固有であり、戻り値はインタフェースに定義されている他のAPIのみによって使用される必要があります。Oracle NoSQL Databaseの場合、dbReprはRowクラスのnull以外のインスタンスです。データベース表現オブジェクトが生成されたら、これを、インタフェースに定義されている他の任意のメソッドのパラメータとして渡すことができます。

メソッドgetElementIdは頂点のIDを返し、メソッドgetPropertyValueはオブジェクトdbReprから属性値“name”を取得します。不適切なパラメータが渡された場合、例外IOExceptionおよびjava.text.ParseExceptionがスローされます。

同様に、ID、ラベルおよび入力/出力頂点ID値を格納するJava Beanクラスを使用して、行オブジェクトからMyEdgeのオブジェクト・インスタンスを作成するための変換を定義できます。次の例では、エッジを表す特定の行オブジェクトから識別子、ラベルおよび入力/出力頂点IDを抽出するためにSparkUtilsを使用するメソッドres2edgeを定義します。

public static MyEdge res2Edge( Row res) throws Exception
{
SparkUtils su = SparkUtils.getInstance();
Object dbRepr = su.getGraphElementReprOnDB(res);
long rowId    = su.getElementId(dbRepr);
String label  = (String)su.getEdgeLabel(dbRepr);
long inVertex = (long)su.getInVertexId(dbRepr);
long outVertex = (long)su.getOutVertexId(dbRepr);
return new MyEdge(rowId,inVertex,outVertex,label);
}

これらの変換が生成されたら、これらをbytesResultVerticesおよびbytesResultEdgesの値セットにマップできます。

JavaRDD<Row> resultVerticesRDD = bytesResult.values();
JavaRDD<Vertex> nodesRDD = resultVerticesRDD.map(result ->  MyConverters.res2vertex(result));
JavaRDD<Row> resultEdgesRDD = bytesResultEdges.values();
JavaRDD<Edge> edgesRDD = resultEdgesRDD.map(result -> MyConverters.res2Edge(result));

前の手順の後、nodesRDDおよびedgesRDDの操作を開始できます。たとえば、Spark SQL問合せを実行するために対応するデータ・フレームを作成できます。次の例では、SQLコンテキストを作成し、nodesRDDおよびedgesRDDから2つのデータ・フレームを取得し、ID 1を持つ頂点のすべての友人を取得する問合せを実行します。

SQLContext sqlCtx = new SQLContext(sc);
DataFrame verticesDF = sqlCtx.createDataFrame(verticesRDD);
verticesDF.registerTempTable("VERTICES_TABLE");

DataFrame edgesDF = sqlCtx.createDataFrame(edgesRDD);
edgesDF.registerTempTable("EDGES_TABLE");

sqlCtx.sql("select name from (select target from EDGES_TABLE WHERE source = 1) REACHABLE
left join VERTICES_TABLE on VERTICES_TABLE.id = REACHABLE.target ").show();

この場合、SparkではクラスMyVertexおよびMyEdgeを使用してデータ・フレームの列名を確認するために、これらのクラスが重要な役割を果たします。

Oracle NoSQL Databaseからグラフ・データを直接読み込んだり、Apache Spark内のグラフに対して操作を実行したりする以外にも、「インメモリー・アナリストを使用したApache Spark内のグラフ・データの分析」で説明されているように、インメモリー・アナリストを使用してApache Spark内のグラフ・データを分析できます。

5.8 セキュアなOracle NoSQL Databaseのサポート

Oracle Big Data Spatial and Graphプロパティ・グラフ・サポートは、Oracle NoSQL Databaseのセキュア・インストールと非セキュア・インストールの両方で機能します。このトピックでは、セキュアなOracle NoSQL Database設定でプロパティ・グラフ機能を使用する方法についての情報を提供します。

ここでは、セキュアなOracle NoSQL Databaseがすでにインストールされていると想定します(http://docs.oracle.com/cd/NOSQL/html/SecurityGuide/secure_installation.htmlにある『Oracle NoSQL Databaseセキュリティ・ガイド』の「Oracle NoSQL Databaseのセキュア・インストールの実行」で説明されているプロセス)。

セキュア・データベースにアクセスするには、正しい資格情報を持っている必要があります。次のようなユーザーを作成します。

kv-> plan create-user -name myusername -admin -wait

このユーザーにreadwriteおよびdbaadminロールを付与します。次に例を示します。

kv-> plan grant -user myusername -role readwrite -wait
kv-> plan grant -user myusername -role dbadmin -wait

client.securityファイルからlogin_properties.txtを生成する際、ユーザー名が正しいことを確認します。次に例を示します。

oracle.kv.auth.username=myusername

Oracleプロパティ・グラフのクライアント側で、セキュアなOracle NoSQL Databaseと対話するためのセキュリティ関連ファイルおよびライブラリを持っている必要があります。最初に、次のファイル(ディレクトリ)をKVROOT/security/からクライアント側にコピーします。

client.security
client.trust
login.wallet/
login_properties.txt

セキュア・データベースへのアクセスに必要なパスワードを保持するためにOracle Walletを使用する場合、次の3つのライブラリをクライアント側にコピーして、クラス・パスを正しく設定します。

oraclepki.jar
osdt_cert.jar
osdt_core.jar

データベースとOracleプロパティ・グラフのクライアント側を正しく構成した後、次の2つのアプローチのいずれかを使用して、セキュアなNoSQL Databaseに格納されているグラフに接続できます。

- Java VM設定を次の形式で使用して、ログイン・プロパティ・ファイルを指定します。

-Doracle.kv.security=/<your-path>/login_properties.txt

このJava VMプロパティは、J2EEコンテナにデプロイされたアプリケーション(インメモリー分析を含む)にも設定できます。たとえば、WebLogicサーバーを起動する前に、次の形式で環境変数を設定してログイン・プロパティ構成ファイルを参照できます。

setenv JAVA_OPTIONS "-Doracle.kv.security=/<your-path>/login_properties.txt"

次に、通常どおりにOraclePropertyGraph.getInstance(kconfig, szGraphName)を呼び出してOraclePropertyGraphインスタンスを作成します。

- OraclePropertyGraph.getInstance(kconfig, szGraphName, username, password, truStoreFile)を呼び出し、usernameおよびpasswordにはセキュアなOracle NoSQL Databaseにアクセスするための正しい資格情報、truStoreFileにはクライアント側トラスト・ストア・ファイルclient.trustへのパスを指定します。
次のコード・フラグメントは、セキュアなOracle NoSQL Databaseにプロパティ・グラフを作成し、データをロードしてから、グラフ内の頂点およびエッジの数をカウントします。

// This object will handle operations over the property graph
OraclePropertyGraph opg = OraclePropertyGraph.getInstance(kconfig,
szGraphName,
username,
password,
truStoreFile);

// Clear existing vertices/edges in the property graph
opg.clearRepository();
opg.setQueueSize(100); // 100 elements

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";
// This object will handle parallel data loading over the property graph
System.out.println("Load data for graph " + szGraphName);
OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);
// Count all vertices
long countV = 0;
Iterator<Vertex> vertices = opg.getVertices().iterator();
while (vertices.hasNext()) {
vertices.next();
countV++;
}

System.out.println("Vertices found: " + countV);
// Count all edges
long countE = 0;
Iterator<Edge> edges = opg.getEdges().iterator();
while (edges.hasNext()) {
edges.next();
countE++;
}

System.out.println("Edges found: " + countE);

5.9 Apache HBaseに格納されているグラフでのセキュリティの実装

Oracle Big Data Spatial and Graphのプロパティ・グラフを保護するために、Apache HBaseでKerberos認証を使用することが推奨されます。

Oracleのプロパティ・グラフ・サポートは、Cloudera Hadoop (CDH)クラスタのセキュア・インストールと非セキュア・インストールの両方で機能します。このトピックでは、セキュアなApache HBaseインストールについての情報を提供します。

Oracle Big Data Spatial and Graphのプロパティ・グラフを保護するために、Apache HBaseでKerberos認証を使用することが推奨されます。

このトピックでは、Kerberosを使用してセキュアなApache HBaseが構成されており、クライアント・マシンにKerberosライブラリがインストールされ、正しい資格情報を持っていると想定します。詳細は、http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_sg_hbase_authentication.htmlの『Configuring Kerberos Authentication for HBase』を参照してください。Kerberosクラスタおよびクライアントの設定方法の情報は、 http://web.mit.edu/kerberos/krb5-latest/doc/index.htmlの『MIT Kerberos Documentation』を参照してください。

クライアント側で、対応HDFSデーモンと対話するために、Kerberos資格情報を持っている必要があります。さらに、(krb5.confにある)Kerberos構成情報を変更して、レルムおよびホスト名マッピングをセキュアなCDHクラスタで使用されるKerberosレルムに含める必要があります。

次のコード・フラグメントは、BDA.COM上のセキュアなCDHクラスタで使用されるレルムとホスト名マッピングを示しています。

[libdefaults]
default_realm = EXAMPLE.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = yes

[realms]
EXAMPLE.COM = {
kdc = hostname1.example.com:88
kdc = hostname2.example.com:88
admin_server = hostname1.example.com:749
default_domain = example.com
}
BDA.COM = {
kdc = hostname1.bda.com:88
kdc = hostname2.bda.com:88
admin_server = hostname1.bda.com:749
default_domain = bda.com
}

[domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM
.bda.com = BDA.COM
bda.com = BDA.COM

krb5.confを変更した後、Java Authentication and Authorization Service (JAAS)構成ファイルを使用して資格情報をアプリケーションに提供することにより、Apache HBaseに格納されているグラフに接続できます。これは、非セキュアなApache HBaseインストールを使用するアプリケーションがすでに存在する場合に、コードをまったく変更することなく前述の例と同じ機能を提供します。

JAAS構成が設定されたHBaseでプロパティ・グラフ・サポートを使用するには、次の形式の内容を含むファイルを作成し、keytabおよびprincipalエントリを独自の情報に置き換えます。

Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
useTicketCache=true
keyTab="/path/to/your/keytab/user.keytab"
principal="your-user/your.fully.qualified.domain.name@YOUR.REALM";
};

次のコード・フラグメントは、BDA.COM上のセキュアなCDHクラスタで使用されるレルムを含むJAASファイルの例を示しています。

Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
useTicketCache=true
keyTab="/path/to/keytab/user.keytab"
principal="hbaseuser/hostname1@BDA.COM";
};

セキュアなHBaseアプリケーションを実行するには、java.security.auth.login.configフラグを使用して、作成したJAAS構成ファイルを指定する必要があります。次の形式のコマンドを使用して、アプリケーションを実行できます。

java -Djava.security.auth.login.config=/path/to/your/jaas.conf/ -classpath ./classes/:../../lib/'*' YourJavaApplication

その後、通常どおりにOraclePropertyGraph.getInstance(conf, hconn, szGraphName)を呼び出してOracleプロパティ・グラフを作成できます。

Oracle Big Data Spatial and Graphプロパティ・グラフ・サポートをセキュアなApache HBaseインストールで使用するための別の方法は、セキュアなHBase構成を使用することです。次のコード・フラグメントは、prepareSecureConfig()を使用してセキュアなHBase構成を取得する方法を示しています。このAPIは、Apache HadoopおよびApache HBaseで使用されるセキュリティ認証設定、および認可されたチケットを認証および取得するためのKerberos資格情報セットを必要とします。

次のコード・フラグメントは、セキュアなApache HBaseにプロパティ・グラフを作成し、データをロードしてから、グラフ内の頂点およびエッジの数をカウントします。

String szQuorum= "hostname1,hostname2,hostname3";
String szCliPort = "2181";
String szGraph = "SecureGraph";

String hbaseSecAuth="kerberos";
String hadoopSecAuth="kerberos";
String hmKerberosPrincipal="hbase/_HOST@BDA.COM";
String rsKerberosPrincipal="hbase/_HOST@BDA.COM";
String userPrincipal = "hbase/hostname1@BDA.COM";
String keytab= "/path/to/your/keytab/hbase.keytab";
int dop= 8;

Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", szQuorum);
conf.set("hbase.zookeeper.property.clientPort", szCliPort);

// Prepare the secure configuration providing the credentials in the keytab
conf = OraclePropertyGraph.prepareSecureConfig(conf,
hbaseSecAuth,
hadoopSecAuth,
hmKerberosPrincipal,
rsKerberosPrincipal,
userPrincipal,
keytab);
HConnection hconn = HConnectionManager.createConnection(conf);

OraclePropertyGraph opg=OraclePropertyGraph.getInstance(conf, hconn, szGraph);
opg.setInitialNumRegions(24);
opg.clearRepository();

String szOPVFile = "../../data/connections.opv";
String szOPEFile = "../../data/connections.ope";

// Do a parallel data loading
OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(opg, szOPVFile, szOPEFile, dop);
opg.commit();

5.10 プロパティ・グラフ・データでのGroovyシェルの使用

Oracle Big Data Spatial and Graphプロパティ・グラフ・サポートには、組込みのGroovyシェル(オリジナルのGremlin Groovyシェル・スクリプトに基づく)が含まれています。このコマンドライン・シェル・インタフェースを使用して、Java APIを参照できます。

Groovyシェルを起動するには、インストール・ホーム(デフォルトでは/opt/oracle/oracle-spatial-graph/property_graph)の下にあるdal/groovyディレクトリに移動します。次に例を示します。

cd /opt/oracle/oracle-spatial-graph/property_graph/dal/groovy/

ここには、Oracle NoSQL DatabaseとApache HBaseにそれぞれ接続するためのスクリプトgremlin-opg-nosql.shおよびgremlin-opg-hbase.shが含まれています。

注意:
gremlinトラバースの例を実行するには、最初に次のインポート操作を実行する必要があります。

import com.tinkerpop.pipes.util.structures.*;

次の例は、Oracle NoSQL Databaseに接続し、グラフ名myGraphを持つOraclePropertyGraphのインスタンスを取得し、いくつかのサンプル・グラフ・データをロードして、頂点およびエッジのリストを取得します。

$ ./gremlin-opg-nosql.sh

opg-nosql>
opg-nosql> hhosts = new String[1];
==>null

opg-nosql> hhosts[0] = "bigdatalite:5000";
==>bigdatalite:5000

opg-nosql> cfg = GraphConfigBuilder.forPropertyGraphNosql().setName("myGraph").setHosts(Arrays.asList(hhosts)).setStoreName("mystore").addEdgeProperty("lbl", PropertyType.STRING, "lbl").addEdgeProperty("weight", PropertyType.DOUBLE, "1000000").build();
==>{"db_engine":"NOSQL","loading":{},"format":"pg","name":"myGraph","error_handling":{},"hosts":["bigdatalite:5000"],"node_props":[],"store_name":"mystore","edge_props":[{"type":"string","name":"lbl","default":"lbl"},{"type":"double","name":"weight","default":"1000000"}]}

opg-nosql> opg = OraclePropertyGraph.getInstance(cfg);
==>oraclepropertygraph with name myGraph

opg-nosql> opgdl = OraclePropertyGraphDataLoader.getInstance();
==>oracle.pg.nosql.OraclePropertyGraphDataLoader@576f1cad

opg-nosql> opgdl.loadData(opg, new FileInputStream("../../data/connections.opv"), new FileInputStream("../../data/connections.ope"), 1, 1, 0, null);
==>null

opg-nosql> opg.getVertices();
==>Vertex ID 5 {country:str:Italy, name:str:Pope Francis, occupation:str:pope, religion:str:Catholicism, role:str:Catholic religion authority}
[... other output lines omitted for brevity ...]

opg-nosql>  opg.getEdges();
==>Edge ID 1139 from Vertex ID 64 {country:str:United States, name:str:Jeff Bezos, occupation:str:business man} =[leads]=> Vertex ID 37 {country:str:United States, name:str:Amazon, type:str:online retailing} edgeKV[{weight:flo:1.0}]
[... other output lines omitted for brevity ...]

次の例は、インメモリー分析用のいくつかの構成パラメータをカスタマイズします。ここでは、Apache HBaseに接続し、グラフ名myGraphを持つOraclePropertyGraphのインスタンスを取得し、いくつかのサンプル・グラフ・データをロードし、頂点およびエッジのリストを取得し、インメモリー・アナリストを取得して、組込み分析の1つであるトライアングル・カウンティングを実行します。

$ ./gremlin-opg-hbase.sh
opg-hbase>
opg-hbase> dop=2;   // degree of parallelism
==>2
opg-hbase> confPgx = new HashMap<PgxConfig.Field, Object>();
opg-hbase> confPgx.put(PgxConfig.Field.ENABLE_GM_COMPILER, false);
==>null
opg-hbase> confPgx.put(PgxConfig.Field.NUM_WORKERS_IO, dop + 2);
==>null
opg-hbase> confPgx.put(PgxConfig.Field.NUM_WORKERS_ANALYSIS, 3);
==>null
opg-hbase> confPgx.put(PgxConfig.Field.NUM_WORKERS_FAST_TRACK_ANALYSIS, 2);
==>null
opg-hbase> confPgx.put(PgxConfig.Field.SESSION_TASK_TIMEOUT_SECS, 0);
==>null
opg-hbase> confPgx.put(PgxConfig.Field.SESSION_IDLE_TIMEOUT_SECS, 0);
==>null
opg-hbase> instance = Pgx.getInstance()
==>null
opg-hbase> instance.startEngine(confPgx)
==>null

opg-hbase> cfg = GraphConfigBuilder.forPropertyGraphHbase() .setName("myGraph") .setZkQuorum("bigdatalite") .setZkClientPort(iClientPort) .setZkSessionTimeout(60000) .setMaxNumConnections(dop) .setLoadEdgeLabel(true) .setSplitsPerRegion(1) .addEdgeProperty("lbl", PropertyType.STRING, "lbl") .addEdgeProperty("weight", PropertyType.DOUBLE, "1000000") .build();
==>{"splits_per_region":1,"max_num_connections":2,"node_props":[],"format":"pg","load_edge_label":true,"name":"myGraph","zk_client_port":2181,"zk_quorum":"bigdatalite","edge_props":[{"type":"string","default":"lbl","name":"lbl"},{"type":"double","default":"1000000","name":"weight"}],"loading":{},"error_handling":{},"zk_session_timeout":60000,"db_engine":"HBASE"}

opg-hbase> opg = OraclePropertyGraph.getInstance(cfg);
==>oraclepropertygraph with name myGraph

opg-hbase> opgdl = OraclePropertyGraphDataLoader.getInstance();
==>oracle.pg.hbase.OraclePropertyGraphDataLoader@3451289b

opg-hbase> opgdl.loadData(opg, "../../data/connections.opv", "../../data/connections.ope", 1, 1, 0, null);
==>null

opg-hbase> opg.getVertices();
==>Vertex ID 78 {country:str:United States, name:str:Hosain Rahman, occupation:str:CEO of Jawbone}
...

opg-hbase> opg.getEdges();
==>Edge ID 1139 from Vertex ID 64 {country:str:United States, name:str:Jeff Bezos, occupation:str:business man} =[leads]=> Vertex ID 37 {country:str:United States, name:str:Amazon, type:str:online retailing} edgeKV[{weight:flo:1.0}]
[... other output lines omitted for brevity ...]

opg-hbase> session = Pgx.createSession("session-id-1");
opg-hbase> g = session.readGraphWithProperties(cfg);
opg-hbase> analyst = session.createAnalyst();

opg-hbase>  triangles = analyst.countTriangles(false).get();
==>22

Java APIの詳細は、インストール・ホーム(デフォルトでは/opt/oracle/oracle-spatial-graph/property_graph/)の下のdoc/dal/およびdoc/pgx/にあるJavadocリファレンス情報を参照してください。

5.11 プロパティ・グラフ・データのRESTサポート

一連のRESTful APIによって、HTTP/RESTプロトコルを介してデータ・アクセス・レイヤーJava APIが公開されます。

これらのRESTful APIは、プロパティ・グラフの作成、更新、問合せおよびトラバースをサポートし、さらに、テキスト検索問合せの実行、gremlinを使用したグラフのトラバース問合せの実行、およびOracle NoSQL DatabaseやApache HBaseなどの複数のデータベース・バックエンドからのグラフの処理をサポートしています。

次のトピックでは、データ・アクセス・レイヤー(DAL)に含まれるREST APIを使用して、Oracle Big Data Spatial and Graphプロパティ・グラフ・サポートのためにRESTful Webサービスを作成する方法について説明します。このサービスを後でApache TomcatまたはOracle WebLogic Server (12cリリース2以上)にデプロイできます。

- REST Webアプリケーション・アーカイブ(WAR)ファイルの構築

- RESTfulプロパティ・グラフWebサービスのデプロイ

- プロパティ・グラフREST API操作の情報

5.11.1 REST Webアプリケーション・アーカイブ(WAR)ファイルの構築

このトピックでは、Oracle Big Data Spatial and Graphでプロパティ・グラフのRESTful APIを使用するために、Webアプリケーション・アーカイブ(WAR)ファイルを作成する方法について説明します。

1. 製品のホーム・ディレクトリの下にあるwebappディレクトリに移動します。

cd /opt/oracle/oracle-spatial-graph/property-graph/dal/webapp

2. 使用可能なMavenリポジトリからサード・パーティのライブラリをダウンロードできるように、HTTP_PROXY環境変数を設定します(必要な場合)。次に例を示します。

setenv HTTP_PROXY www-myproxy.com:80
export HTTP_PROXY=www-myproxy.com:80

3. スクリプトfetch_required_libraries.shを実行して、RESTful APIに必要なサード・パーティのライブラリをダウンロードします。

4. サード・パーティのライブラリを格納するディレクトリを指定します。ディレクトリが存在しない場合は、自動的に作成されます。次に例を示します。

Please enter the directory name where the REST third party libraries will be stored (e.g. /tmp/extlib-unified-rest ): /tmp/extlib-unified-rest

ディレクトリの作成時および各サード・パーティ・ライブラリのダウンロード時に、スクリプトによって一連の進捗状況の詳細がリストされます。スクリプトの最後に、次のようなメッセージが表示されます。

Done. The final downloaded jars are in the following directory:
-rw-r--r--   1 user group  305001 Aug 21  2007 commons-httpclient-3.1.jar
-rw-r--r--   1 user group   46509 Mar 20  2013 gremlin-java-2.3.0.jar
-rw-r--r--   1 user group   30226 Oct 13  2016 jackson-jaxrs-base-2.8.4.jar
-rw-r--r--   1 user group   15807 Oct 13  2016 jackson-jaxrs-json-provider-2.8.4.jar
-rw-r--r--   1 user group   34589 Oct 13  2016 jackson-module-jaxb-annotations-2.8.4.jar
-rw-r--r--   1 user group   69940 Jan 19  2017 jersey-entity-filtering-2.25.1.jar
-rw-r--r--   1 user group   21691 Jan 19  2017 jersey-media-json-jackson-2.25.1.jar
-rw-r--r--   1 user group   67859 Jan 19  2017 jersey-media-multipart-2.25.1.jar
-rw-r--r--   1 user group   63977 Jul 17  2015 mimepull-1.9.6.jar
-rw-r--r--   1 user group   41473 Mar 20  2013 rexster-core-2.3.0.jar
-rw-r--r--   1 user group   81352 Mar 20  2013 rexster-protocol-2.3.0.jar
-rw-r--r--   1 user group  712325 Mar 20  2013 rexster-server-2.3.0.jar

5. スクリプトassemble_unified_rest.shを実行して、RESTFul Webアプリケーション・アーカイブを作成します。

sh assemble_unified_rest.sh

6. opg_unified.warの構築に使用する一時ディレクトリを指定します。次に例を示します。

Please enter a temporary work directory name (e.g. /tmp/work_unified): /tmp/work_unified

スクリプトは、RESTful Webアプリケーション・アーカイブの構築に必要なすべての中間ファイルを保持するために、このディレクトリを使用して、システムの現在の日付(MMDDhhmmss)を使用する一時作業ディレクトリを作成します。これらには、RESTful API、サード・パーティのライブラリ、およびREST構成が含まれます。ディレクトリを作成してこれらの中間ファイルの保持に使用できることを確認する必要があります。

Is it OK to use /tmp/work_unified/0823150126 to hold some intermediate files? (Yes|No): Yes

7. 製品のホーム・ディレクトリを指定します。次に例を示します。

Move on...
Please enter the directory name to property graph directory (e.g. /opt/oracle/oracle-spatial-graph/property_graph): /opt/oracle/oracle-spatial-graph/property_graph

opt/oracle/oracle-spatial-graph/property_graph seems to be valid

8. RESTfulサード・パーティ・ライブラリを保持しているディレクトリを指定します。

これは、前に指定したディレクトリです。例: /tmp/extlib-unified-rest

必要なディレクトリを設定した後、スクリプトによってREST APIが更新され、Jerseyを使用してREST Webアプリケーション・アーカイブが構成されます。プロセスの最後に、生成されたwarファイルの最終的なサイズおよび場所を示すメッセージが出力されます。次に例を示します。

assed sanity checking.
Updating rest logic
Updating the web application
Done. The final web application is
-rw-r--r-- 1 user group 108219486 Aug 24 08:59 /tmp/work_unified/0823150126/opg_unified.war

この手順を実行すると、作成されたタイムスタンプベースの一時ディレクトリ名(この例では0823150126/)が異なるものになることに注意してください。

5.11.2 RESTfulプロパティ・グラフWebサービスのデプロイ

このトピックでは、opg_unified.warファイルをOracle WebLogic 12.2.0.1またはApache Server Apache Tomcatにデプロイする方法について説明します。

1. 「REST Webアプリケーション・アーカイブ(WAR)ファイルの構築」で説明されているように、RESTサード・パーティ・ライブラリをダウンロードし、opg_unified.war REST Webアプリケーション・アーカイブ(WAR)ファイルを作成したことを確認します。

2. 次のコマンドを使用して、opg_unified.warにあるrexster.xmlファイルを抽出します。

cd /tmp/work_unified/<MMDDhhmmss>/
jar xf opg_unified.war WEB-INF/classes/rexster.xml

3. REST構成ファイル(rexster.xml)を変更して、デフォルトのバックエンド、バックエンドの追加リスト(存在する場合)、およびプロパティ・グラフ要求を処理するときに使用される使用可能なグラフのリストを指定します。このファイルの詳細は、RESTfulプロパティ・グラフ・サービス構成ファイル(rexster.xml)を参照してください。

4. 次のようにrexster.xmlファイルを更新して、opg_unified.warを再構築します。

jar uf opg_unified.war WEB-INF/classes/rexster.xml

5. 選択したJ2EEコンテナにopg_unified.warをデプロイします。

デプロイメント・コンテナのオプション:

- Apache Tomcatを使用したデプロイメント

- Oracle WebLogic Serverを使用したデプロイメント

Apache Tomcatを使用したデプロイメント

この項では、Apache Tomcat 8.5.14 (以上)を使用してRESTfulプロパティ・グラフWebサービスをデプロイする方法について説明します。Apache Tomcatは、Java ServletとJavaServer Pages (JSP)を実装するオープンソースのWebサーバーであり、Webアプリケーションを実行するHTTP Webサーバー環境を構築します。Apache Tomcatの詳細は、http://tomcat.apache.org/を参照してください。

1. Apache Tomcat 8.5.14をダウンロードしてインストールします。

2. 次のように、Apache Tomcat ServerのWebアプリケーション・ディレクトリに移動し、opg_unified.warファイルをコピーします。

cd $CATALINA_BASE
cp -f /tmp/work_unified/<MMDDhhmmss>/opg_unified.war webapps

この操作で、warファイルが展開されてWebアプリケーションがデプロイされます。(Apache TomcatにおけるWebアプリケーションのデプロイの詳細は、Apache Tomcatのドキュメントを参照してください。)

3. ブラウザで次のURLをオープンしてデプロイされたことを確認します(Webアプリケーションがポート8080にデプロイされることを前提としています): http://<hostname>:8080/opg_unified
「Welcome to the unified property graph REST interface!」というタイトルのページが表示されます

Oracle WebLogic Serverを使用したデプロイメント

この項では、Oracle WebLogic Server 12cバージョン12.2.1.2.0を使用してRESTfulプロパティ・グラフ・エンドポイントをデプロイする方法について説明します。Oracle WebLogic Serverの詳細は、その製品ドキュメントを参照してください。

1. Oracle WebLogic Server 12cリリース2 (12.2.1.2.0)をダウンロードしてインストールします。

2. Jersey 2.5.1 (JAX-RS 2.0. RI)の共有の事前構築済共有ライブラリを登録します(WebLogic Serverインストールに含まれている)。このライブラリは、Big Data Spatial and Graphプロパティ・グラフのRESTful Webサービスなど、Jersey 2.5.1に基づくアプリケーションの実行に必要です。

a. WebLogic Server管理コンソール(http://localhost:7001/console)にログインします。

b. 「Deployments」を選択します。

c. 「Install」をクリックして、共有ライブラリをインストールします。

d. 「Path」フィールドで、ディレクトリ: MW_HOME\wlserver\common\deployable-librariesを入力するか、このディレクトリまでナビゲートします。

e. jax-rs-2.0.warファイルを選択し、「Next」をクリックします。

f. 「Install this deployment as a library」を選択します。

g. 「Next」をクリックします。

h. 「Finish」をクリックします。

3. opg_unified.warを変更して、WebLogic Serverによってすでに提供されているサード・パーティ・ライブラリjerseyおよびhk2を削除します。

a. opg_unified.warが作成されたwork_unifiedディレクトリの下に一時作業ディレクトリを作成します。次に例を示します。

cd /tmp/work_unified/<MMDDhhmmss>/
mkdir work_weblogic
cd work_weblogic

b. opg_unified.warのコンテンツを一時ディレクトリに抽出します。次に例を示します。

jar xf ../opg_unified.war

c. Jersey 2.25サード・パーティ・ライブラリをWEB-INF/libディレクトリから削除します。

rm –rf WEB-INF/lib/jersey-client-2.25.1.jar
rm –rf WEB-INF/lib/jersey-common-2.25.1.jar
rm –rf WEB-INF/lib/jersey-container-servlet-core-2.25.1.jar
rm –rf WEB-INF/lib/jersey-entity-filtering-2.25.1.jar
rm –rf WEB-INF/lib/jersey-guava-2.25.1.jar
rm –rf WEB-INF/lib/jersey-server-2.25.1.jar
rm –rf WEB-INF/lib/hk2-api-2.5.0-b32.jar
rm –rf WEB-INF/lib/hk2-locator-2.5.0-b32.jar
rm –rf WEB-INF/lib/hk2-utils-2.5.0-b32.jar

d. opg_unified.warを再構築します。

jar cfM ../opg_unified.war *

4. WebLogic Serverインストールのautodeployディレクトリに移動し、ファイルをコピーします。次に例を示します。

cd <domain_name>/autodeploy
cp -rf /tmp/work_unified/<MMDDhhmmss>/opg_unified.war <domain_name>/autodeploy

上の例で、<domain_name>はWebLogic Serverのドメイン名です。

開発モードまたは本番モードでWebLogic Serverドメインを実行できますが、自動デプロイメント機能を使用できるのは開発モードのみであることに注意してください。

5. ブラウザで次のURLをオープンしてデプロイされたことを確認します(Webアプリケーションがポート7001にデプロイされることを前提としています): http://<hostname>:7001/opg_unified
「Welcome to the unified property graph REST interface!」というタイトルのページが表示されます

- RESTfulプロパティ・グラフ・サービス構成ファイル(rexster.xml)

5.11.2.1 RESTfulプロパティ・グラフ・サービス構成ファイル(rexster.xml)

Oracle Big Data Spatial and Graphは、Tinkerpop Rexster RESTful APIを拡張してプロパティ・グラフにRESTful機能を提供します。RESTfulサービスの構成を有効にするために、サービスの起動時に設定およびロードする必要があるデータベース・バックエンドおよびグラフの構成を含むrexster.xmlファイルが、opg_unified.warに含まれています。

rexster.xmlファイルは、少なくとも4つのメイン・セクション(またはタグ)を持つXMLベースの構成ファイルです。

- <script-engines>: プロパティ・グラフに対するスクリプトの実行に使用されるスクリプト・エンジン。デフォルトでは、gremlin-groovyが使用されます。

- <oracle-pool-size>: プロパティ・グラフに許可される同時接続の数。デフォルトでは、構成でプール・サイズ3が使用されます。

- <oracle-property-graph-backends>: RESTful APIが使用する必要があるデータベース・バックエンドに関する情報。デフォルトでは、すべてのRESTful APIサービスのデフォルト・データベース接続として使用するように、少なくとも1つのバックエンド構成を定義する必要があります。

- <graphs>: サービスの起動時に要求を処理するために使用可能なグラフのリスト。このリストに定義されたグラフは、関連付けられたデータベース構成に基づいて作成されます。

デフォルトでは、rexster.xmlによって、<oracle-property-graph-backends>セクションに少なくとも1つのバックエンド構成を定義する必要があります。各バックエンドは、backend-nameおよびbackend-type (apache_hbaseまたはoracle_nosqlのいずれか)によって識別されます。追加のデータベース・パラメータはバックエンドのプロパティとして指定する必要があります。Apache HBaseの場合、これらのプロパティにZookeeper定数およびZookeeperクライアント・ポートが含まれます。Oracle NoSQL Databaseの場合、これらのデータベース・パラメータにデータベース・ホストとポートおよびKVストア名が含まれます。

構成ファイルに、同じまたは異なるバックエンド・タイプに属する複数のバックエンド構成を含めることができます。

次のスニペットは、2つのバックエンド(最初の1つはApache HBaseデータベースに対するもので、2番目はOracle NoSQL Databaseに対するもの)を持つrexster.xmlの構成を示します。

<backend>
<backend-name>hbase_connection</backend-name>
<backend-type>apache_hbase</backend-type>
<default-backend>true</default-backend>
<properties>
<quorum>127.0.0.1</quorum>
<clientport>2181</clientport>
</properties>
</backend>

<backend>
<backend-name>nosql_connection</backend-name>
<backend-type>oracle_nosql</backend-type>
<properties>
<host>127.0.0.1</host>
<port>5000</port>
<storeName>kvstore</storeName>
</properties>
</backend>

デフォルトのバックエンドは、rexster.xmlファイルのグラフ・セクションで前に定義されていないグラフで実行されるすべてのプロパティ・グラフRESTful操作のデフォルトのデータベース構成として使用されるため、サービス用に設定される必要があります。前の例では、hbase_connectionsという名前のバックエンドがデフォルトのバックエンドとして設定されます。

<graphs> XML要素は、ユーザーの要求に使用可能なプロパティ・グラフのリストを識別します。各グラフは、graph-name およびgraph-type (oracle.pg.hbaseまたはoracle.pg.nosql.OraclePropertyGraphConfiguration)によって識別されます。追加のデータベース・パラメータは、グラフのタイプに基づくプロパティとして指定する必要があります。hbaseグラフの場合、これらのプロパティにZookeeper定数およびZookeeperクライアント・ポートが含まれます。nosqlグラフの場合、これらのデータベース・パラメータにデータベース・ホストとポートおよびKVストア名が含まれます。

さらに、extensionsサブセクションでtp:gremlin値を指定したallowタグを使用することによってgremlin問合せを実行する機能など、グラフで実行できる拡張機能があるかどうかを指定できます。

次のスニペットは、2つのプロパティ・グラフ(Apache HBaseデータベースを使用するconnectionsグラフおよびOracle NoSQL Databaseを使用するtestグラフ)を持つrexster.xmlの構成を示します。

<graphs>
<graph>
<graph-name>connections</graph-name>
<graph-type>oracle.pg.hbase.OraclePropertyGraphConfiguration</graph-type>
<properties>
<quorum>127.0.0.1</quorum>
<clientport>2181</clientport>
</properties>
<extensions>
<allows>
<allow>tp:gremlin</allow>
</allows>
</extensions>
</graph>
<graph>
<graph-name>connections</graph-name>
<graph-type>oracle.pg.nosql.OraclePropertyGraphConfiguration</graph-type>
<properties>
<storeName>kvstore</storeName>
<host>127.0.0.1</host>
<port>5000</port>
</properties>
<extensions>
<allows>
<allow>tp:gremlin</allow>
</allows>
</extensions>
</graph>
</graphs>

HTTPリクエスト(GET、POST、PUT、DELETE)操作が特定のグラフ名に対して実行されると、サービスはrexster.xml構成ファイルに定義されたグラフ・データベース構成を参照します。グラフが構成ファイルに含まれていない場合は、「graph cannot be found」というエラー・メッセージが表示されてリクエストは失敗し、操作は完了しません。

グラフの作成サービスでHTTP POSTリクエストを実行することによって、後続のHTTPリクエストで使用されるように新しいグラフを動的にサービスに追加できます。

5.11.3 プロパティ・グラフREST API操作の情報

このトピックでは、プロパティ・グラフREST APIの操作について説明します。

- GET操作(プロパティ・グラフ)

- POST操作(プロパティ・グラフ)

- PUT操作(プロパティ・グラフ)

- DELETE操作(プロパティ・グラフ)

5.11.3.1 GET操作(プロパティ・グラフ)

このトピックでは、プロパティ・グラフREST APIのGET操作について説明します。

注意:

プロパティ・グラフの索引の詳細は、プロパティ・グラフ・データの自動索引の使用およびプロパティ・グラフ・データの手動索引の使用の次の項目を参照してください。

- /graphs/{graphname}/indices

- /graphs/{graphname}/indices/{indexName}

- /graphs/{graphname}/indices/{indexName}/count

- /graphs/{graphname}/keyindices

- /graphs/{graphname}/keyindices/{class}

- /backends

- /backends/default

- /backends/{backendName}

- /graphs/{graphname}

- /graphs/{graphname}/edges

- /graphs/{graphname}/edges/{id}

- /graphs/{graphname}/vertices

- /graphs/{graphname}/vertices/{id}

- /graphs/{graphName}/vertices/{id}/{direction}

- /graphs/{graphname}/config

- /graphs/{graphname}/exportData

- /graphs/{graphname}/config

- /edges/{graphname}/textquery

- /edges/{graphname}/properties

- /vertices/{graphname}/textquery

/graphs/{graphname}/indices

説明: 指定されたグラフに作成されているすべての手動索引の名前およびクラスを取得します。

パラメータ

- graphname: プロパティ・グラフの名前。

使用上の注意

このGET操作は、OraclePropertyGraph.getIndices()メソッドの呼出しを実行します。

例

次のURLは、connectionsという名前のグラフのすべての手動索引を取得します。

http://localhost:7001/opg_unified/dal/graphs/connections/indices

結果は次のようになります。

{
results: [
name: "myIdx",
class: "vertex"
],
totalSize:1,
queryTime: 9.112078
}

/graphs/{graphname}/indices/{indexName}?key=<key>&value=<value>

説明 特定のキー値ペアを持つ指定された索引内の要素を取得します。

パラメータ

- graphname: プロパティ・グラフの名前。

- indexName: 索引の名前。

- <key>: キー値ペアのキー。

- <value>: キー値ペアの値。

使用上の注意

キー値ペアを指定していない場合、指定した手動索引に関する情報が表示されます。索引が存在しない場合、「Could not find index」というメッセージが返されます。

このGET操作は、OracleIndex.get(key,value)メソッドの呼出しを実行します。

例

次のURLは、キー値ペアname-Beyonceを持つmyIdx索引内のすべての頂点を取得します。

http://localhost:7001/opg_unified/dal/graphs/connections/indices/myIdx?key=name&value=Beyonce

結果は次のようになります。

{
"results": [
{
"country": {
"type": "string",
"value": "United States"
},
"music genre": {
"type": "string",
"value": "pop soul "
},
"role": {
"type": "string",
"value": "singer actress"
},
"name": {
"type": "string",
"value": "Beyonce"
},
"_id": 2,
"_type": "vertex"
}
],
"totalSize": 1,
"queryTime": 79.910928
}

/graphs/{graphname}/indices/{indexName}/count?key=<key>&value=<value>

説明: 特定のキー値ペアを持つ指定された索引内の要素の数を取得します。

パラメータ

- graphname: プロパティ・グラフの名前。

- indexName: 索引の名前。

- <key>: キー値ペアのキー。

- <value>: キー値ペアの値。

使用上の注意

このGET操作は、OracleIndex.count(key,value)メソッドの呼出しを実行します。

例

次のURLは、connectionsグラフのmyIdx索引内のキー値ペアname-Beyonceを持つ頂点の数を取得します。

http://localhost:7001/opg_unified/dal/graphs/connections/indices/myIdx/count?key=name&value=Beyonce

結果は次のようになります。

{
totalSize: 1,
queryTime: 20.781228
}

/graphs/{graphname}/keyindices

説明: 指定されたグラフのすべての自動テキスト索引に関する情報を取得します。現在自動索引で使用されている索引付けされたキーを提供します。

パラメータ

- graphname: プロパティ・グラフの名前。

使用上の注意

このGET操作は、VertexとEdgeの両方のクラスに対するOraclePropertyGraph.getIndexedKeys(class)メソッドの呼出しを実行します。

例

次のURLは、connectionsグラフのすべての自動索引に関する情報を取得します。

http://localhost:7001/opg_unified/dal/graphs/connections/keyindices

結果は次のようになります。

{
keys:         {
edge: [ ],
vertex:      [
"name"
]
},
queryTime: 28.776229
}

/graphs/{graphname}/keyindices/{class}

説明: 特定のタイプのすべての要素に対する自動索引で現在使用されている索引付けされたキーを取得します。

パラメータ

- graphname: プロパティ・グラフの名前。

- class: キー索引の要素のクラス・タイプ。

使用上の注意

このGET操作は、OraclePropertyGraph.getIndexedKeys(class)メソッドの呼出しを実行します。

例

次のURLは、connectionsグラフのすべての自動索引を取得します。

http://localhost:7001/opg_unified/dal/graphs/connections/keyindices/vertex/

結果は次のようになります。

{
results:  [
"name"
],
queryTime: 28.776229
}

/backends

説明: すべての使用可能なバックエンドおよびその構成情報を返します。

パラメータ

(なし。)

使用上の注意

(なし。)

例

次のURLは、すべての構成済バックエンドを取得します。

http://localhost:7001/opg_unified/dal/backends/

結果は次のようになります。

{
backends: [
{
backendName: "hbase_connection",
isDefault: false,
port: "2181",
backendType: "HBaseBackendConnection",
quorum: " localhost "
},
{
host: "localhost",
backendName: "nosql_connection",
isDefault: true,
store: "kvstore",
port: "5000",
backendType: "OracleNoSQLBackendConnection"
}
],
queryTime: 0.219886,
upTime: "0[d]:02[h]:33[m]:40[s]"
}

/backends/default

説明: グラフによって使用されるデフォルトのバックエンドを取得します。

パラメータ

(なし。)

使用上の注意

(なし。)

例

次のURLは、デフォルトのバックエンドを取得します。

http://localhost:7001/opg_unified/dal/backends/default/

結果は次のようになります。

{
defaultBackend: {
host: "localhost",
backendName: "nosql_connection",
isDefault: true,
store: "kvstore",
port: "5000",
backendType: "OracleNoSQLBackendConnection"
},
queryTime: 0.219886,
upTime: "0[d]:02[h]:33[m]:40[s]"
}

/backends/{backendName}

説明: 指定されたバックエンドに関するすべての構成情報を取得します。

パラメータ

- beckendName: バックエンドの名前。

使用上の注意

(なし。)

例

次のURLは、nosql_connectionバックエンドの構成を取得します。

http://localhost:7001/opg_unified/dal/backends/nosql_connection/

結果は次のようになります。

{
backend: {
host: "localhost",
backendName: "nosql_connection",
isDefault: true,
store: "kvstore",
port: "5000",
backendType: "OracleNoSQLBackendConnection"
},
queryTime: 0.219886,
upTime: "0[d]:02[h]:33[m]:40[s]"
}

/graphs/{graphname}

説明: 指定されたグラフのタイプおよびサポートされる機能に関する情報を取得します。

パラメータ

- graphname: プロパティ・グラフの名前。

使用上の注意

(なし。)

例

次のURLは、connectionsグラフに関する情報を取得します。

http://localhost:7001/opg_unified/dal/graphs/connections/

結果は次のようになります。

{
name: "connections",
graph: "oraclepropertygraph with name connections",
features:
{
isWrapper: false,
supportsVertexProperties: true,
supportsMapProperty: true,
supportsUniformListProperty: true,
supportsIndices: true,
ignoresSuppliedIds: false,
supportsFloatProperty: true,
supportsPrimitiveArrayProperty: true,
supportsEdgeIndex: true,
supportsKeyIndices: true,
supportsDoubleProperty: true,
isRDFModel: false,
isPersistent: true,
supportsVertexIteration: true,
supportsEdgeProperties: true,
supportsSelfLoops: false,
supportsDuplicateEdges: true,
supportsSerializableObjectProperty: true,
supportsEdgeIteration: true,
supportsVertexIndex: true,
supportsIntegerProperty: true,
supportsBooleanProperty: true,
supportsMixedListProperty: true,
supportsEdgeRetrieval: true,
supportsTransactions: true,
supportsThreadedTransactions: true,
supportsStringProperty: true,
supportsVertexKeyIndex: true,
supportsEdgeKeyIndex: true,
supportsLongProperty: true
},
readOnly: false,
type: "oracle.pg.nosql.OraclePropertyGraph",
queryTime: 1010.203456,
upTime: "0[d]:19[h]:28[m]:37[s]"
}

/graphs/{graphname}/edges

説明: 指定されたグラフのエッジに関する情報を取得します。

パラメータ

- graphname: プロパティ・グラフの名前。

- opg.showTypes (問合せパラメータ): 各キー値ペアのデータ型がレスポンスに含まれる必要があるかどうかを指定するブール値。

- opg.offset.start (問合せパラメータ): リクエストの処理時にスキップするエッジの数を表す整数。

- opg.offset.limit (問合せパラメータ): グラフから取得するエッジの最大数。

- opg.ids=[<id1>, <id2>, <id3>, ...] (問合せパラメータ): 結果を選択するエッジIDのリスト。

使用上の注意

(なし。)

例

次のGETリクエストは、connectionsグラフのすべてのエッジに関する情報を取得します。

http://localhost:7001/opg_unified/dal/graphs/connections/edges

結果は次のようになります。

{
results:      [
{
weight: 1,
_id: 1001,
_type: "edge",
_outV: 1,
_inV: 3,
_label: "collaborates"
},
{
weight: 1,
_id: 1002,
_type: "edge",
_outV: 1,
_inV: 4,
_label: "admires"
},
…
],
totalSize: 164,
queryTime: 49.491961
}

次のGETリクエストは、connectionsグラフ内のID値が1001および1002であるエッジのみを要求するように、前のリクエストを変更します。

http://localhost:7001/opg_unified/dal/graphs/connections/edges?opg.ids=[1001,1002]

結果は次のようになります。

{
results:      [
{
weight: 1,
_id: 1001,
_type: "edge",
_outV: 1,
_inV: 3,
_label: "collaborates"
},
{
weight: 1,
_id: 1002,
_type: "edge",
_outV: 1,
_inV: 4,
_label: "admires"
}
],
totalSize: 2,
queryTime: 49.491961
}

次のGETリクエストは、connectionsグラフの最初の5つのエッジをスキップした後に1つのエッジをフェッチします。

http://localhost:7001/opg_unified/dal/graphs/connections/edges?opg.offset.start=5&opg.offset.limit=1

結果は次のようになります。

{
results:      [
{
weight: 1,
_id: 1005,
_type: "edge",
_outV: 1,
_inV: 7,
_label: "collaborates"
}
],
totalSize: 1,
queryTime: 49.491961
}

/graphs/{graphname}/edges/{id}

説明: グラフの指定されたIDのエッジに関する情報を取得します。

パラメータ

- graphname: プロパティ・グラフの名前。

- id: 読み取るエッジのエッジID。

- opg.showTypes (問合せパラメータ): 各キー値ペアのデータ型がレスポンスに含まれる必要があるかどうかを指定するブール値。

使用上の注意

(なし。)

例

次のGETリクエストは、connectionsグラフのエッジID 1001に関する情報を取得します。

http://localhost:7001/opg_unified/dal/graphs/connections/edges/1001

結果は次のようになります。

{
results:
{
weight:
{
type: "double",
value: 1
},
_id: 1001,
_type: "edge",
_outV: 1,
_inV: 3,
_label: "collaborates"
},
queryTime: 43.720456
}

次のGETリクエストは、connectionsグラフに存在しないエッジ1に対する失敗したリクエストの出力を表示します。

http://localhost:7001/opg_unified/dal/graphs/connections/edges/1

結果は次のようになります。

{
message: "Edge with name [1] cannot be found."
}

次のGETリクエストは、connectionsグラフの最初の5つのエッジをスキップした後に1つのエッジをフェッチします。

http://localhost:7001/opg_unified/dal/graphs/connections/edges?opg.offset.start=5&opg.offset.limit=1

結果は次のようになります。

{
results:      [
{
weight: 1,
_id: 1005,
_type: "edge",
_outV: 1,
_inV: 7,
_label: "collaborates"
}
],
totalSize: 1,
queryTime: 49.491961
}

/graphs/{graphname}/vertices

説明: 指定されたグラフの頂点に関する情報を取得します。

パラメータ

- graphname: プロパティ・グラフの名前。

- opg.showTypes (問合せパラメータ): 各キー値ペアのデータ型がレスポンスに含まれる必要があるかどうかを指定するブール値。

- opg.offset.start (問合せパラメータ): リクエストの処理時にスキップする頂点の数を表す整数。

- opg.offset.limit (問合せパラメータ): グラフから取得する頂点の最大数。

- opg.ids=[<id1>, <id2>, <id3>, ...] (問合せパラメータ): 結果を選択する頂点IDのリスト。

使用上の注意

(なし。)

例

次のGETリクエストは、connectionsグラフのすべての頂点に関する情報を取得します。

http://localhost:7001/opg_unified/dal/graphs/connections/vertices

結果は次のようになります。

{
results: [
{
country: "Portugal",
occupation: "Professional footballer",
name: "Cristiano Ronaldo",
_id: 63,
_type: "vertex"
},
{
country: "North Korea",
occupation: "Supreme leader of North Korea",
role: "political authority",
name: "Kim Jong Un",
political party: "Workers' Party of Korea",
religion: "atheism",
_id: 32,
_type: "vertex"
},
…
],
totalSize: 78,
queryTime: 22.345108
}

次のGETリクエストは、connectionsグラフ内のID値が4および63である頂点のみを要求するように、前のリクエストを変更します。

http://localhost:7001/opg_unified/dal/graphs/connections/vertices?opg.ids=[4,63]

結果は次のようになります。

{
results: [
{
country: "United States",
role: " american economist",
name: "Janet Yellen",
political party: "Democratic",
_id: 4,
_type: "vertex"
},
{
country: "Portugal",
occupation: "Professional footballer",
name: "Cristiano Ronaldo",
_id: 63,
_type: "vertex"
},
],
totalSize: 2,
queryTime: 22.345108
}

次のGETリクエストは、connectionsグラフの最初の5つの頂点をスキップした後に1つの頂点をフェッチします。

http://localhost:7001/opg_unified/dal/graphs/connections/vertices?opg.offset.start=5&opg.offset.limit=1

結果は次のようになります。

{
results: [
{
country: "United States",
occupation: "founder",
role: "philantropist",
name: "Tom Steyer",
company: "Farallon Capital Management",
political party: "Democratic",
_id: 20,
_type: "vertex"
}
],
totalSize: 1,
queryTime: 65.366488
}

/graphs/{graphname}/vertices/{id}

説明: グラフの指定されたIDの頂点に関する情報を取得します。

パラメータ

- graphname: プロパティ・グラフの名前。

- id: 読み取る頂点の頂点ID。

- opg.showTypes (問合せパラメータ): 各キー値ペアのデータ型がレスポンスに含まれる必要があるかどうかを指定するブール値。

使用上の注意

(なし。)

例

次のGETリクエストは、connectionsグラフの頂点ID 1に関する情報を取得します。

http://localhost:7001/opg_unified/dal/graphs/connections/vertices/1

結果は次のようになります。

{
results:
{
country: "United States",
occupation: "44th president of United States of America",
role: "political authority",
name: "Barack Obama",
political party: "Democratic",
religion: "Christianity",
_id: 1,
_type: "vertex"
},
queryTime: 13.95932
}

次のGETリクエストは、頂点1のすべてのプロパティのデータ型を含むように前のリクエストを変更しました。

http://localhost:7001/opg_unified/dal/graphs/connections/vertices/1?opg.showTypes=true

結果は次のようになります。

{
results:
{
country:
{
type: "string",
value: "United States"
},
occupation:
{
type: "string",
value: "44th president of United States of America"
},
role:
{
type: "string",
value: "political authority"
},
name:
{
type: "string",
value: "Barack Obama"
},
political party:
{
type: "string",
value: "Democratic"
},
religion:
{
type: "string",
value: "Christianity"
},
_id: 1,
_type: "vertex"
},
queryTime: 13.147989
}

次のGETリクエストは、connectionsグラフに存在しない頂点1000に対する失敗したリクエストの出力を表示します。

http://localhost:7001/opg_unified/dal/graphs/connections/vertices/1000

結果は次のようになります。

{
message: "Vertex with name [1000] cannot be found."
}

/graphs/{graphName}/vertices/{id}/{direction}

説明: 指定されたID値を持つ頂点の{in,out,both}の隣接する頂点を取得します。

パラメータ

- direction: 入力頂点の場合はin、出力頂点の場合はout、入力頂点と出力頂点の場合はbothとすることができます。

使用上の注意

(なし。)

例

次のURLは、ID 5を持つ頂点の出力頂点を取得します。

http://localhost:7001/opg_unified/dal/graphs/connections/vertices/5/out/

結果は次のようになります。

{
results:      [
{
name: "Omar Kobine Layama",
_id: 56,
_type: "vertex"
},
{
name: "Dieudonne Nzapalainga",
_id: 57,
_type: "vertex"
},
{
name: "Nicolas Guerekoyame Gbangou",
_id: 58,
_type: "vertex"
},
{
country: "Rome",
name: "The Vatican",
type: "state",
religion: "Catholicism",
_id: 59,
_type: "vertex"
}
],
totalSize: 4,
queryTime: 56.044806
}

/graphs/{graphname}/config

説明: 指定されたグラフの構成の表現(JSON形式)を取得します。

パラメータ

- graphname: プロパティ・グラフの名前。

使用上の注意

(なし。)

例

次のURLは、connectionsグラフのグラフ構成を取得します。

http://localhost:7001/opg_unified/graphs/connections/config

結果は次のようになります。

{
edge_props:   [
{
name: "weight",
type: "string"
}
],
db_engine: "NOSQL",
hosts:      [
"localhost:5000"
],
vertex_props:      [
{
name: "name",
type: "string"
},
{
name: "role",
type: "string"
},
…
{
name: "country",
type: "string"
}
],
format: "pg",
name: "connections",
store_name: "kvstore",
attributes: { },
max_num_connections: 2,
error_handling: { },
loading:         {
load_edge_label: true
},
edge_label: true
}

/graphs/{graphname}/exportData

説明: Oracleプロパティ・グラフ・フラット・ファイル形式(.opvおよび.opeファイル)のグラフを含む.zipファイルをダウンロードします。

パラメータ

- graphname: プロパティ・グラフの名前。

- dop (問合せパラメータ) 操作の並列度。

使用上の注意

(なし。)

例

次のURLは、4つまでの並列実行スレッドを使用して、connectionsグラフをエクスポートします。

http://localhost:7001/opg_unified/graphs/connections/exportData?dop=4

これは、次のようなコンテンツのOPV (頂点)ファイルおよびOPE (エッジ)ファイルを含むzipファイルをダウンロードします。

OPVファイル:

1,name,1,Barack%20Obama,,
1,role,1,political%20authority,,
1,occupation,1,44th%20president%20of%20United%20States%20of%20America,,
1,country,1,United%20States,,
…

OPEファイル:

1000,1,2,collaborates,weight,3,,1.0,
1001,1,3,collaborates,weight,3,,1.0,
1002,1,4,admires,weight,3,,1.0,
1003,1,5,admires,weight,3,,1.0,
…

/edges/{graphname}/properties

説明: 指定されたグラフのエッジによって使用されるプロパティ・キーのセットを取得します。

パラメータ

- graphname: プロパティ・グラフの名前。

使用上の注意

(なし。)

例

次のURLは、connectionsグラフのエッジ・プロパティ・キーを取得します。

http://localhost:7001/opg_unified/edges/connections/properties

結果は次のようになります。

{
complete: 1,
results:      [
"weight"
],
totalSize: 1,
queryTime: 360.491961
}

/vertices/{graphname}/textquery

説明 特定のキー値ペアの基準と一致するグラフの頂点を取得します。既存の索引に対して全文検索を実行します。

パラメータ

- graphname: プロパティ・グラフの名前。

- key (問合せパラメータ) 一致する頂点が持つ必要があるプロパティ・キー。

- value (問合せパラメータ) 一致する頂点が持つ必要があるプロパティ値。

- useWildCards (問合せパラメータ) 完全一致検索を実行するか(false)、またはワイルドカードを使用するか(true)を指定するブール文字列。

使用上の注意

返される結果は、パラメータの値のみでなくパラメータの存在によっても異なります。

- 問合せパラメータを指定しない場合、/graphs/{graphname}/verticesとまったく同じように動作します。key問合せパラメータのみを指定した場合、値に関係なく、そのプロパティ・キーを持つエッジのみを返します。

- keyおよびvalue問合せパラメータを指定し、useWildCards問合せパラメータがtrueではない場合は、値にワイルドカード文字(*)が含まれていても、キー値ペアとの完全一致がある頂点のみを返します。

- keyおよびvalue問合せパラメータを指定し、useWildCards問合せパラメータがtrueである場合は、索引を使用してテキスト検索を実行し、一致する頂点を返します。

ワイルドカード検索が要求され、要求した索引が指定したキーに存在しない場合、エラーが返されます。

例

次のURLは、connectionsグラフ内の、valueが文字列Poで開始するnameキーを持つ頂点を取得します。

http://localhost:7001/opg_unified/vertices/connections/textquery?key=name&value=Po*&useWildCards=true

返されるJSONは次のようになります。

{
results:      [
{
country: "Italy",
occupation: "pope",
role: "Catholic religion authority",
name: "Pope Francis",
religion: "Catholicism",
_id: 5,
_type: "vertex"
},
{
country: "China",
occupation: "business man",
name: "Pony Ma",
_id: 71,
_type: "vertex"
}
],
totalSize: 2,
queryTime: 49.491961
}

/edges/{graphname}/textquery

説明: 特定のキー値ペアの基準と一致するグラフのエッジを取得します。既存の索引に対して全文検索を実行します。

パラメータ

- graphname: プロパティ・グラフの名前。

- key (問合せパラメータ) 一致するエッジが持つ必要があるプロパティ・キー。

- value (問合せパラメータ) 一致するエッジが持つ必要がある値。

- useWildCards (問合せパラメータ) 完全一致検索を実行するか(false)、またはワイルドカードを使用するか(true)を指定するブール文字列。

使用上の注意

返される結果は、パラメータの値のみでなくパラメータの存在によっても異なります。

- 問合せパラメータを指定しない場合、/graphs/{graphname}/edgesとまったく同じように動作します。key問合せパラメータのみを指定した場合、値に関係なく、そのプロパティ・キーを持つエッジのみを返します。

- keyおよびvalue問合せパラメータを指定し、useWildCards問合せパラメータがtrueではない場合は、値にワイルドカード文字(*)が含まれていても、キー値ペアとの完全一致があるエッジを返します。

- keyおよびvalue問合せパラメータを指定し、useWildCards問合せパラメータがtrueである場合は、索引を使用してテキスト検索を実行し、一致するエッジを返します。

例

次のURLは、connectionsグラフ内の、値が文字列frienで開始するtypeキーを持つエッジを取得します。

http://localhost:7001/opg_unified/edges/connections/textquery?key=type&value=frien*&useWildCards=true

返されるJSONは次のようになります。

{
results:      [
{
weight: 1,
type: "friends",
_id: 10000,
_type: "edge",
_outV: 1,
_inV: 3,
_label: "collaborates"
}
],
totalSize: 1,
queryTime: 49.491961
}

5.11.3.2 POST操作(プロパティ・グラフ)

このトピックでは、プロパティ・グラフREST APIのPOST操作について説明します。

注意:

プロパティ・グラフの索引の詳細は、プロパティ・グラフ・データの自動索引の使用およびプロパティ・グラフ・データの手動索引の使用の次の項目を参照してください。

- /graphs/{graphname}/indices/{indexName}?class=<class>

- /graphs/{graphname}/keyindices/{class}/{keyName}

- graphs/connections/edges

- /csv/edges

- graphs/connections/vertices

- /graphs/{graphname}/loadData

- /backends/{newBackendName}

- /edges/{graphname}/ids

- /edges/{graphname}/properties

/graphs/{graphname}/indices/{indexName}?class=<class>

説明: 指定されたグラフの指定された手動索引を作成します。

パラメータ

- graphname: プロパティ・グラフの名前。

- indexName: 作成する手動索引の名前。

- class: 索引のクラス。vertexまたはedgeのいずれかにすることができます。

使用上の注意

このPOST操作は、OraclePropertyGraph.createIndex(name,class)メソッドの呼出しを実行します。

例

次のPOST操作は、connectionsプロパティ・グラフにクラスvertexのmyIdx索引を作成します。

http:// localhost:7001/opg_unified/dal/graphs/connections/indices/myIdx?class=vertex

結果は次のようになります。

{
"queryTime": 551.798547,
"results":
{
"name": "myIdx",
"class": "vertex"
}}

/graphs/{graphname}/keyindices/{class}/{keyName}

説明: 指定されたグラフに自動キー索引を作成します。

パラメータ

- graphname: プロパティ・グラフの名前。

- class: 索引のクラス。vertexまたはedgeのいずれかにすることができます。

- keyName: キー索引の名前。

使用上の注意

このPOST操作は、OraclePropertyGraph.createKeyIndex(key,class)メソッドの呼出しを実行します。

例

次のPOST操作は、connectionsプロパティ・グラフにクラスvertexのmyVKeyIdx自動索引を作成します。

http:// localhost:7001/opg_unified/dal/graphs/connections/keyindices/vertex/myVKeyIdx

結果は次のようになります。

{
"queryTime": 234.970874
}

/graphs/connections/edges

…edges?_outV=<id>&_label=value&_inV=<id>
…edges/<edgeId>?_outV=<id>&_label=value&_inV=<id>
…edges/<edgeId>?<key>=value

説明: 2つの頂点の間に新しいエッジを作成します。

パラメータ

- _outV: 出力頂点。

- _inV: 入力頂点。

- _label: エッジの出力ラベル。

- edgeID: 作成するエッジのID。

- key: 作成するキー値。

使用上の注意

(なし。)

例

次のPOST操作は、頂点29から頂点26にラベルfriendのエッジを作成します。

http://localhost:8080/graphs/connections/edges_outV=29&_label=friend&_inV=26

結果は次のようになります。

{"results": {"_id": 1810534020425227300,"_type": "edge","_outV": 29,"_inV": 26,"_label": "friend"},"queryTime": 36.635908}

/csv/edges

説明: エッジ・ファイルをCSV形式からOPE形式に変換します。

パラメータ

- fileName: エッジ・ファイルの名前(CSV形式)。

- cboxEdgeIDColName: エッジIDとして使用する必要があるキー。

- cboxEdgeSVIDColName: 開始頂点IDとして使用する必要があるキー。

- cboxEdgeLabelColName: エッジ・ラベルとして使用する必要があるキー。

- cboxEdgeDVIDColName: 終了頂点IDとして使用する必要があるキー。

使用上の注意

ファイル形式の詳細は、Oracleフラット・ファイル形式の定義を参照してください。

例

POST操作の実行およびCSVファイルのOPEファイルへの変換に使用できるHTMLフォームを次に示します。

<html>
<body>
<h1>CSV Example - Edges</h1>
<form id="myForm" action="http://localhost:7001/opg_unified/dal/csv/edges"
method="POST" enctype="multipart/form-data">
<p>Select a file for edges : <input type="file" name="fileEdge" size="45" /></p>
<p>Edge Id : <input type="text" name="cboxEdgeIDColName" size="25" /></p>
<p>Start vertex Id : <input type="text" name="cboxEdgeSVIDColName" size="25" /></p>
<p>Edge Label : <input type="text" name="cboxEdgeLabelColName" size="25" /></p>
<p>End vertex Id : <input type="text" name="cboxEdgeDVIDColName" size="25" /></p>
<input type="button" onclick="myFunction()" value="Upload">
</form>
<script>
function myFunction() {
frm =  document.getElementById("myForm");
frm.submit();
}
</script>
</body>
</html>

このフォームはブラウザで次のように表示されます。

入力エッジ・ファイル(edges.csv)の内容は次のとおりです。

EDGE_ID,START_ID:long,weight:float,END_ID:long,label:string
1,1,1.0,2,knows

出力エッジ・ファイル(vertices.ope)の内容は次のとおりです。

1,1,2,knows,weight,3,,1.0,

/csv/vertices

説明: 頂点ファイルをCSV形式からOPV形式に変換します。

パラメータ

- fileVertex: 頂点ファイルの名前(CSV形式)。

- cboxVertexIDColName: 頂点IDとして使用する必要があるキー。

使用上の注意

ファイル形式の詳細は、Oracleフラット・ファイル形式の定義を参照してください。

例

POST操作の実行およびCSVファイルのOPVファイルへの変換に使用できるHTMLフォームを次に示します。

<html>
<body>
<h1>CSV Example</h1>
<form id="myForm" action="http://localhost:7001/opg_unified/dal/csv/vertices"
method="POST" enctype="multipart/form-data">
<p>Select a file for vertices : <input type="file" name="fileVertex" size="45" /></p>
<p>Vertex Id : <input type="text" name="cboxVertexIDColName" size="25" /></p>
<input type="button" onclick="myFunction()" value="Upload">
</form>
<script>
function myFunction() {
frm =  document.getElementById("myForm");
frm.submit();
}
</script>
</body>
</html>

このフォームはブラウザで次のように表示されます。

入力頂点ファイル(vertices.csv)の内容は次のとおりです。

id,name,country
1,Eros%20Ramazzotti,Italy
2,Monica%20Bellucci,Italy

出力頂点ファイル(vertices.opv)の内容は次のとおりです。

1,name,1,Eros%20Ramazzotti,,
1,country,1,Italy,,
2,name,1,Monica%20Bellucci,,
2,country,1,Italy}

/graphs/{graphname}/loadData

説明: OPVおよびOPEファイルをサーバーにアップロードし、頂点およびエッジをグラフにインポートします。グラフ・メタデータを返します。

パラメータ

- graphname: プロパティ・グラフの名前。

- vertexFile (リクエスト・ペイロード): 頂点(.opv)ファイル。

- edgeFile (リクエスト・ペイロード): エッジ(.ope)ファイル。

- clearRepository (リクエスト・ペイロード): ロード操作を開始する前にグラフを消去するかどうかを示すブール値。

- dop (リクエスト・ペイロード): 操作の並列度。

使用上の注意

この操作では、頂点ファイルとエッジ・ファイルの両方を同じ操作でポストできます。

例

次の単純なHTMLフォームを使用して、.OPVおよび.OPEファイルのペアをサーバーにアップロードできます。

http://localhost:7001/opg_unified/graphs/connections/loadData
<html>
<body>
<h1>File Upload to OPG Unified</h1>
<p>
Graph name : <input type="text" name="graphTxt" id="graphTxt" size="45" />
</p>
<form id="myForm" action="http://localhost:7001/opg_unified/graphs/" method="POST" enctype="multipart/form-data">
<p>
Select a file for vertices : <input type="file" name="vertexFile" size="45" />
</p>
<p>
Select a file for edges : <input type="file" name="edgeFile" size="45" />
</p>
<p>
Clear graph ? : <input type="text" name="clearRepository" size="25" />
</p>

<input type="button" onclick="myFunction()" value="Upload">
</form>
<script>
function myFunction() {
frm =  document.getElementById("myForm");
frm.action = frm.action + graphTxt.value + '/loadData';
frm.submit();
}
</script>
</body>
</html>

表示されるフォームは次のようになります。

OPV (頂点)ファイルの内容は次のとおりです。

1,name,1,Barack%20Obama,,
1,role,1,political%20authority,,
1,occupation,1,44th%20president%20of%20United%20States%20of%20America,,
1,country,1,United%20States,,
…

OPE (エッジ)ファイルの内容は次のとおりです。

1000,1,2,collaborates,weight,3,,1.0,
1001,1,3,collaborates,weight,3,,1.0,
1002,1,4,admires,weight,3,,1.0,
1003,1,5,admires,weight,3,,1.0,
…

返されるJSON結果は次のようになります。

{
name: "connections",
graph: "oraclepropertygraph with name connections",
features:
{
isWrapper: false,
supportsVertexProperties: true,
supportsMapProperty: true,
supportsUniformListProperty: true,
supportsIndices: true,
ignoresSuppliedIds: false,
supportsFloatProperty: true,
supportsPrimitiveArrayProperty: true,
supportsEdgeIndex: true,
supportsKeyIndices: true,
supportsDoubleProperty: true,
isRDFModel: false,
isPersistent: true,
supportsVertexIteration: true,
supportsEdgeProperties: true,
supportsSelfLoops: false,
supportsDuplicateEdges: true,
supportsSerializableObjectProperty: true,
supportsEdgeIteration: true,
supportsVertexIndex: true,
supportsIntegerProperty: true,
supportsBooleanProperty: true,
supportsMixedListProperty: true,
supportsEdgeRetrieval: true,
supportsTransactions: true,
supportsThreadedTransactions: true,
supportsStringProperty: true,
supportsVertexKeyIndex: true,
supportsEdgeKeyIndex: true,
supportsLongProperty: true
},
readOnly: false,
type: "oracle.pg.nosql.OraclePropertyGraph",
queryTime: 1010.203456,
upTime: "0[d]:19[h]:28[m]:37[s]"
}

/backends/{newBackendName}

説明: 指定されたプロパティで新しいバックエンド・エントリを設定します。

パラメータ

- newBackendName: サポートする新しいバックエンドの名前。

使用上の注意

バックエンド名がすでに存在する場合、エラーが生成されます

isDefaultやbackendTypeなど、指定されたその他のパラメータは、ペイロードの一部として渡されます。

例

次のPOST操作は、hbase_connection2という名前の新しいバックエンドを作成します。

http://localhost:7001/opg_unified/dal/backends/hbase_connection2

ペイロードの例:

{"isDefault": false,"port": "2181","backendType":"HBaseBackendConnection","quorum": "127.0.0.1"}

結果は次のようになります。

{"backend": {"backendName": "hbase_connection2","isDefault": false,"port": "2181","backendType": "HBaseBackendConnection","quorum": "127.0.0.1"},"queryTime": 49.904438,"upTime": "0[d]:00[h]:56[m]:14[s]"}

/edges/{graphName}/ids

説明: 一連のエッジを返します。

パラメータ

- graphname: プロパティ・グラフの名前。

- ids (リクエスト・ペイロード): 要求したエッジのIDのJSON配列。

使用上の注意

このAPIは、IDキーのJSON配列および整数ID値の配列を送信します。入力idsパラメータのサイズと一致する配列を返します

エッジが見つからない場合、結果の配列内の対応する値はnullになります。

グラフにエッジが存在しない場合でも常に結果の配列を返し、その場合は、null値ばかりの配列を返しますが、404 HTTPコードは返しません。

例

次のコマンドは、connectionsグラフ内のIDが1001および1002 (存在する場合)のエッジを取得します。

curl -v -X POST 'http://localhost:7001/opg_unified/edges/connections/ids' -H "Content-Type: application/json" -d '{"ids":[1001,1002,1]}

返されるJSONは次のようになります。

{
results:      [
{
weight: 1,
_id: 1001,
_type: "edge",
_outV: 1,
_inV: 3,
_label: "collaborates"
},
{
weight: 1,
_id: 1002,
_type: "edge",
_outV: 1,
_inV: 4,
_label: "admires"
},
null
],
totalSize: 3,
queryTime: 49.491961
}

/edges/{graphName}/properties

説明: 指定されたエッジの指定されたプロパティを返します。

パラメータ

- graphname: プロパティ・グラフの名前。

- ids (リクエスト・ペイロード): エッジのIDのJSON配列。

- propertyName (リクエスト・ペイロード): プロパティの名前を指定するJSON文字列。

使用上の注意

このAPIは、idsキーのJSON配列および整数ID値の配列を送信します。入力idsパラメータのサイズと一致する配列を返します

エッジが見つからない場合、結果の配列内の対応する値はnullになります。

グラフにエッジが存在しない場合でも常に結果の配列を返し、その場合は、null値ばかりの配列を返しますが、404 HTTPコードは返しません。

例

次のコマンドは、connectionsグラフ内のIDが1001、1002および1003 (存在する場合)のエッジのweight値を取得します。

curl -v -X POST 'http://localhost:7001/opg_unified/edges/connections/properties' -H "Content-Type: application/json" -d '{"ids":[1001,1002,1003],"propertyName":"weight"}'

返されるJSONは次のようになります。

{
results:      [
{
_id: 1001,
weight: 1
},
{
_id: 1002,
weight: 1
},
{
_id: 1003,
weight: 1
}
],
totalSize: 3,
queryTime: 12.491961 }

5.11.3.3 PUT操作(プロパティ・グラフ)

このトピックでは、プロパティ・グラフREST APIのPUT操作について説明します。

注意:

プロパティ・グラフの索引の詳細は、プロパティ・グラフ・データの自動索引の使用およびプロパティ・グラフ・データの手動索引の使用の次の項目を参照してください。

- /backends/{backendNameNew}

- /graphs/connections/edges

- /graphs/{graphname}/indices/{indexName}}?key=<key>&value=<value>&id=<id>

/backends/{backendNameNew}

説明: 指定されたプロパティで新しいバックエンド・エントリを設定します。

パラメータ

- backendNameNew: サポートする新しいバックエンドの名前。

- backendType: サポートする新しいバックエンドのタイプ。

- (other): (その他のバックエンド固有のプロパティ。)

使用上の注意

バックエンド名がすでに存在する場合、エラーが生成されます。

isDefaultやbackendTypeなど、指定されたその他のパラメータは、ペイロードの一部として渡されます。

例

次のPUT操作は、hbase_connection2という名前の新しいバックエンドを作成します。

http://localhost:7001/opg_unified/dal/backends/hbase_connection2

ペイロードの例:

{"isDefault": false,"port": "2182","backendType":"HBaseBackendConnection","quorum": "127.0.0.1"}

結果は次のようになります。

{"backend": {"backendName": "hbase_connection2","isDefault": false,"port": "2182","backendType": "HBaseBackendConnection","quorum": "127.0.0.1"}, "queryTime": 20.929009, "upTime": "0[d]:02[h]:22[m]:19[s]"}

/graphs/connections/edges

…edges?_outV=<id>&_label=value&_inV=<id>
…edges/<edgeId>?_outV=<id>&_label=value&_inV=<id>
…edges/<edgeId>?<key>=value

説明: 2つの頂点の間に新しいエッジを作成します。

パラメータ

- _outV: 出力頂点。

- _inV: 入力頂点。

- _label: エッジの出力ラベル。

- edgeID: 作成するエッジのID。

- key: 作成するキー値。

使用上の注意

(なし。)

例

次のPUT操作は、頂点29から頂点26にラベルfriendのエッジを作成します。

http://localhost:8080/graphs/connections/edges_outV=29&_label=friend&_inV=26

結果は次のようになります。

{"results": {"_id": 1810534020425227300,"_type": "edge","_outV": 29,"_inV": 26,"_label": "friend"},"queryTime": 36.635908}

/graphs/{graphname}/indices/{indexName}}?key=<key>&value=<value>&id=<id>

説明: 指定された頂点またはエッジを、指定された手動索引のキー値ペアに追加します。

パラメータ

- graphName: プロパティ・グラフの名前。

- indexName: 索引の名前。

- <key>: キー値ペアのキー。

- <value>: キー値ペアの値。

- <id>: 頂点またはエッジのID値。

使用上の注意

このPUT操作は、OracleIndex.put(key,value,class)メソッドの呼出しを実行します。

例

次の例では、キー値ペア"name"-"Beyonce"をID 2の頂点に追加します。

http://localhost:7001/opg_unified/dal/graphs/connections/indices/myIdx?key=name&value=Beyonce&id=2

PUT操作が正常に行われた場合、次のようなレスポンスが表示されます。

{
"queryTime": 39.265613
}

5.11.3.4 DELETE操作(プロパティ・グラフ)

このトピックでは、プロパティ・グラフREST APIのDELETE操作について説明します。

注意:

プロパティ・グラフの索引の詳細は、プロパティ・グラフ・データの自動索引の使用およびプロパティ・グラフ・データの手動索引の使用の次の項目を参照してください。

- /backends/{backendName}

- /graphs/{graphName}/edges/<id>

- /graphs/{graphName}/indices/{IndexName}

- /graphs/{graphName}/keyindices/{class}/{keyName}

/backends/{backendName}

説明: グラフ・サーバーの使用可能なバックエンドのリストから指定されたバックエンドを削除します。削除したバックエンドの情報を返します。

パラメータ

- backendName: バックエンドの名前。

使用上の注意

(なし。)

例

次のPUT操作

結果は次のようになります。

{"backend":{"backendName":"hbase_connection","isDefault":false,"port":"2181","backendType":"HBaseBackendConnection","quorum":"127.0.0.1"},"queryTime":0.207346,"upTime":"0[d]:00[h]:18[m]:40[s]"}

/graphs/{graphName}/edges/<id>

説明: 指定されたグラフから指定されたエッジIDを持つエッジを削除します。

パラメータ

- id: 削除するエッジのID。

使用上の注意

このAPIは操作にかかった時間を返します。

例

次の例は、ID 1010のエッジを削除します。

http://localhost:7001/opg_unified/dal/graphs/connections/edges/1010

操作が正常に行われた場合、次のようなレスポンスが表示されます。

{
"queryTime": 10.925611
}

/graphs/{graphName}/indices/{IndexName}

説明: 指定されたグラフから指定された手動索引を削除します。

パラメータ

- graphName: プロパティ・グラフの名前。

- indexName: 削除する手動索引の名前。

使用上の注意

このDELETE操作は、OraclePropertyGraph.dropIndex(name)メソッドの呼出しを実行します。

例

次の例では、手動索引myIdxをconnectionsグラフから削除します。

http:// localhost:7001/opg_unified/dal/graphs/connections/indices/myIdx

/graphs/{graphName}/keyindices/{class}/{keyName}

説明: 指定されたグラフから指定された自動索引を削除します。

パラメータ

- graphName: プロパティ・グラフの名前。

- indexName: 削除する自動索引の名前。

使用上の注意

このDELETE操作は、OraclePropertyGraph.dropKeyIndex(name,class)メソッドの呼出しを実行します。

例

次の例では、自動索引myVKeyIdxをconnectionsグラフから削除します。

http:// localhost:7001/opg_unified/dal/graphs/connections/keyindices/vertex/myVKeyIdx

5.12 サンプル・プログラムの探索

ソフトウェア・インストールには、プロパティ・グラフの作成および操作方法を習得するために使用できる、プログラムの例のディレクトリが含まれています。

- サンプル・プログラムについて

- サンプル・プログラムのコンパイルおよび実行

- 出力の例について

- 例: プロパティ・グラフの作成

- 例: プロパティ・グラフの削除

- 例: 頂点およびエッジの追加と削除

5.12.1 サンプル・プログラムについて

サンプル・プログラムは、examples/dalという名前のインストール・サブディレクトリに配布されます。例はHBaseおよびOracle NoSQL Database用にレプリケートされるため、選択したバックエンド・データベースに対応するプログラムのセットを使用できます。次の表に、プログラムの要素を示します。

表5-4 プロパティ・グラフのプログラム例(一部)

プログラム名

説明

ExampleNoSQL1

ExampleHBase1

1つの頂点からなる最小プロパティ・グラフを作成し、様々なデータ型のプロパティを頂点に設定し、保存済のグラフの記述をデータベースに問い合せます。

ExampleNoSQL2

ExampleHBase2

Example1と同じ最小プロパティ・グラフを作成してから、それを削除します。

ExampleNoSQL3

ExampleHBase3

複数の頂点およびエッジを持つグラフを作成します。いくつかの頂点およびエッジを明示的に削除し、その他は他の必須オブジェクトを削除することによって暗黙的に削除します。この例は、オブジェクトの現在のリストを表示するために、データベースを繰り返し問い合せます。

5.12.2 サンプル・プログラムのコンパイルおよび実行

Javaソース・ファイルをコンパイルおよび実行するには、次のようにします。

1. 例のディレクトリに変更します。

cd examples/dal

2. Javaコンパイラを使用します。

javac -classpath ../../lib/'*' filename.java

例: javac -classpath ../../lib/'*' ExampleNoSQL1.java

3. コンパイルしたコードを実行します。

java -classpath ../../lib/'*':./ filename args

引数は、グラフを格納するためにOracle NoSQL DatabaseまたはApache HBaseのいずれを使用しているかによって異なります。値はOraclePropertyGraph.getInstanceに渡されます。

Apache HBaseの引数の説明

HBaseの例を使用している場合は、次の引数を指定します。

1. quorum: "node01.example.com, node02.example.com, node03.example.com"など、HBaseの実行ノードを識別する名前のカンマ区切りリスト。

2. client_port: "2181"など、HBaseクライアントのポート番号。

3. graph_name: "customer_graph"など、グラフの名前。

Oracle NoSQL Databaseの引数の説明

NoSQLの例を使用している場合は、次の引数を指定します。

1. host_name: "cluster02:5000"など、Oracle NoSQL Database登録のクラスタ名およびポート番号。

2. store_name: "kvstore"など、キー値ストアの名前

3. graph_name: "customer_graph"など、グラフの名前。

5.12.3 出力の例について

プログラムの例は、System.out.println を使用して、プロパティ・グラフの記述を格納先のデータベース(Oracle NoSQL DatabaseまたはApache HBaseのいずれか)から取得します。キー名、データ型および値はコロンで区切られます。たとえば、weight:flo:30.0は、キー名がweight、データ型がfloat、値が30.0であることを示しています。

表5-5に、出力で使用されるデータ型の略称を示します。

表5-5 プロパティ・グラフのデータ型の略称

略称

データ型

bol

Boolean

dat

date

dbl

double

flo

float

int

integer

ser

serializable

str

string

5.12.4 例: プロパティ・グラフの作成

ExampleNoSQL1およびExampleHBase1は、1つの頂点からなる最小プロパティ・グラフを作成します。例5-5のコード・フラグメントは、v1という名前の頂点を作成し、様々なデータ型のプロパティを設定します。次に、保存済のグラフの記述をデータベースに問い合せます。

例5-5 プロパティ・グラフの作成

// Create a property graph instance named opg
OraclePropertyGraph opg = OraclePropertyGraph.getInstance(args);

// Clear all vertices and edges from opg
opg.clearRepository();

// Create vertex v1 and assign it properties as key-value pairs
Vertex v1 = opg.addVertex(1l);
v1.setProperty("age",  Integer.valueOf(18));
v1.setProperty("name", "Name");
v1.setProperty("weight", Float.valueOf(30.0f));
v1.setProperty("height", Double.valueOf(1.70d));
v1.setProperty("female", Boolean.TRUE);

// Save the graph in the database
opg.commit();

// Display the stored vertex description
System.out.println("Fetch 1 vertex: " + opg.getVertices().iterator().next());

// Close the graph instance
opg.shutdown();

OraclePropertyGraph.getInstance引数(args)は、グラフを格納するためにOracle NoSQL DatabaseまたはApache HBaseのいずれを使用しているかによって異なります。「サンプル・プログラムのコンパイルおよび実行」を参照してください。

System.out.printlnは次の出力を表示します。

Fetch 1 vertex: Vertex ID 1 {age:int:18, name:str:Name, weight:flo:30.0, height:dbl:1.7, female:bol:true}

次については、プロパティ・グラフ・サポートのJavadoc (デフォルトでは/opt/oracle/oracle-spatial-graph/property_graph/doc/pgx)を参照してください。

OraclePropertyGraph.addVertex
OraclePropertyGraph.clearRepository
OraclePropertyGraph.getInstance
OraclePropertyGraph.getVertices
OraclePropertyGraph.shutdown
Vertex.setProperty

5.12.5 例: プロパティ・グラフの削除

ExampleNoSQL2およびExampleHBase2は、「例: プロパティ・グラフの作成」で作成したようなグラフを作成し、それをデータベースから削除します。

例5-6のコード・フラグメントは、グラフを削除します。OraclePropertyGraphUtils.dropPropertyGraph引数の説明は、「サンプル・プログラムのコンパイルおよび実行」を参照してください。

例5-6 プロパティ・グラフの削除

// Drop the property graph from the database
OraclePropertyGraphUtils.dropPropertyGraph(args);

// Display confirmation that the graph was dropped
System.out.println("Graph " + graph_name + " dropped. ");

System.out.printlnは次の出力を表示します。

Graph graph_name dropped.

OraclePropertyGraphUtils.dropPropertyGraphのJavadocを参照してください。

5.12.6 例: 頂点およびエッジの追加と削除

ExampleNoSQL3およびExampleHBase3は、頂点とエッジの両方を追加および削除します。

例5-7 頂点の作成

例5-7のコード・フラグメントは、3つの頂点を作成します。これは例5-5をシンプルにしたバリエーションです。

// Create a property graph instance named opg
OraclePropertyGraph opg = OraclePropertyGraph.getInstance(args);

// Clear all vertices and edges from opg
opg.clearRepository();

// Add vertices a, b, and c
Vertex a = opg.addVertex(1l);
a.setProperty("name", "Alice");
a.setProperty("age", 31);

Vertex b = opg.addVertex(2l);
b.setProperty("name", "Bob");
b.setProperty("age", 27);

Vertex c = opg.addVertex(3l);
c.setProperty("name", "Chris");
c.setProperty("age", 33);

例5-8 エッジの作成

例5-8のコード・フラグメントは、頂点a、bおよびcを使用してエッジを作成します。

// Add edges e1, e2, and e3
Edge e1 = opg.addEdge(1l, a, b, "knows");
e1.setProperty("type", "partners");

Edge e2 = opg.addEdge(2l, a, c, "knows");
e2.setProperty("type", "friends");

Edge e3 = opg.addEdge(3l, b, c, "knows");
e3.setProperty("type", "colleagues");

例5-9 エッジおよび頂点の削除

例5-9のコード・フラグメントは、エッジe3と頂点bを明示的に削除します。これにより、頂点bに接続していたエッジe1が暗黙的に削除されます。

// Remove edge e3
opg.removeEdge(e3);

// Remove vertex b and all related edges
opg.removeVertex(b);

例5-10 頂点およびエッジの問合せ

この例は、データベースに問い合せて、オブジェクトがいつ追加および削除されるかを表示します。例5-10のコード・フラグメントは、使用されるメソッドを表示します。

// Print all vertices
vertices = opg.getVertices().iterator();
System.out.println("----- Vertices ----");
vCount = 0;
while (vertices.hasNext()) {
System.out.println(vertices.next());
vCount++;
}
System.out.println("Vertices found: " + vCount);

// Print all edges
edges = opg.getEdges().iterator();
System.out.println("----- Edges ----");
eCount = 0;
while (edges.hasNext()) {
System.out.println(edges.next());
eCount++;
}
System.out.println("Edges found: " + eCount);

このトピックの例では、次のような出力が生成されます。

----- Vertices ----
Vertex ID 3 {name:str:Chris, age:int:33}
Vertex ID 1 {name:str:Alice, age:int:31}
Vertex ID 2 {name:str:Bob, age:int:27}
Vertices found: 3
----- Edges ----
Edge ID 2 from Vertex ID 1 {name:str:Alice, age:int:31} =[knows]=> Vertex ID 3 {name:str:Chris, age:int:33} edgeKV[{type:str:friends}]
Edge ID 3 from Vertex ID 2 {name:str:Bob, age:int:27} =[knows]=> Vertex ID 3 {name:str:Chris, age:int:33} edgeKV[{type:str:colleagues}]
Edge ID 1 from Vertex ID 1 {name:str:Alice, age:int:31} =[knows]=> Vertex ID 2 {name:str:Bob, age:int:27} edgeKV[{type:str:partners}]
Edges found: 3
Remove edge Edge ID 3 from Vertex ID 2 {name:str:Bob, age:int:27} =[knows]=> Vertex ID 3 {name:str:Chris, age:int:33} edgeKV[{type:str:colleagues}]
----- Vertices ----
Vertex ID 1 {name:str:Alice, age:int:31}
Vertex ID 2 {name:str:Bob, age:int:27}
Vertex ID 3 {name:str:Chris, age:int:33}
Vertices found: 3
----- Edges ----
Edge ID 2 from Vertex ID 1 {name:str:Alice, age:int:31} =[knows]=> Vertex ID 3 {name:str:Chris, age:int:33} edgeKV[{type:str:friends}]
Edge ID 1 from Vertex ID 1 {name:str:Alice, age:int:31} =[knows]=> Vertex ID 2 {name:str:Bob, age:int:27} edgeKV[{type:str:partners}]
Edges found: 2
Remove vertex Vertex ID 2 {name:str:Bob, age:int:27}
----- Vertices ----
Vertex ID 1 {name:str:Alice, age:int:31}
Vertex ID 3 {name:str:Chris, age:int:33}
Vertices found: 2
----- Edges ----
Edge ID 2 from Vertex ID 1 {name:str:Alice, age:int:31} =[knows]=> Vertex ID 3 {name:str:Chris, age:int:33} edgeKV[{type:str:friends}]
Edges found: 1

5.13 Oracleフラット・ファイル形式の定義

プロパティ・グラフは、頂点用の記述ファイルとエッジ用の記述ファイルの2つのフラット・ファイルに定義できます。

- プロパティ・グラフ記述ファイルについて

- 頂点ファイル

- エッジ・ファイル

- 特殊文字のエンコーディング

- Oracleフラット・ファイル形式でのプロパティ・グラフの例

- Oracle Database表のOracle定義のプロパティ・グラフ・フラット・ファイルへの変換

- 頂点およびエッジのCSVファイルのOracle定義のプロパティ・グラフ・フラット・ファイルへの変換

5.13.1 プロパティ・グラフ記述ファイルについて

ファイルのペアにより、プロパティ・グラフが記述されます。

- 頂点ファイル: プロパティ・グラフの頂点を記述します。このファイルには、.opvというファイル名拡張子が付きます。

- エッジ・ファイル: プロパティ・グラフのエッジを記述します。このファイルには、.opeというファイル名拡張子が付きます。

これら2つのファイルは同じベース名を共有することをお薦めします。たとえば、simple.opvおよびsimple.opeによってプロパティ・グラフを定義します。

5.13.2 頂点ファイル

頂点ファイルの各行は、プロパティ・グラフの1つの頂点を記述する1つのレコードです。1つのレコードは1つの頂点の1つのキー値プロパティを記述できるため、複数のプロパティを持つ頂点を記述する場合は複数のレコード/行が使用されます。

レコードには、カンマで区切られた6つのフィールドが含まれています。各レコードには、値があるかどうかに関係なく、すべてのフィールドを区切るために5つのカンマが含まれている必要があります。

vertex_ID, key_name, value_type, value, value, value

表5-6に、頂点ファイルのレコードを構成するフィールドを示します。

表5-6 頂点ファイルのレコードの形式

フィールド番号

名前

説明

1

vertex_ID

頂点を一意に識別する整数

2

key_name

キー値ペアのキーの名前

頂点にプロパティが指定されていない場合は、空白(%20)を入力します。この例は、プロパティが指定されていない頂点1を示しています。

1,%20,,,,

3

value_type

キー値ペアの値のデータ型を表す整数。

- 1 String

- 2 整数

- 3 浮動小数

- 4 倍精度

- 5 タイムスタンプ(日付)

- 6 ブール

- 7 長整数

- 8 短整数

- 9 バイト

- 10 文字

- 20 空間データ(地理空間座標、線、ポリゴンまたはWell-Known Text (WKT)リテラルなどがあります)

- 101 シリアライズ可能Javaオブジェクト

4

value

数値でもタイムスタンプ(日付)でもない場合のkey_nameのエンコードされたnullでない値

5

value

数値である場合のkey_nameのエンコードされたnullでない値

6

value

タイムスタンプ(日付)である場合のkey_nameのエンコードされたnullでない値

日付の形式を識別するには、Java SimpleDateFormatクラスを使用します。この例は、2015-03-26T00:00:00.000-05:00という日付形式を示しています。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); encode(sdf.format((java.util.Date) value));

頂点の必須グループ化: 1つの頂点には複数のプロパティを指定でき、頂点ファイルには、頂点IDとその頂点の1つのプロパティの組合せごとに1つのレコード(フラット・ファイル内の単一テキスト行によって表される)が含まれます。頂点ファイルでは、各頂点のすべてのレコードがまとめてグループ化されている(つまり、他の頂点のレコードが間に入っていない)必要があります。これは任意の方法で行えますが、便利な方法は、頂点ファイルのレコードを頂点ID別に昇順(または降順)にソートすることです。(ただし、頂点ファイルのすべてのレコードを頂点ID別にソートする必要があるわけではありません。これはグループ化要件を満たすための単なる1つの方法です。)

Oracleフラット・ファイル形式で頂点ファイルを構築する場合、頂点プロパティ名および値フィールドが正しくエンコードされていることを確認することが重要です(特に「特殊文字のエンコーディング」を参照してください)。エンコードを簡略化するには、OraclePropertyGraphUtils.escape Java APIを使用できます。

OraclePropertyGraphUtils.outputVertexRecord(os, vid, key, value)ユーティリティ・メソッドを使用して、Oracleフラット・ファイル形式で頂点レコードを直接シリアル化できます。このメソッドを使用すると、特殊文字のエンコーディングについて心配する必要がなくなります。このメソッドは、vidによって識別される特定の頂点のkey/valueプロパティを表す特定の出力ストリーム内のテキストの新しい行を作成します。

例5-11 OraclePropertyGraphUtils.outputVertexRecordの使用

この例では、OraclePropertyGraphUtils.outputVertexRecordを使用して頂点1の2つの新しい行を作成します。

String opv = "./example.opv";
OutputStream os = new FileOutputStream(opv);
int birthYear = 1961;
long vid = 1;
OraclePropertyGraphUtils.outputVertexRecord(os, vid, "name", "Barack Obama");
OraclePropertyGraphUtils.outputVertexRecord(os, vid, "birth year", birthYear);
os.flush();
os.close();

生成された出力ファイルの最初の行は、値"Barack Obama"を持つプロパティ名を示し、2番目の行は、その誕生日である1961を示します。

% cat example.opv
1,name,Barack%20Obama,,
1,birth%20year,2,,1961,

5.13.3 エッジ・ファイル

エッジ・ファイルの各行は、プロパティ・グラフの1つのエッジを記述する1つのレコードです。1つのレコードは1つのエッジの1つのキー値プロパティを記述できるため、複数のプロパティを持つエッジを記述する場合は複数のレコードが使用されます。

レコードには、カンマで区切られた9つのフィールドが含まれています。各レコードには、値があるかどうかに関係なく、すべてのフィールドを区切るために8つのカンマが含まれている必要があります。

edge_ID, source_vertex_ID, destination_vertex_ID, edge_label, key_name, value_type, value, value, value

表5-7に、エッジ・ファイルのレコードを構成するフィールドを示します。

表5-7 エッジ・ファイルのレコードの形式

フィールド番号

名前

説明

1

edge_ID

エッジを一意に識別する整数

2

source_vertex_ID

エッジの出力始点のvertex_ID。

3

destination_vertex_ID

エッジの入力終点のvertex_ID。

4

edge_label

2つの頂点間の関係を記述する、エッジのエンコードされたラベル

5

key_name

キー値ペアのキーのエンコードされた名前

エッジにプロパティが指定されていない場合は、空白(%20)を入力します。この例は、プロパティが指定されていないエッジ100を示しています。

100,1,2,likes,%20,,,,

6

value_type

キー値ペアの値のデータ型を表す整数。

- 1 String

- 2 整数

- 3 浮動小数

- 4 倍精度

- 5タイムスタンプ(日付)

- 6 ブール

- 7 長整数

- 8 短整数

- 9 バイト

- 10 文字

- 101 シリアライズ可能Javaオブジェクト

7

value

数値でもタイムスタンプ(日付)でもない場合のkey_nameのエンコードされたnullでない値

8

value

数値である場合のkey_nameのエンコードされたnullでない値

9

value

タイムスタンプ(日付)である場合のkey_nameのエンコードされたnullでない値

日付の形式を識別するには、Java SimpleDateFormatクラスを使用します。この例は、2015-03-26Th00:00:00.000-05:00という日付形式を示しています。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'Th'HH:mm:ss.SSSXXX"); encode(sdf.format((java.util.Date) value));

エッジの必須グループ化: 1つのエッジには複数のプロパティを指定でき、エッジ・ファイルには、エッジIDとそのエッジの1つのプロパティの組合せごとに1つのレコード(フラット・ファイル内の単一テキスト行によって表される)が含まれます。エッジ・ファイルでは、各エッジのすべてのレコードがまとめてグループ化されている(つまり、他のエッジのレコードが間に入っていない)必要があります。これは任意の方法で行えますが、便利な方法は、エッジ・ファイルのレコードをエッジID別に昇順(または降順)にソートすることです。(ただし、エッジ・ファイルのすべてのレコードをエッジID別にソートする必要があるわけではありません。これはグループ化要件を満たすための単なる1つの方法です。)

Oracleフラット・ファイル形式でエッジ・ファイルを構築する場合、エッジ・プロパティ名および値フィールドが正しくエンコードされていることを確認することが重要です(特に「特殊文字のエンコーディング」を参照してください)。エンコードを簡略化するには、OraclePropertyGraphUtils.escape Java APIを使用できます。

OraclePropertyGraphUtils.outputEdgeRecord(os, eid, svid, dvid, label, key, value)ユーティリティ・メソッドを使用して、Oracleフラット・ファイル形式でエッジ・レコードを直接シリアル化できます。このメソッドを使用すると、特殊文字のエンコーディングについて心配する必要がなくなります。このメソッドは、eidによって識別される特定のエッジのkey/valueプロパティを表す特定の出力ストリーム内のテキストの新しい行を作成します。

例5-12 OraclePropertyGraphUtils.outputEdgeRecordの使用

この例では、OraclePropertyGraphUtils.outputEdgeRecordを使用して、頂点1と頂点2の間のエッジ100の2つの新しい行をラベルfriendOfを使用して作成します。

String ope = "./example.ope";
OutputStream os = new FileOutputStream(ope);
int sinceYear = 2009;
long eid = 100;
long svid = 1;
long dvid = 2;
OraclePropertyGraphUtils.outputEdgeRecord(os, eid, svid, dvid, "friendOf", "since (year)", sinceYear);
OraclePropertyGraphUtils.outputEdgeRecord(os, eid, svid, dvid, "friendOf", "weight", 1);
os.flush();
os.close();

生成された出力ファイルの最初の行はプロパティ“since (year)"を値2009で表し、2番目の行と次の行はエッジの重みを1に設定しています

% cat example.ope
100,1,2,friendOf,since%20(year),2,,2009,
100,1,2,friendOf,weight,2,,1,

5.13.4 特殊文字のエンコーディング

頂点およびエッジ・ファイルのエンコーディングはUTF-8です。表5-8に、頂点またはエッジ・プロパティ(キー値ペア)またはエッジ・ラベルに表示されるときに文字列としてエンコードされる必要のある特殊文字をリストします。その他すべての文字は、エンコーディングは必要ありません。

表5-8 Oracleフラット・ファイル形式での特殊文字コード

特殊文字

文字列のエンコーディング

説明

%

%25

パーセント

\t

%09

タブ

%20

スペース

\n

%0A

改行

\r

%0D

リターン

,

%2C

カンマ

5.13.5 Oracleフラット・ファイル形式でのプロパティ・グラフの例

Oracleフラット・ファイル形式でのプロパティ・グラフの例を次に示します。この例では、2つの頂点(JohnおよびMary)と、JohnがMaryの友人であることを示す単一のエッジがあります。

%cat simple.opv
1,age,2,,10,
1,name,1,John,,
2,name,1,Mary,,
2,hobby,1,soccer,,

%cat simple.ope
100,1,2,friendOf,%20,,,,

5.13.6 Oracle Database表のOracle定義のプロパティ・グラフ・フラット・ファイルへの変換

グラフの頂点およびエッジを表すOracle Database表をOracle定義のフラット・ファイル形式(.opvおよび.opeファイル拡張子)に変換できます。

グラフ・データがOracle Database表に格納されている場合、Java APIメソッドを使用してこのデータをフラット・ファイルに変換し、後で表をプロパティ・グラフとしてOracle Databaseにロードできます。これにより、既存のOracle Database表からフラット・ファイルを生成するために他の手動アプローチを使用する必要がなくなります。

グラフの頂点が格納された表から.opvファイルへの変換

(グラフの頂点として表すことができる)エンティティが含まれるOracle Database表を.opv形式のプロパティ・グラフ・フラット・ファイルに変換できます。

たとえば、EmployeeTab (empID integer not null, hasName varchar(255), hasAge integer, hasSalary number)というリレーショナル表を想定します

この表に次のデータがあるとします。

101, Jean, 20, 120.0
102, Mary, 21, 50.0
103, Jack, 22, 110.0
……

各従業員をグラフ内の頂点として捉えることができます。頂点IDは、employeeID、またはハッシュなどのヒューリスティックを使用して生成されたIDの値である場合があります。列hasName、hasAgeおよびhasSalaryは属性として捉えることができます。

JavaメソッドOraclePropertyGraphUtils.convertRDBMSTable2OPVおよびそのJavadoc情報は、次のとおりです。

/**
* conn: is an connect instance to the Oracle relational database
* rdbmsTableName: name of the RDBMS table to be converted
* vidColName is the name of an column in RDBMS table to be treated as vertex ID
* lVIDOffset is the offset will be applied to the vertex ID
* ctams defines how to map columns in the RDBMS table to the attributes
* dop degree of parallelism
* dcl an instance of DataConverterListener to report the progress and control the behavior when errors happen
*/
OraclePropertyGraphUtils.convertRDBMSTable2OPV(
Connection conn,
String rdbmsTableName,
String vidColName,
long lVIDOffset,
ColumnToAttrMapping[] ctams,
int dop,
OutputStream opvOS,
DataConverterListener dcl);

次のコード・スニペットは、この表をOracle定義の頂点ファイル(.opv)に変換します。

// location of the output file
String opv = "./EmployeeTab.opv";
OutputStream opvOS = new FileOutputStream(opv);
// an array of ColumnToAttrMapping objects; each object defines how to map a column in the RDBMS table to an attribute of the vertex in an Oracle Property Graph.
ColumnToAttrMapping[] ctams = new ColumnToAttrMapping[3];
// map column "hasName" to attribute "name" of type String
ctams[0] = ColumnToAttrMapping.getInstance("hasName", "name", String.class);
// map column "hasAge" to attribute "age" of type Integer
ctams[1] = ColumnToAttrMapping.getInstance("hasAge", "age", Integer.class);
// map column "hasSalary" to attribute "salary" of type Double
ctams[2] = ColumnToAttrMapping.getInstance("hasSalary", "salary",Double.class);
// convert RDBMS table "EmployeeTab" into opv file "./EmployeeTab.opv", column "empID" is the vertex ID column, offset 1000l will be applied to vertex ID, use ctams to map RDBMS columns to attributes, set DOP to 8
OraclePropertyGraphUtils.convertRDBMSTable2OPV(conn, "EmployeeTab", "empID", 1000l, ctams, 8, opvOS, (DataConverterListener) null);

注意:

オフセット値1000l内の最後の文字データ小文字"l"は、その前にある値が長整数であることを示します。

変換結果は次のとおりです。

1101,name,1,Jean,,
1101,age,2,,20,
1101,salary,4,,120.0,
1102,name,1,Mary,,
1102,age,2,,21,
1102,salary,4,,50.0,
1103,name,1,Jack,,
1103,age,2,,22,
1103,salary,4,,110.0,

この場合、表EmployeeTab内の各行は、3つの属性を持つ1つの頂点に変換されます。たとえば、データ"101, Jean, 20, 120.0"は、属性name/"Jean"、age/20、salary/120.0を持つID 1101の頂点に変換されます。オフセット1000lが適用されるため、元のempID 101と頂点ID 1101の間にはオフセットがあります。オフセットは、グラフ要素のID値の競合を回避する上で役に立ちます。

グラフのエッジが格納された表から.opeファイルへの変換

(グラフのエッジとして表すことができる)エンティティ関係が含まれるOracle Database表を.ope形式のプロパティ・グラフ・フラット・ファイルに変換できます。

たとえば、EmpRelationTab (relationID integer not null, source integer not null, destination integer not null, relationType varchar(255), startDate date)というリレーショナル表があると想定します

この表に次のデータがあるとします。

90001, 101, 102, manage, 10-May-2015
90002, 101, 103, manage, 11-Jan-2015
90003, 102, 103, colleague, 11-Jan-2015
……

各リレーション(行)は、グラフ内のエッジとして捉えることができます。特に、エッジIDは、relationID、またはハッシュなどのヒューリスティックを使用して生成されたIDと同じである場合があります。列relationTypeはエッジ・ラベルを定義するために使用でき、列startDateはエッジ属性として扱うことができます。

JavaメソッドOraclePropertyGraphUtils.convertRDBMSTable2OPEおよびそのJavadoc情報は、次のとおりです。

/**
* conn: is an connect instance to the Oracle relational database
* rdbmsTableName: name of the RDBMS table to be converted
* eidColName is the name of an column in RDBMS table to be treated as edge ID
* lEIDOffset is the offset will be applied to the edge ID
* svidColName is the name of an column in RDBMS table to be treated as source vertex ID of the edge
* dvidColName is the name of an column in RDBMS table to be treated as destination vertex ID of the edge
* lVIDOffset is the offset will be applied to the vertex ID
* bHasEdgeLabelCol a Boolean flag represents if the given RDBMS table has a column for edge labels; if true, use value of column elColName as the edge label; otherwise, use the constant string elColName as the edge label
* elColName is the name of an column in RDBMS table to be treated as edge labels
* ctams defines how to map columns in the RDBMS table to the attributes
* dop degree of parallelism
* dcl an instance of DataConverterListener to report the progress and control the behavior when errors happen
*/
OraclePropertyGraphUtils.convertRDBMSTable2OPE(
Connection conn,
String rdbmsTableName,
String eidColName,
long lEIDOffset,
String svidColName,
String dvidColName,
long lVIDOffset,
boolean bHasEdgeLabelCol,
String elColName,
ColumnToAttrMapping[] ctams,
int dop,
OutputStream opeOS,
DataConverterListener dcl);

次のコード・スニペットは、この表をOracle定義のエッジ・ファイル(.ope)に変換します。

// location of the output file
String ope = "./EmpRelationTab.ope";
OutputStream opeOS = new FileOutputStream(ope);
// an array of ColumnToAttrMapping objects; each object defines how to map a column in the RDBMS table to an attribute of the edge in an Oracle Property Graph.
ColumnToAttrMapping[] ctams = new ColumnToAttrMapping[1];
// map column "startDate" to attribute "since" of type Date
ctams[0] = ColumnToAttrMapping.getInstance(“startDate", “since",Date.class);
// convert RDBMS table “EmpRelationTab" into ope file “./EmpRelationTab.opv", column “relationID" is the edge ID column, offset 10000l will be applied to edge ID, the source and destination vertices of the edge are defined by columns “source" and “destination", offset 1000l will be applied to vertex ID, the RDBMS table has an column “relationType" to be treated as edge labels, use ctams to map RDBMS columns to edge attributes, set DOP to 8
OraclePropertyGraphUtils.convertRDBMSTable2OPE(conn, “EmpRelationTab", “relationID", 10000l, “source", “destination", 1000l, true, “relationType", ctams, 8, opeOS, (DataConverterListener) null);

注意:

オフセット値10000l内の最後の文字データ小文字"l"は、その前にある値が長整数であることを示します。

変換結果は次のとおりです。

100001,1101,1102,manage,since,5,,,2015-05-10T00:00:00.000-07:00
100002,1101,1103,manage,since,5,,,2015-01-11T00:00:00.000-07:00
100003,1102,1103,colleague,since,5,,,2015-01-11T00:00:00.000-07:00

この場合、表EmpRelationTab内の各行は、属性sinceを持つ個別エッジに変換されます。たとえば、データ“90001, 101, 102, manage, 10-May-2015"を持つ行は、頂点1101と頂点1102をリンクするID 100001を持つエッジに変換されます。このエッジは、属性since/“2015-05-10T00:00:00.000-07:00"を持ちます。オフセット10000lが適用されるため、元のrelationID “90001"とエッジID “100001"の間にはオフセットがあります。同様に、オフセット1000lがソース頂点IDおよび宛先頂点IDに適用されます。

5.13.7 頂点およびエッジのCSVファイルのOracle定義のプロパティ・グラフ・フラット・ファイルへの変換

一部のアプリケーションでは、CSV (カンマ区切りの値)形式を使用してグラフの頂点およびエッジをエンコードします。この形式では、CSVファイルの各レコードが、単一の頂点またはエッジおよびそのプロパティを表します。グラフの頂点を表すCSVファイルをOracle定義のフラット・ファイル形式定義(頂点を表す.opv、エッジを表す.ope)に変換できます。

変換するCSVファイルには、列が表す属性の列名および型を指定するヘッダー行が含まれる場合があります。ヘッダーに属性名のみが含まれる場合、コンバータでは、値のデータ型が文字列であると見なされます。

CSVをOPVまたはOPEに変換するJava APIは、InputStreamを受け取り、ここから頂点またはエッジを(CSVから)読み込み、これらを.opvまたは.ope形式でOutputStreamに書き込みます。コンバータのAPIを使用して変換プロセスをカスタマイズすることもできます。

次のサブトピックでは、頂点およびエッジの変換の手順を示します。最初の2つの手順は非常に似ていますが、頂点およびエッジに固有の差異があります。

- 頂点: CSVファイルのOracle定義のフラット・ファイル形式(.opv)への変換

- エッジ: CSVファイルのOracle定義のフラット・ファイル形式(.ope)への変換

- 頂点およびエッジ: 頂点とエッジの両方のデータが含まれる単一のCSVファイルのグラフ・フラット・ファイルのペアへの変換

5.13.7.1 頂点: CSVファイルのOracle定義のフラット・ファイル形式(.opv)への変換

CSVファイルにヘッダーが含まれない場合、CSVファイルに表示される順序と同じ順序ですべての属性名(値のデータ型にマップされたもの)が表されたColumnToAttrMapping配列を指定する必要があります。また、頂点のIDなどの特別な列などを含む、CSVファイル内の列全体をこの配列内に記述する必要があります。同じCSVファイルの最初の行内の列にヘッダーを指定するには、このパラメータをnullに設定する必要があります。

頂点を表すCSVファイルを変換するには、convertCSV2OPV APIの1つを使用できます。これらのAPIのうち最も単純なものには、次が必要です。

- CSVファイルから頂点を読み取るInputStream

- 頂点IDを表す列の名前(この列はCSVファイル内に表示される必要があります)

- VIDに追加する整数のオフセット(オフセットはグラフ要素のID値の競合を回避する上で役に立ちます)

- ColumnToAttrMapping配列(ファイル内にヘッダーが指定されている場合、nullである必要があります)

- 並列度(DOP)

- 変換前のオフセット(スキップする頂点レコードの数)を表す整数

- 頂点フラット・ファイル(.opv)の書込み先のOutputStream

- 変換の進捗状況を追跡し、エラーが発生したときに何をすべきか決定するために使用できるオプションのDataConverterListener

追加パラメータを使用して、CSVファイルの異なる形式を指定できます。

- レコード内のトークンを区切るために使用されるデリミタ文字。デフォルトはカンマ文字',’です。

- 文字列値に特殊文字(カンマなど)が含めることができるように文字列値に引用符を付けるために使用する引用符。文字列自体の値に引用符を使用する場合、引用符を複製するか引用符の前にバックスラッシュ文字'\'を配置してエスケープする必要があります。例をいくつか示します。

- "画面に、""Hello, world""と表示され…"

- "しかし、ベーダーは、\"いや、私がお前の父親だ\"と答えた。"

- 日付値を解析するために使用する日付形式。CSV変換の場合、このパラメータはnullにすることができますが、CSVに特定の日付形式が使用されている場合は指定することをお薦めします。特定の日付形式を指定すると、日付値を解析しようとするときにこの形式が最初のオプションとして使用されるため、パフォーマンスが向上します。日付形式の例をいくつか示します。

- "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"

- "MM/dd/yyyy HH:mm:ss"

- "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'"

- "dddd, dd MMMM yyyy hh:mm:ss"

- "yyyy-MM-dd"

- "MM/dd/yyyy"

- CSVファイルに文字列値とともに改行文字が含まれるかどうかを示すフラグ。このパラメータがtrueに設定されている場合、改行または引用符が値として含まれるファイル内のすべての文字列に引用符を付ける必要があります。

- "ドンキホーテの1行目は、""名前は思い出せないが、ラ・マンチャのある村に、""です。"

次のコード・フラグメントは、ColumnToAttrMapping配列を作成し、APIを使用してCSVファイルを.opvファイルに変換する方法を示します。

String inputCSV             = "/path/mygraph-vertices.csv";
String outputOPV            = "/path/mygraph.opv";
ColumnToAttrMapping[] ctams = new ColumnToAttrMapping[4];
ctams[0]                    = ColumnToAttrMapping.getInstance("VID",   Long.class);
ctams[1]                    = ColumnToAttrMapping.getInstance("name",  String.class);
ctams[2]                    = ColumnToAttrMapping.getInstance("score", Double.class);
ctams[3]                    = ColumnToAttrMapping.getInstance("age",   Integer.class);
String vidColumn            = "VID";

isCSV = new FileInputStream(inputCSV);
osOPV = new FileOutputStream(new File(outputOPV));

// Convert Vertices
OraclePropertyGraphUtilsBase.convertCSV2OPV(isCSV, vidColumn, 0, ctams, 1, 0, osOPV, null);
isOPV.close();
osOPV.close();

この例では、変換対象のCSVファイルには、ヘッダーを含めず、4つの列(頂点ID、名前、スコアおよび年齢)を含める必要があります。CVSの例を次に示します。

1,John,4.2,30
2,Mary,4.3,32
3,"Skywalker, Anakin",5.0,46
4,"Darth Vader",5.0,46
5,"Skywalker, Luke",5.0,53

生成される.opvファイルは、次のとおりです。

1,name,1,John,,
1,score,4,,4.2,
1,age,2,,30,
2,name,1,Mary,,
2,score,4,,4.3,
2,age,2,,32,
3,name,1,Skywalker%2C%20Anakin,,
3,score,4,,5.0,
3,age,2,,46,
4,name,1,Darth%20Vader,,
4,score,4,,5.0,
4,age,2,,46,
5,name,1,Skywalker%2C%20Luke,,
5,score,4,,5.0,
5,age,2,,53,

頂点データが含まれるCSVファイルを変換するもう1つの方法は、次の入力引数の1つとしてCSV2OPVConfigオブジェクトを使用するconvertCSV2OPV APIを使用する方法です。

- CSVファイルから頂点を読み取るInputStream

- 構成を指定するCSV2OPVConfigオブジェクト

- 頂点フラット・ファイル(.opv)の書込み先のOutputStream

CSV2OPVConfigクラスには、目的のチューニングに応じて設定できる各種メンバーがあります。これは、各種構成パラメータをすべて使用してconvertCSV2OPV APIを呼び出すことと等価です。

次のコード・フラグメントは、CSV2OPVConfigオブジェクトを作成し、APIを使用してCSVファイルを.opvファイルに変換する方法を示します。

String inputCSV             = "/path/mygraph-vertices.csv";
String outputOPV            = "/path/mygraph.opv";

ColumnToAttrMapping[] ctams = new ColumnToAttrMapping[4];
ctams[0]                    = ColumnToAttrMapping.getInstance("VID",   Long.class);
ctams[1]                    = ColumnToAttrMapping.getInstance("name",  String.class);
ctams[2]                    = ColumnToAttrMapping.getInstance("score", Double.class);
ctams[3]                    = ColumnToAttrMapping.getInstance("age",   Integer.class);

InputStream isCSV = new FileInputStream(inputCSV);
OutputStream osOPV = new FileOutputStream(new File(outputOPV));
CSV2OPVConfig config = (CSV2OPVConfig) new CSV2OPVConfig()
.setVidColumnName("VID")
.setCtams(ctams)
.setAllowExtraFields(false)
.setDelimiterChar(',')
.setQuotationChar('"');

// Convert vertices
OraclePropertyGraphCSVConverter.convertCSV2OPV(isCSV, config, osOPV);
isCSV.close();
osOPV.close();

CSV2OPVConfigにColumnToAttrMapping配列が含まれる場合、ColumnToAttrMapping配列にマッピングがすでに定義されているため、入力CSVにはヘッダーを含めないようにする必要があります。また、setAllowExtraFieldsフラグがCSV2OPVConfig内でfalseに設定されているため、CSVファイル内の列の数がColumnToAttrMapping配列の長さと一致する必要があります(この例では、1つは頂点ID用、2番目は名前用、3番目はスコア用、4番目は年齢用です)。CSVの例を次に示します。

1,John,4.2,30
2,Mary,4.3,32
3,"Skywalker, Anakin",5.0,46
4,"Darth Vader",5.0,46
5,"Skywalker, Luke",5.0,53

生成される.opvファイルは、次のとおりです。

1,name,1,John,,
1,score,4,,4.2,
1,age,2,,30,
2,name,1,Mary,,
2,score,4,,4.3,
2,age,2,,32,
3,name,1,Skywalker%2C%20Anakin,,
3,score,4,,5.0,
3,age,2,,46,
4,name,1,Darth%20Vader,,
4,score,4,,5.0,
4,age,2,,46,
5,name,1,Skywalker%2C%20Luke,,
5,score,4,,5.0,
5,age,2,,53,

5.13.7.2 エッジ: CSVファイルのOracle定義のフラット・ファイル形式(.ope)への変換

CSVファイルにヘッダーが含まれない場合、CSVファイルに表示される順序と同じ順序ですべての属性名(値のデータ型にマップされたもの)が表されたColumnToAttrMapping配列を指定する必要があります。また、CSVファイルの列全体を配列内に記述する必要があり、これには、エッジのID (適用される場合)、および必須のSTART_ID、END_IDおよびTYPEなどが含まれます。同じCSVファイルの最初の行内の列にヘッダーを指定するには、このパラメータをnullに設定する必要があります。

頂点を表すCSVファイルを変換するには、convertCSV2OPE APIの1つを使用できます。これらのAPIのうち最も単純なものには、次が必要です。

- CSVファイルから頂点を読み取るInputStream

- エッジIDを表す列の名前(これは、存在しない場合、CSVファイル内でオプションです。その場合、行番号がIDとして使用されます)

- EIDに追加する整数のオフセット(オフセットはグラフ要素のID値の競合を回避する上で役に立ちます)

- ソース頂点IDを表す列の名前(この列はCSVファイル内に表示される必要があります)

- 宛先頂点IDを表す列の名前(この列はCSVファイル内に表示される必要があります)

- VIDへのオフセット(lOffsetVID)。このオフセットは、元のSVIDおよびDVID値の上に追加されます。(このAPIのバリエーションには、2つの引数(lOffsetSVIDおよびlOffsetDVID)が使用されます。1つはSVIDのオフセット用、もう1つはDVIDのオフセット用です。)

- エッジ・ラベル列がCSVファイル内に存在するかどうかを示すブール・フラグ。

- エッジ・ラベルを表す列の名前(この列がCSVファイル内に存在しない場合、このパラメータがすべてのエッジ・ラベルの定数として使用されます)

- ColumnToAttrMapping配列(ファイル内にヘッダーが指定されている場合、nullである必要があります)

- 並列度(DOP)

- 変換前のオフセット(スキップするエッジ・レコードの数)を表す整数

- エッジ・フラット・ファイル(.ope)の書込み先のOutputStream

- 変換の進捗状況を追跡し、エラーが発生したときに何をすべきか決定するために使用できるオプションのDataConverterListener

追加パラメータを使用して、CSVファイルの異なる形式を指定できます。

- レコード内のトークンを区切るために使用されるデリミタ文字。デフォルトはカンマ文字',’です。

- 文字列値に特殊文字(カンマなど)が含めることができるように文字列値に引用符を付けるために使用する引用符。文字列自体の値に引用符を使用する場合、引用符を複製するか引用符の前にバックスラッシュ文字'\'を配置してエスケープする必要があります。例をいくつか示します。

- "画面に、""Hello, world""と表示され…"

- "しかし、ベーダーは、\"いや、私がお前の父親だ\"と答えた。"

- 日付値を解析するために使用する日付形式。CSV変換の場合、このパラメータはnullにすることができますが、CSVに特定の日付形式が使用されている場合は指定することをお薦めします。特定の日付形式を指定すると、日付値を解析しようとするときにこの形式が最初のオプションとして使用されるため、パフォーマンスが向上します。日付形式の例をいくつか示します。

- "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"

- "MM/dd/yyyy HH:mm:ss"

- "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'"

- "dddd, dd MMMM yyyy hh:mm:ss"

- "yyyy-MM-dd"

- "MM/dd/yyyy"

- CSVファイルに文字列値とともに改行文字が含まれるかどうかを示すフラグ。このパラメータがtrueに設定されている場合、改行または引用符が値として含まれるファイル内のすべての文字列に引用符を付ける必要があります。

- "ドンキホーテの1行目は、""名前は思い出せないが、ラ・マンチャのある村に、""です。"

次のコード・フラグメントは、APIを使用して、nullのColumnToAttrMapping配列を使用してCSVファイルを.opeファイルに変換する方法を示します。

String inputOPE    = "/path/mygraph-edges.csv";
String outputOPE   = "/path/mygraph.ope";
String eidColumn   = null;             // null implies that an integer sequence will be used
String svidColumn  = "START_ID";
String dvidColumn  = "END_ID";
boolean hasLabel   = true;
String labelColumn = "TYPE";

isOPE = new FileInputStream(inputOPE);
osOPE = new FileOutputStream(new File(outputOPE));

// Convert Edges
OraclePropertyGraphUtilsBase.convertCSV2OPE(isOPE, eidColumn, 0, svidColumn, dvidColumn, hasLabel, labelColumn, null, 1, 0, osOPE, null);

変換対象の前の例を使用する入力CSVには、列名およびその型を指定するヘッダーを含める必要があります。CSVファイルの例を次に示します。

START_ID:long,weight:float,END_ID:long,:TYPE
1,1.0,2,loves
1,1.0,5,admires
2,0.9,1,loves
1,0.5,3,likes
2,0.0,4,likes
4,1.0,5,is the dad of
3,1.0,4,turns to
5,1.0,3,saves from the dark side

生成される.opeファイルは、次のとおりです。

1,1,2,loves,weight,3,,1.0,
2,1,5,admires,weight,3,,1.0,
3,2,1,loves,weight,3,,0.9,
4,1,3,likes,weight,3,,0.5,
5,2,4,likes,weight,3,,0.0,
6,4,5,is%20the%20dad%20of,weight,3,,1.0,
7,3,4,turns%20to,weight,3,,1.0,
8,5,3,saves%20from%20the%20dark%20side,weight,3,,1.0,

エッジ・データが含まれるCSVファイルを変換するもう1つの方法は、次の入力引数の1つとしてCSV2OPEConfigオブジェクトを使用するconvertCSV2OPE APIを使用する方法です。

- CSVファイルからエッジを読み取るInputStream

- 構成を指定するCSV2OPVConfigオブジェクト

- エッジ・フラット・ファイル(.opv)の書込み先のOutputStream

CSV2OPEConfigクラスには、目的のチューニングに応じて設定できる各種メンバーがあります。これは、各種構成パラメータをすべて使用してconvertCSV2OPE APIを呼び出すことと等価です。

次のコード・フラグメントは、CSV2OPEConfigオブジェクトを作成し、APIを使用してCSVファイルを.opeファイルに変換する方法を示します。

String inputOPE    = "/path/mygraph-edges.csv";
String outputOPE   = "/path/mygraph.ope";
String eidColumn   = null;             // null implies that an integer sequence will be used
String svidColumn  = "START_ID";
String dvidColumn  = "END_ID";
boolean hasLabel   = true;
String labelColumn = "TYPE";

InputStream isCSV = new FileInputStream(inputOPE);
OutputStream osOPE = new FileOutputStream(new File(outputOPE));
CSV2OPEConfig config = (CSV2OPEConfig) new CSV2OPEConfig()
.setEidColumnName(eidColumn)
.setSvidColumnName(svidColumn)
.setDvidColumnName(dvidColumn)
.setHasEdgeLabelColumn(hasLabel)
.setElColumnName(labelColumn)
.setCtams(null)
.setDelimiterChar(',')
.setQuotationChar('"');

// Convert Edges
OraclePropertyGraphCSVConverter.convertCSV2OPE(isCSV, config, osOPE);
isCSV.close();
osOPE.close();

CSV2OPEConfigにColumnToAttrMapping配列が含まれないか、この配列がnullに設定されている場合、入力CSVには、列名およびデータ型を指定ヘッダーを含める必要があります。CSVファイルの例を次に示します。

START_ID:long,weight:float,END_ID:long,:TYPE
1,1.0,2,loves
1,1.0,5,admires
2,0.9,1,loves
1,0.5,3,likes
2,0.0,4,likes
4,1.0,5,is the dad of
3,1.0,4,turns to
5,1.0,3,saves from the dark side

生成される.opeファイルは、次のとおりです。

1,1,2,loves,weight,3,,1.0,
2,1,5,admires,weight,3,,1.0,
3,2,1,loves,weight,3,,0.9,
4,1,3,likes,weight,3,,0.5,
5,2,4,likes,weight,3,,0.0,
6,4,5,is%20the%20dad%20of,weight,3,,1.0,
7,3,4,turns%20to,weight,3,,1.0,
8,5,3,saves%20from%20the%20dark%20side,weight,3,,1.0,

5.13.7.3 頂点およびエッジ: 頂点とエッジの両方のデータが含まれる単一のCSVファイルのグラフ・フラット・ファイルのペアへの変換

プロパティ・グラフのサポートでは、頂点とエッジの両方のデータが含まれる単一のCSVファイルをグラフ・フラット・ファイルのペアに変換するオプションも用意されています。convertCSV2OPG APIを使用すると、この変更を行うことができ、その入力パラメータは、次のとおりです。

- CSVファイルから頂点およびエッジを読み取るInputStream

- 構成を指定するCSV2OPGConfigオブジェクト

- 頂点フラット・ファイル(.opv)の書込み先のOutputStream

- エッジ・フラット・ファイル(.ope)の書込み先のOutputStream

次のコード・フラグメントは、CSV2OPGConfigオブジェクトを作成し、APIを使用して単一のCSVファイルを.opvおよび.opeファイルに変換する方法を示します。

String inputCSV    = "/path/mygraph.csv";
String outputOPV   = "/path/mygraph.opv";
String outputOPE   = "/path/mygraph.ope";

String eidColumn   = null;             // null implies that an integer sequence will be used
String svidColumn  = "START_ID";
String dvidColumn  = "END_ID";
boolean hasLabel   = true;
String labelColumn = "TYPE";

String[] vertexNames = new String [2];
vertexNames[0] = svidColumn;
vertexNames[1] = dvidColumn;

InputStream isCSV = new FileInputStream(inputOPE);
OutputStream osOPV = new FileOutputStream(new File(outputOPV));
OutputStream osOPE = new FileOutputStream(new File(outputOPE));

CSV2OPGConfig config = (CSV2OPGConfig) new CSV2OPGConfig()
.setVidColumnNames(vertexNames)
.setKeepOriginalID(true)
.setOriginalIDName("myId")
.setEidColumnName(eidColumn)
.setSvidColumnName(svidColumn)
.setDvidColumnName(dvidColumn)
.setHasEdgeLabelColumn(hasLabel)
.setElColumnName(labelColumn)
.setCtams(null)
.setDelimiterChar(',')
.setQuotationChar('"');

// Convert Graph
OraclePropertyGraphCSVConverter.convertCSV2OPG(isCSV, config, osOPV, osOPE);
isCSV.close();
osOPV.close();
osOPE.close();

CSV2OPEConfigにColumnToAttrMapping配列が含まれないか、この配列がnullに設定されている場合、入力CSVには、列名およびデータ型を指定ヘッダーを含める必要があります。CSVファイルの例を次に示します。

START_ID:long,weight:float,END_ID:long,:TYPE
John,1.0,Mary,loves
John,1.0,"Skywalker, Luke",admires
Mary,0.9,John,loves
John,0.5,"Skywalker, Anakin",likes
Mary,0.0,"Darth Vader",likes
"Darth Vader",1.0,"Skywalker, Luke",is the dad of
"Skywalker, Anakin",1.0,"Darth Vader",turns to
"Skywalker, Luke",1.0,"Skywalker, Anakin",saves from the dark side

生成される.opvファイルは、次のとおりです。

-4984830045544402721,myId,1,John,,
6010046165116255926,myId,1,Mary,,
-5861570303285508288,myId,1,Skywalker%2C%20Anakin,,
-6450119557041804291,myId,1,Darth%20Vader,,
3941046021651468440,myId,1,Skywalker%2C%20Luke,,

生成される.opeファイルは、次のとおりです。

1,-4984830045544402721,6010046165116255926,loves,weight,3,,1.0,
2,-4984830045544402721,3941046021651468440,admires,weight,3,,1.0,
3,6010046165116255926,-4984830045544402721,loves,weight,3,,0.9,
4,-4984830045544402721,-5861570303285508288,likes,weight,3,,0.5,
5,6010046165116255926,-6450119557041804291,likes,weight,3,,0.0,
6,-6450119557041804291,3941046021651468440,is%20the%20dad%20of,weight,3,,1.0,
7,-5861570303285508288,-6450119557041804291,turns%20to,weight,3,,1.0,
8, 3941046021651468440,-5861570303285508288,saves%20from%20the%20dark%20side,weight,3,,1.0,

5.14 Pythonユーザー・インタフェースの例

The Oracle Big Data Spatial and Graphのプロパティ・グラフ・サポートには、Pythonユーザー・インタフェースの例が含まれています。これは、様々なプロパティ・グラフ操作を実行するPythonスクリプトおよびモジュールの例のセットを起動できます。

Pythonユーザー・インタフェースの例のインストール手順は、インストール・ホーム(デフォルトでは/opt/oracle/oracle-spatial-graph)の下にある/property_graph/examples/pyopg/READMEファイルにあります。

/property_graph/examples/pyopg/にあるPythonスクリプトの例は、Oracle Spatial and Graphプロパティ・グラフとともに使用でき、ニーズに応じてその例(またはそのコピー)を変更および拡張できます。

例を実行するためにユーザー・インタフェースを起動するには、pyopg.shスクリプトを使用します。

例には次のものが含まれています。

- 例1: Oracle NoSQL Databaseに接続して、頂点およびエッジの数の単純なチェックを実行します。これを実行するには、次のようにします。

cd /opt/oracle/oracle-spatial-graph/property_graph/examples/pyopg
./pyopg.sh

connectONDB("mygraph", "kvstore", "localhost:5000")
print "vertices", countV()
print "edges", countE()

前の例で、mygraphはOracle NoSQL Databaseに格納されているグラフの名前で、kvstoreおよびlocalhost:5000はOracle NoSQL Databaseにアクセスするための接続情報です。これらは環境に応じてカスタマイズする必要があります。

- 例2: Apache HBaseに接続して、頂点およびエッジの数の単純なチェックを実行します。これを実行するには、次のようにします。

cd /opt/oracle/oracle-spatial-graph/property_graph/examples/pyopg
./pyopg.sh

connectHBase("mygraph", "localhost", "2181")
print "vertices", countV()
print "edges", countE()

前の例で、mygraphはApache HBaseに格納されているグラフの名前で、localhostおよび2181はApache HBaseにアクセスするための接続情報です。これらは環境に応じてカスタマイズする必要があります。

- 例3: Oracle NoSQL Databaseに接続していくつかの分析機能を実行します。これを実行するには、次のようにします。

cd /opt/oracle/oracle-spatial-graph/property_graph/examples/pyopg
./pyopg.sh

connectONDB("mygraph", "kvstore", "localhost:5000")
print "vertices", countV()
print "edges", countE()

import pprint

analyzer = analyst()
print "# triangles in the graph", analyzer.countTriangles()

graph_communities = [{"commid":i.getName(),"size":i.size()} for i in analyzer.communities().iterator()]

import pandas as pd
import numpy as np

community_frame = pd.DataFrame(graph_communities)
community_frame[:5]

import matplotlib as mpl
import matplotlib.pyplot as plt

fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(16,12));
community_frame["size"].plot(kind="bar", title="Communities and Sizes")
ax.set_xticklabels(community_frame.index);
plt.show()

前の例は、Oracle NoSQL Databaseに接続し、頂点およびエッジに関する基本情報を出力し、インメモリー・アナリストを取得し、トライアングル数を計算し、コミュニティ検出を実行して、最後にコミュニティとそのサイズを棒グラフに表します。

- 例4: Apache HBaseに接続していくつかの分析機能を実行します。これを実行するには、次のようにします。

cd /opt/oracle/oracle-spatial-graph/property_graph/examples/pyopg
./pyopg.sh

connectHBase("mygraph", "localhost", "2181")
print "vertices", countV()
print "edges", countE()

import pprint

analyzer = analyst()
print "# triangles in the graph", analyzer.countTriangles()

graph_communities = [{"commid":i.getName(),"size":i.size()} for i in analyzer.communities().iterator()]
import pandas as pd
import numpy as np
community_frame = pd.DataFrame(graph_communities)
community_frame[:5]

import matplotlib as mpl
import matplotlib.pyplot as plt

fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(16,12));
community_frame["size"].plot(kind="bar", title="Communities and Sizes")
ax.set_xticklabels(community_frame.index);
plt.show()

前の例は、Apache HBaseに接続し、頂点およびエッジに関する基本情報を出力し、インメモリー・アナリストを取得し、トライアングル数を計算し、コミュニティ検出を実行して、最後にコミュニティとそのサイズを棒グラフに表します。

Pythonインタフェースの例の詳細は、インストール・ホームの下にある次のディレクトリを参照してください。

property_graph/examples/pyopg/doc/

5.15 iPython Notebookユーザー・インタフェースの例

主なプロパティ・グラフ機能に対する次のタイプのiPython Notebookシェル・インタフェースのサポートが提供されています。

iPython Notebookは、プロパティ・グラフに基づいてワークフローまたはデモを構築するのに便利なツールです。このトピックでは、iPython Notebookベースのプロパティ・グラフ・ワークフローに視覚化を追加する方法について説明します。

iPython Notebookのインストール手順は、インストール・ホーム(デフォルトでは/opt/oracle/oracle-spatial-graph)の下にある/property_graph/examples/pyopg/READMEファイルにあります。

iPython Notebookをインストールしたら、コード・スニペットをiPythonノートブックにコピーおよび貼付けできます。

開始するには次の手順に従います。

1. 必要なライブラリをいくつか選択してインポートします。次に例を示します。

import matplotlib as mpl
import matplotlib.pyplot as plt
import sys
default_stdout = sys.stdout
default_stderr = sys.stderr
reload(sys)
sys.setdefaultencoding("utf-8")
sys.stdout = default_stdout
sys.stderr = default_stderr
from pyopg.core import *
pgx_config = JPackage('oracle.pgx.config')
pgx_types = JPackage('oracle.pgx.common.types')
pgx_control = JPackage('oracle.pgx.api')
hbase = JPackage('oracle.pg.hbase')

2. グラフ構成を作成します。次に例を示します。

graph_builder = pgx_config.GraphConfigBuilder.forPropertyGraphHbase() \
.setName("my_graph").setZkQuorum("hostname1").setZkClientPort(2181) \
.setZkSessionTimeout(120000).setInitialEdgeNumRegions(3) \
.setInitialVertexNumRegions(3).setSplitsPerRegion(1)
graph_builder.addEdgeProperty("weight", pgx_types.PropertyType.DOUBLE, "1000000")

3. グラフをインメモリー・アナリストに読み込みます。次に例を示します。

opg = hbase.OraclePropertyGraph.getInstance(graph_builder.build())
pgx_param = JClass("java.util.HashMap")()
instance = JClass("oracle.pgx.api.Pgx").getInstance()
if not instance.isEngineRunning():instance.startEngine(pgx_param)
session = instance.createSession("my_recommender_session1")
analyst = session.createAnalyst()
pgxGraph = session.readGraphWithProperties(opg.getConfig(), True)
pgxGraph.getNumEdges()

4. (オプション)いくつかの頂点を読み出します。次に例を示します。

for element in range(1,10,1):
vertex = opg.getVertex(element)
print 'Vertex ID: ' + str(element) + ' - Name: ' + vertex.getProperty("name")
#Vertex ID: 1 - Name: Barack Obama
#Vertex ID: 2 - Name: Beyonce
#...

5. 視覚化するエッジ(および頂点)からJSONオブジェクト(ノード、リンク)を作成します。次に例を示します。

# Get Edges
edges = opg.getEdges().iterator();
edge = edges.next()
# Dictiony for Nodes and Links
nodes = []
links = []
names = []
sources = []
targets = []
values = []
# Get Nodes
for count in range(1,20,1):
# Vertex Values
outVertexName = edge.getOutVertex().getProperty("name")
outVertexRole = edge.getOutVertex().getProperty("country")
inVertexName = edge.getInVertex().getProperty("name")
inVertexRole = edge.getInVertex().getProperty("country")
# Add out Vertex
if {"name": outVertexName, "group": outVertexRole} not in nodes:
nodes.append({"name": outVertexName, "group": outVertexRole})
names.append(outVertexName)
# Add in Vertex
if {"name": inVertexName, "group": inVertexRole} not in nodes:
nodes.append({"name": inVertexName, "group": inVertexRole})
names.append(inVertexName)
# Edge Information
sources.append(outVertexName)
targets.append(inVertexName)
values.append(edge.getLabel())
# Next Edge
edge = edges.next()
# Get Links
for count in range(0,19,1):
# Vertex Values
outVertexName = sources[count]
inVertexName = targets[count]
# Edge Values
source = names.index(outVertexName)
target = names.index(inVertexName)
value = values[count]
links.append({"source": source, "target": target, "value": value})

from IPython.display import Javascript
import json
# Transform the graph into a JSON graph
data = {"nodes":nodes, "links":links}
jsonGraph = json.dumps(data, indent=4)
# Send to Javascript
Javascript("""window.jsonGraph={};""".format(jsonGraph))

6. グラフ描画用の<div>...</div>を設定します。次に例を示します。

%%html
<div id="d3-example"></div>
<style>
.node {stroke: #fff; stroke-width: 1.5px;}
.link {stroke: #999; stroke-opacity: 5.6;}
</style>

7. D3力指向レイアウトでグラフ処理を実行します。次に例を示します。

%%javascript
// We load the d3.js library from the Web.
require.config({paths: {d3: "http://d3js.org/d3.v3.min"}});
require(["d3"], function(d3) {
// The code in this block is executed when the
// d3.js library has been loaded.
// First, we specify the size of the canvas containing
// the visualization (size of the <div> element).
var width = 800,  height = 600;
// We create a color scale.
var color = d3.scale.category20();
// We create a force-directed dynamic graph layout.
var force = d3.layout.force().charge(-300).linkDistance(100).size([width, height]);
// In the <div> element, we create a <svg> graphic
// that will contain our interactive visualization.
var svg = d3.select("#d3-example").select("svg")
if (svg.empty()) {
svg = d3.select("#d3-example").append("svg").attr("width", width).attr("height", height);
}
// We load the JSON graph we generated from iPython input
var graph = window.jsonGraph;
plotGraph(graph);
// Graph Plot function
function plotGraph(graph) {
// We load the nodes and links in the force-directed graph.
force.nodes(graph.nodes).links(graph.links).start();
// We create a <line> SVG element for each link in the graph.
var link =
svg.selectAll(".link").data(graph.links).enter().append("line").attr("class",
"link").attr("stroke-width", 7);
// Link Value
link.append("title").text(function(d) {
return d.value;
});
// We create a <circle> SVG element for each node
// in the graph, and we specify a few attributes.
var node =
svg.selectAll(".node").data(graph.nodes).enter().append("circle").attr("class",
"node").attr("r", 16)  //radius
.style("fill", function(d) {
// The node color depends on the club.
return color(d.group);
}).call(force.drag);
// The name of each node is the node number.
node.append("title").text(function(d) {
var info = "Name: " + d.name + "\n" + "Country: " + d.group;
return info;
});
// Text Over Nodes
var text = svg.append("g").selectAll("text").data(force.nodes()).enter().append("text").attr("x", function(d) {
return -10
}).attr("y", 0).style("font-size","10px").text(function(d) {
if (d.name.length > 15) {
return d.name.substring(0, 15) + "...";
}
return d.name;
});
// We bind the positions of the SVG elements
// to the positions of the dynamic force-directed graph,
// at each time step.
force.on("tick", function() {
link.attr("x1", function(d) {
return d.source.x;
}).attr("y1", function(d) {
return d.source.y;
}).attr("x2", function(d) {
return d.target.x;
}).attr("y2", function(d) {
return d.target.y;
});
node.attr("cx", function(d) {
return d.x;
}).attr("cy", function(d) {
return d.y;
});
text.attr("transform", function(d) {
return "translate(" + d.x + "," + d.y + ")";
});
});
}
});

前述のすべての手順を実行した場合、次のようなイメージがHTML領域に表示されます。

図5-3 iPython Notebookから生成されるイメージの例

6 インメモリー・アナリスト(PGX)の使用

Oracle Spatial and Graphのインメモリー・アナリスト機能は、一連の分析機能をサポートしています。

この章では、インメモリー・アナリストを使用する例について説明します(プロパティ・グラフ・インメモリー分析とも呼ばれ、Javadoc、コマンドライン、パスの説明、エラー・メッセージなどではPGXと省略されます)。主なトピックは次のとおりです。

- グラフのメモリーへの読込み
このトピックでは、シェル・インタフェースを使用したメモリーへの対話によるグラフの読込みの例について説明します。

- インメモリー・アナリストの構成
起動時にインメモリー・アナリストに単一のJSONファイルを割り当てることにより、インメモリー・アナリスト・エンジンおよびそのランタイム動作を構成できます。

- カスタム・グラフ・データの読取り
ユーザー独自のカスタム・グラフ・データを読み取ることができます。この例では、グラフを作成し、それを変更して正しく読み取る方法を表示します。

- グラフ・データのディスクへの格納
グラフはJavaまたはシェルを使用してメモリーに読み込んだ後、別の形式でディスクに格納できます。格納したグラフ・データは、後でインメモリー・アナリストへの入力として使用できます。

- 組込みアルゴリズムの実行
インメモリー・アナリストには、一連の組込みアルゴリズムが含まれており、Java APIとして使用できます。

- サブグラフの作成
メモリーにロードされたグラフに基づいてサブグラフを作成できます。

- グラフを使用したパターンマッチング問合せの使用
インメモリー・グラフに対してパターンマッチング問合せを発行してから、その問合せの結果を操作できます。

- インメモリー・アナリスト・サーバーの起動
Big Data Spatial and Graphには、スクリプトの実行によってインメモリー・アナリスト・サーバーを起動できるApache Tomcatの事前構成済バージョンがバンドルされています。

- Jettyへのデプロイ
インメモリー・アナリストは、Eclipse Jetty、Apache Tomcat、またはOracle WebLogic Serverにデプロイできます。この例では、Webアプリケーションとしてインメモリー・アナリストをEclipse Jettyにデプロイする方法を示しています。

- Jettyへのデプロイ
インメモリー・アナリストは、Eclipse Jetty、Apache Tomcat、またはOracle WebLogicにデプロイできます。この例では、Webアプリケーションとしてインメモリー・アナリストをApache Tomcatにデプロイする方法を示しています。

- Oracle WebLogic Serverへのデプロイ
インメモリー・アナリストは、Eclipse Jetty、Apache Tomcat、またはOracle WebLogic Serverにデプロイできます。この例では、Webアプリケーションとしてインメモリー・アナリストをOracle WebLogic Serverにデプロイする方法を示しています。

- インメモリー・アナリスト・サーバーへの接続
プロパティ・グラフのインメモリー・アナリストがサーバーとしてデプロイされ、Hadoopクラスタ(またはEclipse Jetty、Apache Tomcat、Oracle WebLogic上のWebアプリケーションとしてHadoopのないクライアント・システム)にインストールされた後、インメモリー・アナリスト・サーバーに接続できます。

- 分散モードのインメモリー・アナリストの使用
インメモリー・アナリストは、共有メモリー・モードまたは分散モードで実行できます。

- HDFSでのデータの読取りおよび格納
インメモリー・アナリストは、Hadoop Distributed File System (HDFS)をサポートしています。この例では、インメモリー・アナリストAPIを使用してHDFSのグラフ・データを読み取り、アクセスする方法を示しています。

- YARNアプリケーションとしてのインメモリー・アナリストの実行
この例では、Hadoop NextGen MapReduce (YARN)スケジューリングにより、Hadoopクラスタ上でインメモリー・アナリスト・サーバーを開始、停止および監視する方法について説明します。

- Oracleの2つの表関係形式の使用
リレーショナル・データ・モデルを使用する場合、グラフ・データは2つのリレーショナル表を使用して表現できます。1つの表はノードとそのプロパティ用で、もう1つの表はエッジとそのプロパティ用です。

- インメモリー・アナリストを使用したApache Spark内のグラフ・データの分析
Oracle Big Data Spatial and Graphのプロパティ・グラフ機能を使用すると、インメモリー分析とApache Sparkを統合できます。

- インメモリー・アナリストZeppelinインタプリタの使用
インメモリー・アナリストには、Apache Zeppelinのインタプリタ実装が用意されています。このチュートリアルのトピックでは、ローカルのZeppelinインストールにインメモリー・アナリスト・インタプリタをインストールし、いくつかの簡単な操作を実行する方法について説明します。

- インメモリー・アナリスト・エンタープライズ・スケジューラの使用
インメモリー・アナリスト・エンタープライズ・スケジューラには、高度なスケジューリング機能が用意されています。

6.1 グラフのメモリーへの読込み

このトピックでは、シェル・インタフェースを使用したメモリーへの対話によるグラフの読込みの例について説明します。

主な手順は次のとおりです。

- インメモリー・アナリスト・サーバー・インスタンスへの接続

- シェル・ヘルプの使用

- 構成ファイルでのグラフ・メタデータの指定

- グラフ・データのメモリーへの読込み

6.1.1 インメモリー・アナリスト・サーバー・インスタンスへの接続

インメモリー・アナリストを起動する手順:

1. プロパティ・グラフのサポートがインストールされているシステムで端末セッションを開始します。

2. シェルでは、次のコマンドを入力しますが、開始コマンド、または必要なインスタンスのタイプへの接続コマンドのいずれか一方を選択します。

cd $PGX_HOME
./bin/pgx --help
./bin/pgx --version

# start embedded shell
./bin/pgx

# start remote shell
./bin/pgx --base_url http://my-server.com:8080/pgx

埋込みシェルの場合、出力は次のようになります。

10:43:46,666 [main] INFO Ctrl$2 - >>> PGX engine running.
pgx>

3. オプションで、事前定義されている変数も表示します。

pgx> instance
==> ServerInstance[embedded=true]
pgx> session
==> PgxSession[ID=ab9bdc1d-3401-460c-b1cf-5ef97ec5c5f9,source=pgxShell]
pgx> analyst
==> NamedArgumentAnalyst[session=ab9bdc1d-3401-460c-b1cf-5ef97ec5c5f9]
pgx>

その他のトピックの例では、インスタンスおよびセッション変数は、ここで示すとおり設定されるとみなされます。

インメモリー・アナリスト・ソフトウェアが正しくインストールされている場合、エンジン実行ログ・メッセージとインメモリー・アナリスト・シェル・プロンプト(pgx>)が表示されます。

変数instance、session、およびanalystが使用可能です。

このトピックの前の例では、pgxコマンドでリモートURLを指定していないため、シェルがローカル・インスタンスを開始します。

6.1.2 シェル・ヘルプの使用

インメモリー・アナリスト・シェルには、:helpコマンドを使用してアクセスできるヘルプ・システムが用意されています。

6.1.3 構成ファイルでのグラフ・メタデータの指定

/opt/oracle/oracle-spatial-graph/property_graph/examples/pgx/graphs/のインストール・ディレクトリにグラフの例が含まれています。ここでは、インメモリー・アナリストがグラフを読み取る方法を説明する構成ファイルを使用します。

pgx> cat /opt/oracle/oracle-spatial-graph/property_graph/examples/pgx/graphs/sample.adj.json
===> {
"uri": "sample.adj",
"format": "adj_list",
"node_props": [{
"name": "prop",
"type": "integer"
}],
"edge_props": [{
"name": "cost",
"type": "double"
}],
"separator": " "
}

uriフィールドには、グラフ・データの場所を指定します。このパスは構成ファイルの親ディレクトリに対して相対的に解決します。インメモリー・アナリストがグラフをロードするとき、sample.adjという名のファイルのexamples/graphsディレクトリが検索されます。

その他のフィールドは、グラフ・データが隣接するリスト形式で提供され、integer型のノード・プロパティとdouble型のエッジ・プロパティで構成されていることを示します。

これは隣接するリスト形式のグラフ・データです。

pgx> cat /opt/oracle/oracle-spatial-graph/property_graph/examples/pgx/graphs/sample.adj
===> 128 10 1908 27.03 99 8.51
99 2 333 338.0
1908 889
333 6 128 51.09

図6-1は、データから作成されたプロパティ・グラフを示します。

図6-1 sample.adjデータからレンダリングされたプロパティ・グラフ

6.1.4 グラフ・データのメモリーへの読込み

グラフをメモリーに読み込むには、次の情報を渡す必要があります。

- グラフのメタデータを指定するグラフ構成ファイルへのパス

- グラフへの参照に使用できる一意の英数字名
同じ名前で別のグラフをすでにロードしている場合は、エラーが発生します。

ファイルへのパスを指定する手順:

- 頂点およびエッジが1つのファイルに指定されている場合、uriを使用します。

{ "uri": "path/to/file.format", ...}

- 複数のファイル(ADJ_LIST、EDGE_LISTなど)を指定するには、urisを使用します。

{ "uris": ["file1.format", "file2.format"] ...}

ほとんどのプレーン・テキスト形式は、3つのインメモリー・アナリストによって並列で解析できます。

- 頂点またはエッジ(FLAT_FILE、TWO_TABLESなど)が含まれるかどうかに応じてファイル形式が異なる場合は、vertex_urisおよびedge_urisを使用します。

{ "vertex_uris": ["vertices1.format", "vertices2.format"], "edge_uris": ["edges1.format", "edges2.format"] ...}

サポートされているファイル・システム

インメモリー・アナリストは、様々なプロトコルおよび仮想ファイル・システムを介したグラフ構成ファイルおよびグラフ・データ・ファイルからのロードをサポートしています。ファイル・システムまたはプロトコルのタイプは、Uniform Resource Identifier (URI)のスキームによって決まります。

- ローカル・ファイル・システム(file:)。特定のURIにスキームが含まれていない場合、これがデフォルトにもなります。

- クラスパス(classpath:またはres:)

- HDFS (hdfs:)

- HTTP (http:またはhttps:)

- 様々なアーカイブ形式(zip:、jar:、tar:、tgz:、tbz2:、gz:およびbz2:)
URI形式は、scheme://arch-file-uri[!absolute-path]です。例: jar:../lib/classes.jar!/META-INF/graph.json

パスはネストしている場合があります。例: tar:gz:http://anyhost/dir/mytar.tar.gz!/mytar.tar!/path/in/tar/graph.data

感嘆符(!)をリテラルのファイル名文字として使用するには、%21;を使用してエスケープする必要があります

相対パスは常に、構成ファイルの親ディレクトリに対して相対的に解決されます。

例: シェルを使用したグラフの読取り

pgx> graph = session.readGraphWithProperties("/opt/oracle/oracle-spatial-graph/property_graph/examples/pgx/graphs/sample.adj.json", "sample");
==> PgxGraph[name=sample,N=4,E=4,created=1476225669037]
pgx> graph.getNumVertices()
==> 4

例: Javaを使用したグラフの読取り

import oracle.pgx.api.*;

ServerInstance instance = Pgx.getInstance(Pgx.EMBEDDED_URL);
// ServerInstance instance = Pgx.getInstance("http://my-server:7007"); // remote instance
PgxSession session = instance.createSession("my-session");
PgxGraph graph = session.readGraphWithProperties("/opt/oracle/oracle-spatial-graph/property_graph/examples/pgx/graphs/sample.adj.json");

例: JavaScriptを使用したグラフの読取り

const pgx = require('oracle-pgx-client');
let p = pgx.connect("http://my-server:7007");
let json = {
"uri": "sample.adj",
"format": "adj_list",
"node_props": [{
"name": "prop",
"type": "integer"
}],
"edge_props": [{
"name": "cost",
"type": "double"
}],
"separator": " "
}

p.then(function(session) {
return session.readGraphWithProperties(json);
}).then(function(graph) {
// do something with graph
});

次のトピックでは、プロパティ・グラフをメモリーに読み込むその他の例について説明します。

- Apache HBaseに格納されているグラフのメモリーへの読込み

- Oracle NoSQL Databaseに格納されているグラフのメモリーへの読込み

- ローカル・ファイル・システムに格納されているグラフのメモリーへの読込み

6.1.4.1 Apache HBaseに格納されているグラフのメモリーへの読込み

Apache HBaseに格納されているプロパティ・グラフを読み取るには、次のようにJSONベースの構成ファイルを作成できます。定数、クライアント・ポート、グラフ名、およびその他の情報は、ユーザーの設定に応じてカスタマイズする必要があります。

% cat /tmp/my_graph_hbase.json
{
"format": "pg",
"db_engine": "hbase",
"zk_quorum": "scaj31bda07,scaj31bda08,scaj31bda09",
"zk_client_port": 2181,
"name": "connections",
"node_props": [{
"name": "country",
"type": "string"
}],

"edge_props": [{
"name": "label",
"type": "string"
}, {
"name": "weight",
"type": "float"
}],
"loading": {
"load_edge_label": true
}
}
EOF

次のコマンドを使用すると、プロパティ・グラフconnectionsがメモリーに読み込まれます。

pgx> session.readGraphWithProperties("/tmp/my_graph_hbase.json", "connections")
==> PGX Graph named connections ...

大きいサイズのグラフを扱う場合は、IOワーカー、分析対象のワーカー数、タスクのタイムアウトなどのパラメータを調整する必要があります。「インメモリー・アナリストの構成」を参照してください。

6.1.4.2 Oracle NoSQL Databaseに格納されているグラフのメモリーへの読込み

Oracle NoSQL Databaseに格納されているプロパティ・グラフを読み取るには、次のようにJSONベースの構成ファイルを作成できます。ホスト、ストア名、グラフ名、およびその他の情報は、ユーザーの設定に応じてカスタマイズする必要があります。

% cat /tmp/my_graph_nosql.json
{
"format": "pg",
"db_engine": "nosql",
"hosts": [
"zathras01:5000"
],
"store_name": "kvstore",
"name": "connections",
"node_props": [{
"name": "country",
"type": "string"
}],
"loading": {
"load_edge_label": true
},
"edge_props": [{
"name": "label",
"type": "string"
}, {
"name": "weight",
"type": "float"
}]
}

次に、構成ファイルをメモリーに読み込みます。次の例では、スニペットがファイルをメモリーに読み込み、方向のないグラフ(名称U)を元のデータから生成し、三角形の数をカウントします。

pgx> g = session.readGraphWithProperties("/tmp/my_graph_nosql.json", "connections")
pgx> analyst.countTriangles(g, false)
==> 8

6.1.4.3 ローカル・ファイル・システムに格納されているグラフのメモリーへの読込み

次のコマンドでは、「構成ファイルでのグラフ・メタデータの指定」の構成ファイルおよびmy-graphという名前を使用します。

pgx> g = session.readGraphWithProperties("/opt/oracle/oracle-spatial-graph/property_graph/examples/pgx/graphs/sample.adj.json", "my-graph")

6.2 インメモリー・アナリストの構成

起動時にインメモリー・アナリストに単一のJSONファイルを割り当てることにより、インメモリー・アナリスト・エンジンおよびそのランタイム動作を構成できます。

このファイルには、次の表に示すパラメータを含めることができます。一部の例はこの表に従います。

構成ファイルを指定するには、「インメモリー・アナリストの構成ファイルの指定」を参照してください。

注意:

- パラメータ値の相対パスは常に、指定先の構成ファイルに対して相対的に解決されます。たとえば、構成ファイルが/pgx/conf/pgx.confであり、パラメータ値内のファイルがgraph-configs/my-graph.bin.jsonとして指定されている場合、ファイル・パスは/pgx/conf/graph-configs/my-graph.bin.jsonに解決されます。

- パラメータのデフォルト値は、一連の広範なアルゴリズム全体にわたって最善のパフォーマンスを実現できるよう最適化されます。ワークロードに応じて、様々な戦略、サイズおよびしきい値を使用して試験することにより、パフォーマンスをさらに改善できる場合があります。

表6-1 インメモリー・アナリストの構成パラメータ

パラメータ

型

説明

デフォルト

admin_request_cache_timeout

integer

管理要求結果がキャッシュから削除されるまでの秒数。実行されていないかまだ使用されていない要求は、このタイムアウトから除外されます。注意: これが関連するのは、PGXがWebアプリケーションとしてデプロイされている場合のみです。

60

allow_idle_timeout_overwrite

boolean

trueの場合、セッションによってデフォルトのアイドル・タイムアウトを上書きできます。

true

allow_local_filesystem

boolean

(このフラグを使用すると、セキュリティが弱体化するため、作業の影響を把握している場合のみ使用してください。)クライアント/サーバー・モードである場合、ローカル・ファイル・システムからのロードを可能にします。警告: これを有効にするのは、PGXリモート・インタフェースのユーザーがローカル・ファイル・システム上のファイルにアクセスするのを明示的に許可する場合のみにする必要があります。

false

allow_task_timeout_overwrite

boolean

trueの場合、セッションによってデフォルトのタスク・タイムアウトを上書きできます

true

allow_user_auto_refresh

boolean

trueの場合、ユーザーがロードするグラフを自動リフレッシュできます。falseの場合、graphsに記述されているグラフのみに対して自動リフレッシュを有効にできます。

false

bfs_iterate_que_task_size

integer

BFS反復QUEフェーズのタスク・サイズ。

128

bfs_threshold_read_based

integer

BFSトラバース・レベル・アイテムを読取りベースのアクセス戦略に切り替える際のしきい値。

1024

bfs_threshold_single_threaded

integer

BFSトラバース・レベル・アイテムの頂点が単一スレッドでアクセスされる数のしきい値。

128

cctrace

boolean

trueの場合、すべての呼出しを制御またはコア・インタフェースに記録します。

false

cctrace_out

string

[cctraceに関連]cctraceが有効である場合、cctraceの記録先のファイルへのパスを指定します。nullの場合、stderrに記録されます。特別な値:log:である場合、デフォルトのPGXロギング・ファシリティが使用されます

null

character_set

string

PGX全体にわたって使用する標準文字セット。UTF-8がデフォルトです。注意: 一部の機能には互換性がない場合があります。

utf-8

cni_diff_factor_default

integer

一般的な近傍イテレータ実装で使用されるデフォルトの差異係数値。

8

cni_small_default

integer

一般的な近傍イテレータ実装で使用されるデフォルト値で、このしきい値を下回ると、部分配列が小さいと見なされることを示します。

128

cni_stop_recursion_default

integer

一般的な近傍イテレータ実装で使用されるデフォルト値で、バイナリ検索アプローチが適用される最小サイズを示します。

96

dfs_threshold_large

integer

DFS実装が多数の頂点に対して最適化されたデータ構造に切り替わるまでにどれくらいの数の頂点がアクセスされる必要があるかを決める値。

4096

enable_csrf_token_checks

boolean

trueの場合、PGX Webアプリケーションは、クライアントから送信された要求パラメータとクロスサイト・リクエスト・フォージェリ(CSRF)トークンCookieが存在して一致するかどうかを検証します。これは、CSRF攻撃を防止することが目的です。

true

enable_solaris_studio_labeling

boolean

[solaris studioを使用してプロファイリングする場合に関連]有効である場合、'er_label'コマンドを使用して試験にラベルが付けられます。

false

explicit_spin_locks

boolean

trueは、ロックが使用可能になるまでループ内で明示的にスピンすることを意味します。falseは、コンテキストを切り替えるかスピンするかを決定するためにJVMに依存するJDKロック・キーを使用することを意味します。通常、この値をtrueに設定した方がパフォーマンスが向上します。

true

graphs

stringの配列

起動時に登録するグラフ構成へのパスのリスト。

[]

max_active_sessions

integer

一度に有効することが許可されたセッションの最大数。

1024

max_off_heap_size

integer

OutOfMemoryErrorがスローされるまでにPGXが割り当てることが許可されたオフピーク・メモリーの最大量(メガバイト単位)。注意: この制限は、丸めおよび同期のトレードオフのため、絶対に超えないことが保証されるわけではありません。これは、PGXが新しいメモリー割当て要求を拒否し始めた際のしきい値としてのみ機能します。

<使用可能な物理メモリー>

max_queue_size_per_session

integer

セッションごとにキューに入れておくことが許可された保留タスクの最大数。セッションが最大に達すると、新しく受け取ったそのセッションの要求が拒否されます。マイナスの値は、制限がないことを意味します。

-1

max_snapshot_count

integer

同時にエンジンにロードすることが可能なスナップショットの数。新しいスナップショットは、自動更新または強制更新を介して作成できます。グラフのスナップショットの数がこのしきい値に達した場合、これ以上の自動更新は実行されなくなり、1つ以上のスナップショットがメモリーから削除されるまでは、強制更新を実行すると例外が発生します。値がゼロの場合、無制限の数のスナップショットをサポートすることを示します。

0

memory_cleanup_interval

integer

メモリーのクリーンアップ間隔(秒単位)。

600

ms_bfs_frontier_type_strategy

enum[auto_grow, short, int]

MS-BFSフロンティアに使用するタイプの戦略。

auto_grow

num_spin_locks

integer

生成された各アプリケーションがインストールを作成するスピン・ロックの数。トレードオフ: 数が小さい場合、メモリーの消費量が小さいことを意味し、数が大きい場合、実行処理が速くなることを意味します(アルゴリズムにスピン・ロックが使用されている場合)。

1024

num_workers_analysis

integer

分析タスクに使用するワーカー・スレッドの数。

<no-of-cpus>

num_workers_fast_track_analysis

integer

高速分析タスクに使用するワーカー・スレッドの数。

1

num_workers_io

integer

I/Oタスク(ロード/リフレッシュ/ディスクへの/からの読込み)タスクに使用するワーカー・スレッドの数。ファイルベースのローダーは常に単一スレッドであるため、この値はこれらには影響しません。データベース・ローダーは、I/Oワーカーごとに新しい接続を開きます。

<no-of-cpus>

pattern_matching_semantic

enum[isomorphism, homomorphism]

グラフ・パターン一致セマンティックで、homomorphismまたはisomorphismのどちらかです。

homomorphism

parallelization_strategy

enum[segmented, task_stealing, task_stealing_counted, rts]

使用するパラレル化戦略:segmented = ワークをセグメントに分割し、セグメントごとに1つのスレッドを使用します。task_stealing = 再帰アクションを使用したF/Jプール。task_stealing_counted = 結合を削減するためにカウントされたコンプリータを使用したF/Jプール。 rts = 試験的ランタイム・システム。

task_stealing_counted

random_generator_strategy

enum[non_deterministic, deterministic]

インメモリー・アナリストでランダム数を生成するためのメソッド。

non_deterministic

random_seed

long

[deterministicランダム数ジェネレータのみに関連]インメモリー・アナリストで使用されるdeterministicランダム数ジェネレータのシード。デフォルトは-24466691093057031です。

-24466691093057031

release_memory_threshold

number

エンジンが未使用のグラフを解放するまでの使用済メモリーのしきい値パーセンテージ(小数)。例: 値が0.0である場合、グラフは参照数がゼロになると同時に解放されることを意味します。つまり、そのグラフをロードしたすべてのセッションが破棄されます/タイムアウトします。値が1.0である場合、グラフは一切解放されず、メモリーに収まらないグラフが必要になると同時にOutOfMemoryErrorsがスローされます。値が0.7である場合、メモリー内のグラフを現在使用しているセッションがない場合でも、メモリー消費量の合計が使用可能なメモリー合計の70%を下回っている限り、これらのグラフがすべて保持されます。消費量が70%を超えているときに別のグラフをロードする必要がある場合、メモリー消費量が再度70%を下回るまで未使用のグラフが解放されます。

0.85

session_idle_timeout_secs

integer

アイドル中のセッションのタイムアウト(秒単位)。ゼロ(0)は、タイムアウトが行われないことを意味します。

0

session_task_timeout_secs

integer

セッション(アルゴリズム、I/Oタスク)によって発行された長時間のタスクを中断までのタイムアウト(秒単位)。ゼロ(0)は、タイムアウトが行われないことを意味します。

0

small_task_length

integer

ワークの合計量がデフォルトのタスクの長さより小さい場合のタスクの長さ(タスク・スティーリング戦略の場合のみ関連)。

128

spark_streams_interface

string

Sparkデータ通信にはインタフェースの名前が使用されます。

null

strict_mode

boolean

trueの場合、無効なキー、不一致、および他の潜在的なエラーなどの構成問題が発生した場合は常に例外がスローされ、ERRORレベルで記録されます。falseの場合、(重大度に応じて)問題がERROR/WARNレベルで記録され、推測が行われ、例外をスローする代わりに合理的なデフォルトが使用されます。

true

task_length

integer

デフォルトのタスクの長さ(タスク・スティーリング戦略の場合のみ関連)。100から10000にする必要があります。トレードオフ: 数が小さい場合、よりファイングレインなタスクが生成され、スティーリングのスループットが高くなります。数が大きい場合、メモリー消費量およびGCアクティビティが小さくなります。

4096

tmp_dir

string

コンパイル・アーティファクトおよび他の一時データを格納するための一時ディレクトリ。<system-tmp-dir>に設定されている場合、基礎となるシステムの標準tmpディレクトリ(Linuxの場合は/tmp)を使用します。

<system-tmp-dir>

use_string_pool

boolean

trueの場合、インメモリー・アナリストは、文字列プロパティに対するメモリーの消費を削減するためにプール内に文字列プロパティを格納します。

true

例6-1 最小限のインメモリー・アナリスト構成

次の例を使用すると、インメモリー・アナリストにより、32のワーカーが含まれる分析スレッド・プールが初期化されます。(他のすべてのパラメータにデフォルト値が使用されます。)

{ "num_workers_analysis": 32 }

例6-2 2つの固定グラフを使用したインメモリー・アナリスト構成

次の例では、インメモリー・アナリストの起動時に2つの固定グラフをメモリーロードするためのgraphsパラメータを含む、追加パラメータを指定します。この機能を使用すると、同じグラフ構成を事前にロードし、後でグラフを参照するためにスタンドアロンで使用する必要がある場合に冗長性が生じないようにすることができます。

{
"num_workers_analysis": 32,
"num_workers_fast_track_analysis": 32,
"memory_cleanup_interval": 600,
"max_active_sessions": 1,
"release_memory_threshold": 0.2,
"graphs": ["graph-configs/my-graph.bin.json", "graph-configs/my-other-graph.adj.json"]
}

例6-3 デフォルト以外のランタイム値を使用したインメモリー・アナリスト構成

次の例では、インメモリー・アナリストのランタイム動作を構成するためにいくつかのパラメータを指定します。

{
"num_workers_analysis": 32,
"num_spin_locks": 128,
"task_length": 1024,
"array_factory_strategy": "java_arrays"
}

- インメモリー・アナリストの構成ファイルの指定

6.2.1 インメモリー・アナリストの構成ファイルの指定

インメモリー・アナリストの構成ファイルは、ServerInstance#startEngine (または任意のバリアント)が呼び出されるたびに起動時にインメモリー・アナリストによって解析されます。構成ファイルへのパスをインメモリー・アナリストに書き込むことも、プログラム的に指定することもできます。このトピックでは、ファイルを指定する複数の方法を識別します

プログラム的

すべての構成フィールドがJava列挙型として存在します。例:

Map<PgxConfig.Field, Object> pgxCfg = new HashMap<>();
pgxCfg.put(PgxConfig.Field.NUM_WORKERS_ANALYSIS, 32);

ServerInstance instance = ...
instance.startEngine(pgxCfg);

明示的に設定されていないすべてのパラメータにデフォルト値が使用されます。

ファイルの明示的な使用

地図の代わりに、インメモリー・アナリスト構成JSONファイルへのパスを書き込むことができます。例:

instance.startEngine("path/to/pgx.conf"); // file on local file system
instance.startEngine("hdfs:/path/to/pgx.conf"); // file on HDFS (required $HADOOP_CONF_DIR on the classpath)
instance.startEngine("classpath:/path/to/pgx.conf"); // file on current classpath

他のすべてのプロトコルの場合、JSONファイルへの入力ストリームに直接書き込むことができます。例:

InputStream is = ...
instance.startEngine(is);

ファイルの暗黙的な使用

startEngine()が引数なしで呼び出されると、インメモリー・アナリストは、次の場所にある構成ファイルを探し、ファイルが見つかったら停止します。

- Javaシステム・プロパティpgx_conf内にあるファイル・パス。例: java -Dpgx_conf=conf/my.pgx.config.json ...

- 現在のクラスパスのルート・ディレクトリ内のpgx.confという名前のファイル

- 現在のSystem.getProperty("user.dir")ディレクトリに対して相対的なルート・ディレクトリ内のpgx.confという名前のファイル

注意: 構成を用意するかどうかは任意です。特定の構成ファイル内でフィールドが見つからない場合、または構成ファイルが用意されていない場合、各フィールドのデフォルト値が使用されます。

ローカル・シェルの使用

シェルによるローカルのインメモリー・アナリスト・インスタンスの構成方法を変更するには、$PGX_HOME/conf/pgx.confを編集します。変更は、$PGX_HOME/bin/pgxを次回呼び出すときに反映されます。

次の例のように構成ファイルの場所を変更することもできます。

./bin/pgx --pgx_conf path/to/my/other/pgx.conf

システム・プロパティの設定

インメモリー・アナリストが実行されているJVMに-Dpgx.<FIELD>=<VALUE>引数を書き込むことにより、Javaシステム・プロパティを使用して任意のパラメータを設定できます。システム・プロパティを設定すると、他の任意の構成が上書きされます。次の例では、他の任意の構成がどのように設定されているかとは関係なく、最大オフピーク・サイズを256GBに設定します。

java -Dpgx.max_off_heap_size=256000 ...

環境変数の設定

インメモリー・アナリストが実行されているJVMの環境変数に'PGX_'を追加することにより、環境変数を使用して任意のパラメータを設定することもできます。環境変数を設定すると、他の任意の構成が上書きされます。ただし、システム・プロパティおよび環境変数が同じパラメータに設定されている場合、システム・パラメータ値が使用されます。次の例では、環境変数を使用して最大オフヒープ・サイズを256GBに設定します。

PGX_MAX_OFF_HEAP_SIZE=256000 java ...

6.3 カスタム・グラフ・データの読取り

ユーザー独自のカスタム・グラフ・データを読み取ることができます。この例では、グラフを作成し、それを変更して正しく読み取る方法を表示します。

このグラフでは隣接するリスト形式を使用しますが、インメモリー・アナリストでは、複数のグラフ形式をサポートしています。

主な手順は次のとおりです。

- 単純なグラフ・ファイルの作成

- 頂点プロパティの追加

- 頂点識別子としての文字列の使用

- エッジ・プロパティの追加

6.3.1 単純なグラフ・ファイルの作成

この例では、頂点またはエッジ・プロパティのない、単純な小さいグラフを隣接するリストに作成します。それぞれの線には、頂点(ノード) ID、およびその出力エッジ点が指し示す頂点IDが含まれます。

1 2
2 3 4
3 4
4 2

このリストでは、単一スペースで個々のトークンを区切ります。インメモリー・アナリストではその他のセパレータもサポートしており、グラフ構成ファイルで指定できます。

図6-2は、4つの頂点と5つのエッジのあるプロパティ・グラフとしてレンダリングされたデータを示します。(頂点2および頂点4の間には2つのエッジがあり、各エッジは互いの反対の方向を指し示しています。)

図6-2 単純なカスタム・プロパティ・グラフ

インメモリー・アナリストへのグラフの読込みには、グラフ構成が必要です。グラフ構成は、次のいずれかのメソッドを使用して指定できます。

- JSON形式での構成設定のファイルへの書込み

- Java GraphConfigBuilderオブジェクトの使用。

次の例では、両方のメソッドを示します。

JSON構成

{
"uri": "graph.adj",
"format":"adj_list",
"separator":" "
}

Java構成

import oracle.pgx.config.FileGraphConfig;
import oracle.pgx.config.Format;
import oracle.pgx.config.GraphConfigBuilder;
FileGraphConfig config = GraphConfigBuilder
.forFileFormat(Format.ADJ_LIST)
.setUri("graph.adj")
.setSeparator(" ")
.build();

6.3.2 頂点プロパティの追加

「単純なグラフ・ファイルの作成」のグラフは、頂点プロパティまたはエッジ・プロパティを使用しない頂点とエッジで構成されています。頂点プロパティは、それぞれの線の元の頂点IDに続いて配置されます。double頂点(ノード)プロパティを値0.1、2.0、0.3および4.56789とともにグラフに追加すると、グラフ・データは次のようになります。

1 0.1 2
2 2.0 3 4
3 0.3 4
4 4.56789 2

注意:

インメモリー・アナリストは同種のグラフのみをサポートしており、すべての頂点のプロパティの数とタイプは同じです。

インメモリー・アナリストで、変更したデータ・ファイルを読み取るには、構成ファイルまたはビルダー・コードで頂点(ノード)プロパティを追加する必要があります。次の例では、プロパティを説明する名前を入力し、タイプをdoubleに設定します。

JSON構成

{
"uri": "graph.adj",
"format":"adj_list",
"separator":" ",
"node_props":[{
"name":"double-prop",
"type":"double"
}]
}

Java構成

import oracle.pgx.common.types.PropertyType;
import oracle.pgx.config.FileGraphConfig;
import oracle.pgx.config.Format;
import oracle.pgx.config.GraphConfigBuilder;

FileGraphConfig config = GraphConfigBuilder.forFileFormat(Format.ADJ_LIST)
.setUri("graph.adj")
.setSeparator(" ")
.addNodeProperty("double-prop", PropertyType.DOUBLE)
.build();

6.3.3 頂点識別子としての文字列の使用

前の例では、integer頂点(ノード) IDを使用しています。インメモリー分析のデフォルトはinteger頂点IDですが、string頂点IDを使用するようにグラフを定義することもできます。

このデータ・ファイルには桁数だけではなく、"node 1"、"node 2"などを使用できます。

"node 1" 0.1 "node 2"
"node 2" 2.0 "node 3" "node 4"
"node 3" 0.3 "node 4"
"node 4" 4.56789 "node 2"

ここでも、データ・ファイルと一致するようにグラフ構成を変更する必要があります。

JSON構成

{
"uri": "graph.adj",
"format":"adj_list",
"separator":" ",
"node_props":[{
"name":"double-prop",
"type":"double"
}],
"node_id_type":"string"
}

Java構成

import oracle.pgx.common.types.IdType;
import oracle.pgx.common.types.PropertyType;
import oracle.pgx.config.FileGraphConfig;
import oracle.pgx.config.Format;
import oracle.pgx.config.GraphConfigBuilder;

FileGraphConfig config = GraphConfigBuilder.forFileFormat(Format.ADJ_LIST)
.setUri("graph.adj")
.setSeparator(" ")
.addNodeProperty("double-prop", PropertyType.DOUBLE)
.setNodeIdType(IdType.STRING)
.build();

注意:

string頂点IDは、integer頂点IDより多くのメモリーを消費します。

文字列内の一重引用符または二重引用符は、バックスラッシュ(\)でエスケープする必要があります。

文字列内の改行(\n)はサポートされていません。

6.3.4 エッジ・プロパティの追加

この例では、タイプstringのエッジ・プロパティをグラフに追加します。エッジ・プロパティは、目標の頂点(ノード) IDに続いて配置されます。

"node1" 0.1 "node2" "edge_prop_1_2"
"node2" 2.0 "node3" "edge_prop_2_3" "node4" "edge_prop_2_4"
"node3" 0.3 "node4" "edge_prop_3_4"
"node4" 4.56789 "node2" "edge_prop_4_2"

グラフ構成は、データ・ファイルと一致している必要があります。

JSON構成

{
"uri": "graph.adj",
"format":"adj_list",
"separator":" ",
"node_props":[{
"name":"double-prop",
"type":"double"
}],
"node_id_type":"string",
"edge_props":[{
"name":"edge-prop",
"type":"string"
}]
}

Java構成

import oracle.pgx.common.types.IdType;
import oracle.pgx.common.types.PropertyType;
import oracle.pgx.config.FileGraphConfig;
import oracle.pgx.config.Format;
import oracle.pgx.config.GraphConfigBuilder;

FileGraphConfig config = GraphConfigBuilder.forFileFormat(Format.ADJ_LIST)
.setUri("graph.adj")
.setSeparator(" ")
.addNodeProperty("double-prop", PropertyType.DOUBLE)
.setNodeIdType(IdType.STRING)
.addEdgeProperty("edge-prop", PropertyType.STRING)
.build();

6.4 グラフ・データのディスクへの格納

グラフはJavaまたはシェルを使用してメモリーに読み込んだ後、別の形式でディスクに格納できます。格納したグラフ・データは、後でインメモリー・アナリストへの入力として使用できます。

HTTP/RESTへのグラフの格納は現在サポートされていません。

オプションは、次のとおりです。

- 頂点プロパティへの分析結果の格納

- エッジリスト形式でのグラフのディスクへの格納

6.4.1 頂点プロパティへの分析結果の格納

これらの例では、グラフをメモリーに読み込み、Pagerankアルゴリズムを使用して分析します。この分析では、PageRank値を格納する新しい頂点プロパティが作成されます。

シェルを使用したPageRankの実行

pgx> g = session.readGraphWithProperties("/opt/oracle/oracle-spatial-graph/property_graph/examples/pgx/graphs/sample.adj.json", "my-graph")
==> ...
pgx> rank = analyst.pagerank(g, 0.001, 0.85, 100)

Javaを使用したPageRankの実行

PgxGraph g = session.readGraphWithProperties("/opt/oracle/oracle-spatial-graph/property_graph/examples/pgx/graphs/sample.adj.json", "my-graph");
VertexProperty<Integer, Double> rank = session.createAnalyst().pagerank(g, 0.001, 0.85, 100);

JavaScriptを使用したPageRankの実行

let p = pgx.connect(url, options);
p.then(function(session) {
return session.readGraphWithProperties(jsonContent);
}).then(function(graph) {
return graph.session.analyst.pagerank(graph);
});

6.4.2 エッジリスト形式でのグラフのディスクへの格納

この例では、グラフ、Pagerank分析の結果、および元のエッジ・プロパティすべてをエッジリスト形式でディスクに格納します。

グラフを格納するには、次を指定する必要があります。

- グラフの形式

- ファイルが格納されるパス

- 格納されるプロパティ。VertexProperty.ALLまたはEdgeProperty.ALLを指定するとすべてのプロパティが格納され、VertexProperty.NONEまたはEdgePropery.NONEを指定すると、どのプロパティも格納されません。個々のプロパティを指定するには、格納するVertexPropertyまたはEdgePropertyオブジェクトを渡します。

- 既存のファイルを同じ名前で上書きするかどうかを示すフラグ

次の例では、/tmp/sample_pagerank.elist.json構成ファイルでグラフ・データを/tmp/sample_pagerank.elistに格納します。戻り値は、格納されているファイルのグラフ構成です。これは再度、グラフの読取りに使用できます。

シェルを使用したグラフの格納

pgx> config = g.store(Format.EDGE_LIST, "/tmp/sample_pagerank.elist", [rank], EdgeProperty.ALL, false)
==> {"uri":"/tmp/sample_pagerank.elist","edge_props":[{"type":"double","name":"cost"}],"vertex_id_type":"integer","loading":{},"format":"edge_list","attributes":{},"vertex_props":[{"type":"double","name":"pagerank"}],"error_handling":{}}

Javaを使用したグラフの格納

import oracle.pgx.api.*;
import oracle.pgx.config.*;

FileGraphConfig config = g.store(Format.EDGE_LIST, "/tmp/sample_pagerank.elist", Collections.singletonList(rank), EdgeProperty.ALL, false);

JavaScriptを使用したグラフの格納

let p = graph.store({format: 'EDGE_LIST', targetPath: '/tmp/sample_pagerank.elist'});

6.5 組込みアルゴリズムの実行

インメモリー・アナリストには、一連の組込みアルゴリズムが含まれており、Java APIとして使用できます。

このトピックでは、Triangle CountingおよびPagerank分析を使用したインメモリー・アナリストの使用方法について説明します。

- インメモリー・アナリストについて

- Triangle Countingアルゴリズムの実行

- Pagerankアルゴリズムの実行

6.5.1 インメモリー・アナリストについて

インメモリー・アナリストには、一連の組込みアルゴリズムが含まれており、Java APIとして使用できます。APIの詳細は、製品ドキュメント・ライブラリに含まれるJavadocに記載されています。特に、サポートされているインメモリー・アナリストのメソッドのリストについては、Analystクラスのメソッド・サマリーを参照してください。

たとえば、Pagerankプロシージャの署名は次のとおりです。:

/**
* Classic pagerank algorithm. Time complexity: O(E * K) with E = number of edges, K is a given constant (max
* iterations)
*
* @param graph
*          graph
* @param e
*          maximum error for terminating the iteration
* @param d
*          damping factor
* @param max
*          maximum number of iterations
* @return Vertex Property holding the result as a double
*/
public <ID> VertexProperty<ID, Double> pagerank(PgxGraph graph, double e, double d, int max);

6.5.2 Triangle Countingアルゴリズムの実行

Triangle Countingの場合、countTriangles()のsortByDegreeブール・パラメータを使用して、グラフを最初に角度でソートする(true)かソートしない(false)かを制御します。trueの場合、さらに多くのメモリーが使用されますが、アルゴリズムの実行は高速になります。ただし、グラフが非常に大きい場合、この最適化をオフにしてメモリー不足を回避する必要があります。

シェルを使用したTriangle Countingの実行

pgx> analyst.countTriangles(graph, true)
==> 1

Javaを使用したTriangle Countingの実行

import oracle.pgx.api.*;

Analyst analyst = session.createAnalyst();
long triangles = analyst.countTriangles(graph, true);

JavaScriptを使用したTriangle Countingの実行

p.then(function(graph) {
return graph.session.analyst.countTriangles(graph, true);
})

このアルゴリズムでは、サンプル・グラフ内の1つの三角形を検出します。

ヒント:

インメモリー・アナリスト・シェルを使用する場合、ロギング・レベルを変更すると、実行中のログ出力の量を増加できます。:h :loglevelを指定した:loglevelコマンドの実行に関する情報を参照してください。

6.5.3 Pagerankアルゴリズムの実行

Pagerankは、グラフ内のそれぞれの頂点(ノード)について、0と1の間のランク値を計算し、その値をdoubleプロパティに格納します。このため、アルゴリズムによって、出力に対してタイプdoubleの頂点プロパティが作成されます。

インメモリー・アナリストでは、頂点プロパティとエッジ・プロパティの2つのタイプがあります。

- 永続プロパティ: データ・ソースからグラフとともにロードされ固定されたディスク上のデータのインメモリー・コピーであるため、永続となるプロパティ。永続プロパティは読取り専用のため変更できず、セッション間で共有されます。

- 一時プロパティ: 一時プロパティには値が書き込めるため、セッションでプライベートに使用されます。一時プロパティは、PgxGraphオブジェクトでcreateVertexPropertyおよびcreateEdgePropertyを呼び出して作成できます。

この例では、Pagerank値が最も高い上位3つの頂点を取得します。タイプdoubleの一時頂点プロパティを使用して、計算したPagerank値を保持します。Pagerankアルゴリズムでは、入力パラメータのデフォルト値としてエラー許容差 = 0.001、ダンピング係数 = 0.85、および反復の最大数 = 100のデフォルト値を使用します。

シェルを使用したPageRankの実行

pgx> rank = analyst.pagerank(graph, 0.001, 0.85, 100);
==> ...
pgx> rank.getTopKValues(3)
==> 128=0.1402019732468347
==> 333=0.12002296283541904
==> 99=0.09708583862990475

Javaを使用したPageRankの実行

import java.util.Map.Entry;
import oracle.pgx.api.*;

Analyst analyst = session.createAnalyst();
VertexProperty<Integer, Double> rank = analyst.pagerank(graph, 0.001, 0.85, 100);
for (Entry<Integer, Double> entry : rank.getTopKValues(3)) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}

JavaScriptを使用したPageRankの実行

p.then(function(graph) {
return graph.session.analyst.pagerank(graph, {e: 0.001, d: 0.85, max: 100});
});

6.6 サブグラフの作成

メモリーにロードされたグラフに基づいてサブグラフを作成できます。

フィルタ式を使用するか、2部グラフの左側の集合を指定する頂点(ノード)に基づく2部サブグラフを作成できます。

グラフのメモリーへの読込みについては、「グラフ・データのメモリーへの読込み」を参照してください。

- フィルタ式について

- 簡易エッジ・フィルタを使用したサブグラフの作成

- 簡易頂点フィルタを使用したサブグラフの作成

- 複合フィルタを使用したサブグラフの作成

- 式フィルタの結合

- 式フィルタを使用した一連の頂点またはエッジの作成

- 頂点集合を使用した2部サブグラフの作成

6.6.1 フィルタ式について

フィルタ式は、各頂点または各エッジで評価される式です。式によって、結果(この場合はサブグラフ)に含まれるようにエッジを完成させる述部を定義できます。

4つの頂点(ノード)と4つのエッジで構成される図6-1のグラフを検討します。フィルタ式src.prop1 == 10と一致するエッジについては、元の頂点のpropプロパティが10になります。図6-3に示すフィルタ式と一致する2つのエッジ。

図6-3 サンプル・グラフ

次のエッジ・フィルタ式は、

src.prop1 == 10

ソース頂点のprop1という名前のプロパティの値が10である各エッジがフィルタ式と一致するよう指定します。この場合、次のエッジが式と一致します。

- 頂点id: 128から頂点id: 1908までを上部でつなぐエッジ(cost: 27.03)

- 頂点id: 128から頂点id: 99までを左側でつなぐエッジ(cost: 8.51)

図6-4は、前述のフィルタ式が適用されたときに生成されるサブグラフを示しています。このサブグラフには、id: 128を持つ頂点、左側と上部のエッジ、および各エッジの宛先頂点(id: 1908およびid: 99を持つ頂点)が含まれます。

図6-4 簡易エッジ・フィルタで作成されたサブグラフ

次の頂点フィルタ式は、

vertex.prop1 < 10

prop1という名前のプロパティの値が10未満である各頂点がフィルタ式と一致するよう指定します。この場合、次のエッジが式と一致します。

- 頂点id: 99から頂点id: 333までを下部でつなぐエッジ(cost: 338.0)

フィルタ式の例

- 日付。次の式は、エッジのプロパティdateにアクセスし、これが03/27/2007 06:00と等しいかどうかを確認します。

edge.date = date('2007-03-27 06:00:00')

- 入力/出力角度。inDegree()は頂点の入力エッジの数を返し、outDegree()は頂点の出力エッジの数を返します。次の例では、srcは現在のエッジのソース(出力)頂点を示し、dstは宛先(入力)頂点を示します。

src.inDegree() > 3
dst.outDegree() < 5

- ラベル。hasLabelは、頂点に特定のラベルがある場合、trueを返します。次は、頂点にcityラベルがあり、そのpopulationが10000を超えている場合、trueを返します。

vertex.hasLabel('city') && (vertex.population > 10000)

- ラベル。labelは、エッジのラベルを返します。次の例では、エッジのラベルがfriend_ofまたはclicked_byである場合、trueを返します。

edge.label() = 'friend_of' || edge.label() = 'clicked_by'

- 型変換: 次の例では、ソース頂点のcostプロパティの値を整数に変換します。

(int) src.cost

- 算術のサポート: 次の例は、フィルタ式で使用できる算術式を示しています。

1 + 5
-vertex.degree()
edge.cost * 2 > 5
src.value * 2.5 = (dst.inDegree() + 5) / dst.outDegree()

6.6.2 簡易エッジ・フィルタを使用したサブグラフの作成

次の例では、「フィルタ式について」で説明した最初のサブグラフを作成します。

シェルを使用したサブグラフの作成

subgraph = graph.filter(new EdgeFilter("src.prop1 == 10"))

Javaを使用したサブグラフの作成

import oracle.pgx.api.*;
import oracle.pgx.api.filter.*;

PgxGraph graph = session.readGraphWithProperties(...);
PgxGraph subgraph = graph.filter(new EdgeFilter("src.prop1 == 10"));

JavaScriptを使用したサブグラフの作成

return graph.filter(pgx.createEdgeFilter("src.prop1 == 10"));

6.6.3 簡易頂点フィルタを使用したサブグラフの作成

次の例では、「フィルタ式について」で説明した2番目のサブグラフを作成します。

シェルを使用したサブグラフの作成

subgraph = graph.filter(new VertexFilter("vertex.prop1 < 10"))

Javaを使用したサブグラフの作成

import oracle.pgx.api.*;
import oracle.pgx.api.filter.*;

PgxGraph graph = session.readGraphWithProperties(...);
PgxGraph subgraph = graph.filter(new VertexFilter("src.prop1 < 10"));

JavaScriptを使用したサブグラフの作成

return graph.filter(pgx.createVertexFilter("vertex.prop1 < 10"));

6.6.4 複合フィルタを使用したサブグラフの作成

この例では、少し複雑なフィルタを使用しています。ここでは、識別子の送信エッジの数(ソースsrcまたは宛先dst)を計算するoutDegree関数を使用します。次のフィルタ式は、costプロパティ値が50を超え、outDegreeが1を超える宛先の頂点(ノード)のエッジと一致します。

dst.outDegree() > 1 && edge.cost > 50

図6-5では、サンプル・グラフのエッジの1つがこのフィルタ式と一致します。

図6-5 outDegreeフィルタと一致するエッジ

図6-6はフィルタを適用した結果のグラフを示します。フィルタは頂点99と1908に対応するエッジを除外するため、その頂点も除外します。

図6-6 outDegreeフィルタで作成されたグラフ

6.6.5 式フィルタの結合

頂点フィルタをエッジ・フィルタと結合できます。

両方のフィルタが個別に評価され、後で次のいずれかを作成することによってマージされます。

- 結果の結合

- 結果の交差

2つのフィルタの結合の作成

結合の実行対象としてエッジ・フィルタと、

src.prop1 == 10

頂点フィルタを選択すると、

vertex.prop1 < 10

次のグラフに示す結果が得られます。

図6-7 2つのフィルタの結合

シェルの例:

edgeFilter = new EdgeFilter("src.prop1 == 10")
vertexFilter = new VertexFilter("vertex.prop1 < 10")
filter = edgeFilter.union(vertexFilter)
subgraph = g.filter(filter)

Javaの例:

import oracle.pgx.api.filter.*;
...
EdgeFilter edgeFilter = new EdgeFilter("src.prop1 == 10");
VertexFilter vertexFilter = new VertexFilter("vertex.prop1 < 10");
GraphFilter filter = edgeFilter.union(vertexFilter);

PgxGraph subgraph = g.filter(filter);

JavaScriptの例:

return p.then(function(graph) {
let edgeFilter = pgx.createEdgeFilter("src.prop1 == 10");
let vertexFilter = pgx.createVertexFilter("vertex.prop1 < 10");
let filter = edgeFilter.union(vertexFilter);
return graph.filter(filter);
});

2つのフィルタの交差の作成

結合の例で説明したフィルタの交差を作成すると、単一の頂点のみで構成された次のグラフが生成されます。

図6-8 2つのフィルタの交差

シェルの例:

edgeFilter = new EdgeFilter("src.prop1 == 10")
vertexFilter = new VertexFilter("vertex.prop1 < 10")
filter = edgeFilter.intersect(vertexFilter)
subgraph = g.filter(filter)

Javaの例:

import oracle.pgx.filter.expressions.*;
...
EdgeFilter edgeFilter = new EdgeFilter("src.prop1 == 10");
VertexFilter vertexFilter = new VertexFilter("vertex.prop1 < 10");
GraphFilter filter = edgeFilter.intersect(vertexFilter);

PgxGraph subgraph = g.filter(filter);

JavaScriptの例:

return p.then(function(graph) {
let edgeFilter = pgx.createEdgeFilter("src.prop1 == 10");
let vertexFilter = pgx.createVertexFilter("vertex.prop1 < 10");
let filter = edgeFilter.intersect(vertexFilter);
return graph.filter(filter);
});

6.6.6 式フィルタを使用した一連の頂点またはエッジの作成

式フィルタを使用したサブグラフの作成(他のトピックで説明しています)以外にも、式フィルタを使用してグラフから一連の頂点またはエッジのみを選択することもできます。

たとえば、次の頂点フィルタ式を使用して「フィルタ式について」のサンプル・グラフで頂点セットを作成できます。

vertex.prop1 < 10

これにより、ID値99および333を持つ頂点セットが生成されます。

例6-4 頂点セットの作成

シェルの例:

vertices = g.getVertices( new VertexFilter("vertex.prop1 < 10") )
==> PgxVertex with ID 99
==> PgxVertex with ID 333

Javaの例:

import oracle.pgx.api.*;
import oracle.pgx.filter.expressions.*;
...
VertexSet<Integer> = g.getVertices( new VertexFilter("vertex.prop1 < 10") );

例6-5 エッジ・セットの作成

シェルの例:

edges = g.getEdges( new EdgeFilter("src.prop1 == 10") )
==> PgxEdge with ID 0
==> PgxEdge with ID 1

Javaの例:

import oracle.pgx.api.*;
import oracle.pgx.filter.expressions.*;
...
EdgeSet = g.getEdges( new EdgeFilter("src.prop1 == 10") );

6.6.7 頂点集合を使用した2部サブグラフの作成

2部サブグラフは、左側に使用される頂点(ノード)集合を指定して作成できます。2部サブグラフには、左側の頂点集合と右側の頂点集合の間にのみエッジがあります。左側の2つのノード間など、これらの集合内にエッジはありません。インメモリー・アナリストでは、入力および出力エッジが削除されたために分離された頂点は、2部サブグラフの一部ではありません。

次の図は、2部サブグラフを示します。プロパティは示していません。

次の例では、図6-1で作成した単一のグラフから2部サブグラフを作成します。左側の頂点集合を作成し、それに頂点を入力します。

シェルを使用した2部サブグラフ作成

pgx> s = graph.createVertexSet()
==> ...
pgx> s.addAll([graph.getVertex(333), graph.getVertex(99)])
==> ...
pgx> s.size()
==> 2
pgx> bGraph = graph.bipartiteSubGraphFromLeftSet(s)
==> PGX Bipartite Graph named sample-sub-graph-4

Javaを使用した2部サブグラフ作成

import oracle.pgx.api.*;

VertexSet<Integer> s = graph.createVertexSet();
s.addAll(graph.getVertex(333), graph.getVertex(99));
BipartiteGraph bGraph = graph.bipartiteSubGraphFromLeftSet(s);

サブグラフを作成すると、インメモリー・アナリストで、頂点が左側にあるかどうかを示すブール頂点(ノード)プロパティが自動的に作成されます。このプロパティには一意の名前を指定できます。

結果の2部サブグラフは次のようになります。

頂点1908は2部サブグラフから除外されます。頂点に繋がっている唯一のエッジは、128から1908に伸びています。エッジはサブグラフの2部プロパティに反しているため削除されています。頂点1908にはその他のエッジがないため、これも削除されています。

6.7 グラフを使用したパターンマッチング問合せの使用

インメモリー・グラフに対してパターンマッチング問合せを発行してから、その問合せの結果を操作できます。

パターンマッチング問合せの例のデータ・セット

パターンマッチングの例では、2つの異なるデータ・セットを使用します。

- 政治家、スポーツ選手、著名人および会社の間の関係

- 装置、結線およびスイッチが含まれる電気ネットワーク

PGQLを使用したパターンマッチング問合せの発行

Property Graph Suery Language (PGQL)でグラフのパターンマッチング問合せを発行できます。PGQLは、SQLに似た宣言言語で、頂点とエッジ、および頂点とエッジのプロパティに関する制約で構成されたパターンを表現できます。

インメモリー・アナリストに対する問合せを発行するには、PgxGraph (sessionを使用してグラフをロードするときに取得するオブジェクトのタイプ)のqueryPgql() Javaメソッドを使用するか、同等のJavaScript関数を使用できます。Javaの例:

次のトピックでは、問合せのパターンマッチングを使用します。

- 例: 敵の敵は味方である

- 例: 協力者の最も多い上位10人

- 例: 電気装置間の推移的な接続性

6.7.1 例: 敵の敵は味方である

このトピックの例では、古来の有名な格言である「敵の敵は味方である」から着想を得たグラフ・パターンについて説明します。特に、このグラフには、2つのfeudsエッジ・ラベルによって接続された2つのエンティティが含まれます。頂点は、人々、一族または国を表します。互いに反目する頂点のペアは、feudsエッジ・ラベルが付けられたエッジを持ちます。

このような問合せは、次のようにPGQLで作成されます。

SELECT x.name, z.name
WHERE
(x) -[e1:feuds]-> (y),
(y) -[e2:feuds]-> (z),
x != y
ORDER BY x.name, z.name

この問合せでは、結果はx.nameによって順序付けされた後、z.name順序付けされます。

PGXに対する問合せの発行:

シェルの例:

pgx> resultSet = connectionsGraph.queryPgql("SELECT x.name, z.name WHERE (x) -[e1:feuds]-> (y), (y) -[e2:feuds]-> (z), x != z ORDER BY x.name, z.name")

Javaの例:

import oracle.pgx.api.*;

...

PgqlResultSet resultSet = connectionsGraph.queryPgql("SELECT x.name, z.name WHERE (x) -[e1:feuds]-> (y), (y) -[e2:feuds]-> (z), x != z ORDER BY x.name, z.name");

JavaScriptの例:

return p.then(function(graph) {
return graph.queryPgql("SELECT x.name, z.name WHERE (x) -[e1:feuds]-> (y), (y) -[e2:feuds]-> (z), x != z ORDER BY x.name, z.name");
});

PgqlResultSetは、問合せの結果セットを管理します。結果セットには、複数の結果が含まれます(このような問合せでは、多くのサブグラフが照合される場合があります)。各結果は、結果要素のリストで構成されています。結果要素の順序は、問合せのSELECT句内の変数の順序に従います。

問合せ結果を反復することは、一連のPgqlResultElementインスタンスを反復することを意味します。PgqlResultElementは、結果要素の型および変数名を保持します。

PgqlResultElementインスタンスのリストは、次のように取得できます。

シェルの例:

pgx> resultElements = resultSet.getPgqlResultElements()

Javaの例:

import oracle.pgx.api.*;
import java.util.List;

...

List<PgqlResultElement> resultElements = resultSet.getPgqlResultElements();

JavaScriptの例:

return p.then(function(resultSet) {
console.log(resultSet.resultElements);
});

最初の結果要素の型および変数名を取得します。

シェルの例:

pgx> resultElement = resultElements.get(0)
pgx> type = resultElement.getElementType() // STRING
pgx> varName = resultElement.getVarName() // x.name

Javaの例:

import oracle.pgx.api.*;

...

PgqlResultElement resultElement = resultElements.get(0);
PqglResultElement.Type = resultElement.getElementType(); // STRING
String varName = resultElement.getVarName(); // x.name

JavaScriptの例:

return p.then(function(resultSet) {
console.log(resultSet.resultElements[0].varName);
console.log(resultSet.resultElements[0].elementType);
});

ループのfor-eachスタイルを使用して結果セットを反復します。ループ内では、問合せ結果が含まれるPgqlResultインスタンスを取得します。

シェルの例:

pgx> resultSet.getResults().each { \
// the variable 'it' is implicitly declared to references each PgqlResult instance
}

Javaの例:

import oracle.pgx.api.*;

...

for (PgqlResult result : resultSet.getResults()) {
...
}

JavaScriptの例:

return p.then(function(resultSet) {
return resultSet.iterate(function(row) {
console.log(row);
});
});

シェル内では、PqglResultSetのprintメソッドを使用してテキスト形式で結果セットを適切に印刷できます。

pgx> resultSet.print(10) // print the first 10 results

次の結果が表示されます。

--------------------------------
| x.name        | z.name       |
================================
| ABC           | CBS          |
| ABC           | NBC          |
| Alibaba       | Beyonce      |
| Alibaba       | Google       |
| Alibaba       | eBay         |
| Amazon        | Carl Icahn   |
| Amazon        | Facebook     |
| Amazon        | Tencent      |
| Angela Merkel | Barack Obama |
| Angela Merkel | John Kerry   |
--------------------------------

個々のPgqlResultインスタンスまたはそれらの要素のハンドルを取得することもできます。

結果要素の索引別:

pgx> nameX = it.getString(0)
pgx> nameZ = it.getString(1)

結果要素の変数名別:

pgx> nameX = it.getString("x.name")
pgx> nameZ = it.getString("z.name")

型を知らずに結果要素を取得することもできます。

pgx> nameX = it.get(0)
// or
pgx> nameX = it.get("x.name")

JavaScriptでは、次のように変数名別に結果要素にアクセスできます。

return p.then(function(resultSet) {
return resultSet.iterate(function(row) {
console.log(row['n']);
console.log(row['n.pagerank']);
});
});

6.7.2 例: 協力者の最も多い上位10人

この例では、グラフ内の協力者の最も多い上位10人を協力者の数の降順で見つけます。このような問合せではPGQLの様々な機能を活用しますが、これには、WHERE句で見つかったグラフ・パターンのグループ化、集計、順序付けおよび制限が含まれます。次の問合せ文字列は、PGQLでのユーザーの照会を表します。

pgx> resultSet = connectionsGraph.queryPgql("SELECT x.name, COUNT(*) AS num_collaborators WHERE (x) -[:collaborates]-> () GROUP BY x ORDER BY DESC(num_collaborators) LIMIT 10")

この問合せでは、次の処理を実行します。

1. `collaborates'エッジ・ラベルを照合することにより、グラフから協力関係パターンをすべて見つけます。

2. 見つかったパターンをソース頂点別にグループ化します。

3. 各グループにカウント集計を適用し、協力者の数を見つけます。

4. 協力者の数別に降順でグループに順序を付けます。

5. 最初の10個の結果のみを採用します。

print()メソッドは、グラフ内で協力者の最も多い上位10人の名前および協力者の数を表示します。

pgx> resultSet.print()

次の結果が表示されます。

---------------------------------------------------
| x.name                      | num_collaborators |
===================================================
| Barack Obama                | 10                |
| Charlie Rose                | 4                 |
| Omar Kobine Layama          | 3                 |
| Dieudonne Nzapalainga       | 3                 |
| Nicolas Guerekoyame Gbangou | 3                 |
| NBC                         | 3                 |
| Pope Francis                | 3                 |
| Beyonce                     | 2                 |
| Eric Holder                 | 2                 |
| Tom Steyer                  | 2                 |
---------------------------------------------------

6.7.3 例: 電気装置間の推移的な接続性

この例では、頂点間で到達可能性をテストします。ここでは、次の図の電気ネットワークのグラフを使用します。

図6-9 電気ネットワークのグラフ

この例では、グラフ内のすべてのDeviceが他のすべてのDeviceと推移的に接続されているかどうかを確認しようとしてします。装置は、Connection頂点およびSwitch頂点によって接続されています。

最初に、次のPGQL問合せを発行することにより、グラフ内にいくつの装置があるか確認します。

SELECT COUNT(*) AS numDevices
WHERE (n:Device)

結果は6031です。

--------------
| numDevices |
==============
| 6031       |
--------------

装置ごとに、ゼロ以上ConnectionまたはSwitch頂点(および必要なエッジ)を辿ることによって到達できる装置の数を計算します。この問合せは、次のようにPGQLで表すことができます。

PATH connects_to := () <- (/*:Connection|Switch*/) -> ()
SELECT n.nickname AS device, count(m) AS reachabilityCount
WHERE (n:Device) -/:connects_to*/-> (m:Device)
GROUP BY n
ORDER BY COUNT(m), n.nickname

この問合せでは、隣接する2つの装置/接続の間の明確な接続がパス・パターンconnects_toを使用して表されています。クリーネ・スター(*)は、推移的接続を確認することを目的として、パス・パターンがゼロ以上の回数繰り返して一致する可能性があることを表しています。(インメモリー・アナリストではこの機能がまだサポートされていないため、パス・パターン内のラベルはコメントアウトされます。)

この問合せでは、GROUP BYを使用して、ソース装置nごとにグループを作成してから、到達可能な宛先装置mの数を計算します。最初の20の結果は次のとおりです。

------------------------------------------------
| device                   | reachabilityCount |
================================================
| 190-7361-M1089120        | 6031              |
| 190-8581-D5587291-3_INT  | 6031              |
| 190-8593-D5860423-3_INT  | 6031              |
| 196-29518-L3122816       | 6031              |
| 196-29519-L3066815       | 6031              |
| 196-29520-L3160109       | 6031              |
| 196-29521-N1136355       | 6031              |
| 196-31070-D5861005-2_INT | 6031              |
| 196-35541-M1108317       | 6031              |
| 196-35813-N1140519       | 6031              |
| 196-36167-L3011298       | 6031              |
| 198-5320-221-311359      | 6031              |
| 221-240988-L3141411      | 6031              |
| 221-240991-L3066817      | 6031              |
| 221-242079-L3011293      | 6031              |
| 221-282818-N1230123      | 6031              |
| 221-282819-N1230122      | 6031              |
| 221-306686-L2970258      | 6031              |
| 221-306687-L2916625      | 6031              |
| 221-308718-L2803199      | 6031              |
------------------------------------------------

結果はreachabilityCountの数を増加させることによってソートされるため、および結果内の最初の装置でさえグラフ内のすべての装置に推移的に接続されるため(reachabilityCount = 6031)、ここでは、グラフ内のすべての装置が相互に完全に到達可能であることが分かります。

6.8 インメモリー・アナリスト・サーバーの起動

Big Data Spatial and Graphには、スクリプトの実行によってインメモリー・アナリスト・サーバーを起動できるApache Tomcatの事前構成済バージョンがバンドルされています。

サーバーを起動する前に構成する必要がある場合は、「インメモリー・アナリスト・サーバーの構成」を参照してください。

サーバーを起動するには、スクリプト/opt/oracle/oracle-spatial-graph/property_graph/pgx/bin/start-serverを実行します

- インメモリー・アナリスト・サーバーの構成

6.8.1 インメモリー・アナリスト・サーバーの構成

インメモリー・アナリスト・サーバーは、/opt/oracle/oracle-spatial-graph/property_graph/pgx/conf/server.confファイルを変更することによって構成できます。次の表は、JSON形式で指定できる有効な構成オプションを示します。

表6-2 インメモリー・アナリスト・サーバーの構成オプション

オプション

型

説明

デフォルト

authorization

string

クライアントを認可のロールにマップするファイル。

server.auth.conf

ca_certs

stringの配列

信頼できる証明書のリスト(PEM形式)。'enable_tls'がfalseに設定されている場合、このオプションは無効です。

[この表の後の情報を参照してください。]

enable_client_authentication

boolean

trueの場合、クライアントはTLSハンドシェイク時に認証されます。詳細は、TLSプロトコルを参照してください。'enable_tls'がfalseである場合、このフラグは無効です。

true

enable_tls

boolean

trueの場合、トランスポート層セキュリティ(TLS)が有効になります。

true

port

integer

PGXサーバーがリッスンする必要があるポート

7007

server_cert

string

TLSクライアントに提示されるサーバー証明書へのパス(PEM形式)。'enable_tls'がfalseに設定されている場合、このオプションは無効です

null

server_private_key

string

サーバーの秘密鍵(PKCS#8、PEM形式)。'enable_tls'がfalseに設定されている場合、このオプションは無効です

null

インメモリー・アナリストWebサーバーを使用すると、デフォルトで双方向のSSL/TLS (トランスポート層セキュリティ)が有効になります。このサーバーでは、TLS 1.2が適用され、攻撃に対して脆弱であることが知られている特定の暗号スイートが無効になります。TLSハンドシェイク時には、サーバーとクライアントの両方が相互に証明書を提示し合い、これらを使用して相手側の信頼性が検証されます。クライアント・アプリケーションの認可にはクライアント証明書も使用されます。

次に、server.conf構成ファイルの例を示します。

{
"port": 7007,
"server_cert": "certificates/server_certificate.pem",
"server_private_key": "certificates/server_key.pem",
"ca_certs": [ "certificates/ca_certificate.pem" ],
"authorization": "auth/server.auth.conf",
"enable_tls": true,
"enable_client_authentication": true
}

次に、server.auth.conf構成ファイルの例を示します。マッピング・クライアント(アプリケーション)は、ロールに対する証明書のDN文字列によって識別されます。

{
"authorization": [{
"dn": "CN=Client, OU=Development, O=Oracle, L=Belmont, ST=California, C=US",
"admin": false
}, {
"dn": "CN=Admin, OU=Development, O=Oracle, L=Belmont, ST=California, C=US",
"admin": true
}]
}

サーバー構成ではクライアント側の認証またはSSL/TLS認証全体をオフにすることができます。ただし、任意の本番環境に対して双方向のSSL/TLSを有効にすることをお薦めします。

6.9 Jettyへのデプロイ

インメモリー・アナリストは、Eclipse Jetty、Apache Tomcat、またはOracle WebLogic Serverにデプロイできます。この例では、Webアプリケーションとしてインメモリー・アナリストをEclipse Jettyにデプロイする方法を示しています。

注意:

これらの手順は、インメモリー・アナリストのテストのみを目的としています。本格的なデプロイメントの場合、正しい認証および認可を適用し、資格情報を安全に格納し、HTTPSを介して接続のみを許可するよう、Jettyを構成する必要があります。

1. インメモリー・アナリストのWebアプリケーション・アーカイブ(WAR)ファイルをJettyのwebappsディレクトリにコピーします(<VERSION>を実際のバージョン番号に置き換えます)。

cp $PGX_HOME/server/shared-mem/pgx-webapp-<VERSION>.war.war $JETTY_HOME/webapps/pgx.war

2. ポート8080が未使用であることを確認し、Jettyを開始します。

cd $JETTY_HOME
java -jar start.jar

3. Jettyが動作していることを確認します。

cd $PGX_HOME
./bin/pgx --base_url http://localhost:8080/pgx

4. (オプション)インメモリー・アナリスト構成ファイルを変更します。
インメモリー・アナリスト・エンジンの構成ファイル(pgx.conf)およびロギング・パラメータ(log4j.xml)は、WEB-INF/classesのWARファイル内にあります。

変更を行った後、サーバーを再起動して変更を有効にします。

関連項目:

http://eclipse.org/jetty/documentation/にある構成および使用に関するJettyドキュメント

6.10 Apache Tomcatへのデプロイ

インメモリー・アナリストは、Eclipse Jetty、Apache Tomcat、またはOracle WebLogicにデプロイできます。この例では、Webアプリケーションとしてインメモリー・アナリストをApache Tomcatにデプロイする方法を示しています。

注意:

これらの手順は、インメモリー・アナリストのテストのみを目的としています。本格的なデプロイメントの場合、正しい認証および認可を適用し、資格情報を安全に格納し、HTTPSを介して接続のみを許可するよう、Apache Tomcatを構成する必要があります。

1. インメモリー・アナリストWARファイルをwebappsディレクトリにコピーします。次に例を示します(および<VERSION>を実際のバージョン番号に置き換えます):

cp $PGX_HOME/server/shared-mem/pgx-webapp-<VERSION>.war $CATALINA_HOME/webapps/pgx.war

2. ポート8080が未使用であることを確認し、Tomcatを起動します。

cd $CATALINA_HOME
./bin/startup.sh

3. Tomcatが動作していることを確認します。

cd $PGX_HOME
./bin/pgx --base_url http://localhost:8080/pgx

関連項目:

Tomcatのドキュメントは、次を参照してください

http://tomcat.apache.org/tomcat-7.0-doc/

6.11 Oracle WebLogic Serverへのデプロイ

インメモリー・アナリストは、Eclipse Jetty、Apache Tomcat、またはOracle WebLogic Serverにデプロイできます。この例では、Webアプリケーションとしてインメモリー・アナリストをOracle WebLogic Serverにデプロイする方法を示しています。

注意:

これらの手順は、インメモリー・アナリストのテストのみを目的としています。本格的なデプロイメントの場合、正しい認証および認可を適用し、資格情報を安全に格納し、HTTPSを介して接続のみを許可するよう、WebLogic Serverを構成する必要があります。

- Oracle WebLogic Serverのデプロイ

- インメモリー・アナリストのデプロイ

- サーバーが動作していることの確認

6.11.1 Oracle WebLogic Serverのデプロイ

Oracle WebLogic Serverの最新バージョンをダウンロードし、インストールするには、次を参照してください

http://www.oracle.com/technetwork/middleware/weblogic/documentation/index.html

6.11.2 インメモリー・アナリストのデプロイ

Oracle WebLogicにインメモリー・アナリストをデプロイするには、次のようなコマンドを使用します。ユーザーの管理資格証明とWARファイルをこの例に示す値に入力します。

. $MW_HOME/user_projects/domains/mydomain/bin/setDomainEnv.sh
. $MW_HOME/wlserver/server/bin/setWLSEnv.sh
java weblogic.Deployer -adminurl http://localhost:7001 -username username -password password -deploy -source $PGX_HOME/server/pgx-webapp-wls.war

スクリプトが正常に実行されると、次のようなメッセージが表示されます。

Target state: deploy completed on Server myserver

6.11.3 サーバーが動作していることの確認

サーバーに接続できることを確認します。

$PGX_HOME/bin/pgx --base_url http://localhost:7001/pgx

6.12 インメモリー・アナリスト・サーバーへの接続

プロパティ・グラフのインメモリー・アナリストがサーバーとしてデプロイされ、Hadoopクラスタ(またはEclipse Jetty、Apache Tomcat、Oracle WebLogic上のWebアプリケーションとしてHadoopのないクライアント・システム)にインストールされた後、インメモリー・アナリスト・サーバーに接続できます。

- インメモリー・アナリスト・シェルによる接続

- Javaによる接続

- JavaScriptによる接続

6.12.1 インメモリー・アナリスト・シェルによる接続

インメモリー・アナリスト・インスタンスへの最も単純な接続方法は、サーバーのベースURLを指定することです。

--base_urlコマンド・ライン引数を使用して、そのベースURL上で実行されているサーバーに接続できます。たとえば、サーバーのSSL/TLSが無効であり、認証が必要なく、サーバーがhttp://localhost:8080/pgx上で実行されている場合、次を入力することにより、PGXシェルを使用してサーバーに接続できます。

cd $PGX_HOME
./bin/pgx --base_url http://scott:tiger@localhost:8080/pgx

同じ方法でリモート・インスタンスに接続できます。

サーバーにBASIC認証が必要である場合、次の例のようにユーザー名およびパスワードを指定できます。

./bin/pgx --base_url http://localhost:8080/pgx --username scott --password <password-for-scott>

サーバーのSSL/TLSが有効である場合、--truststoreオプションを使用して、サーバー証明書を検証するために使用される信頼ストアへのパスを(JKS形式で)指定できます。

./bin/pgx --base_url https://localhost:8080/pgx --truststore path/to/truststore.jks

サーバーの双方向SSL/TLSが有効である場合、--keystoreおよび–-passwordオプションを使用して、クライアント証明書およびキーストア・パスワードが含まれるキーストア・ファイルを指定できます。

./bin/pgx --base_url https://localhost:8080/pgx --truststore path/to/truststore.jks --keystore path/to/keystore.jks --password <password>

- HTTPリクエストのロギングについて

6.12.1.1 HTTPリクエストのロギングについて

インメモリー・アナリスト・シェルでは、デフォルトでデバッグ・メッセージをすべて非表示にします。どのHTTPリクエストが実行されたかを確認するには、この例に示すように、oracle.pgxのログ・レベルをDEBUGに設定します。

pgx> :loglevel oracle.pgx DEBUG
===> log level of oracle.pgx logger set to DEBUG
pgx> session.readGraphWithProperties("sample_http.adj.json", "sample")
10:24:25,056 [main] DEBUG RemoteUtils - Requesting POST http://scott:tiger@localhost:8080/pgx/core/session/session-shell-6nqg5dd/graph HTTP/1.1 with payload {"graphName":"sample","graphConfig":{"uri":"http://path.to.some.server/pgx/sample.adj","separator":" ","edge_props":[{"type":"double","name":"cost"}],"node_props":[{"type":"integer","name":"prop"}],"format":"adj_list"}}
10:24:25,088 [main] DEBUG RemoteUtils - received HTTP status 201
10:24:25,089 [main] DEBUG RemoteUtils - {"futureId":"87d54bed-bdf9-4601-98b7-ef632ce31463"}
10:24:25,091 [pool-1-thread-3] DEBUG PgxRemoteFuture$1 - Requesting GET http://scott:tiger@localhost:8080/pgx/future/session/session-shell-6nqg5dd/result/87d54bed-bdf9-4601-98b7-ef632ce31463 HTTP/1.1
10:24:25,300 [pool-1-thread-3] DEBUG RemoteUtils - received HTTP status 200
10:24:25,301 [pool-1-thread-3] DEBUG RemoteUtils - {"stats":{"loadingTimeMillis":0,"estimatedMemoryMegabytes":0,"numEdges":4,"numNodes":4},"graphName":"sample","nodeProperties":{"prop":"integer"},"edgeProperties":{"cost":"double"}}

6.12.2 Javaによる接続

Javaを使用してインメモリー・アナリストを初期化する場合、ベースURLを指定できます。この例は次のようになります。インメモリー・アナリスト・サーバーへのURLは、getInstance API呼出しに提供されます。

import oracle.pg.nosql.*;
import oracle.pgx.api.*;

PgNosqlGraphConfig cfg = GraphConfigBuilder.forNosql().setName("mygraph").setHosts(...).build();
OraclePropertyGraph opg = OraclePropertyGraph.getInstance(cfg);
ServerInstance remoteInstance = Pgx.getInstance("http://scott:tiger@hostname:port/pgx");
PgxSession session = remoteInstance.createSession("my-session");

PgxGraph graph = session.readGraphWithProperties(opg.getConfig());

Javaを使用した接続時に信頼ストア、キーストア、およびキーストア・パスワードを指定するには、javax.net.ssl.trustStore、javax.net.ssl.keyStoreおよびjavax.net.ssl.keyStorePasswordシステム・プロパティをそれぞれ設定する必要があります。

6.12.3 JavaScriptによる接続

JavaScriptを使用してインメモリー・アナリストを初期化する場合、ベースURLを指定できます。この例は次のようになります。インメモリー・アナリスト・サーバーへのURLは、connect API呼出しに提供されます。

const pgx = require('oracle-pgx-client'); // oracle-pgx-client npm package
const fs = require('fs');
// options to connect to pgx server
let options = {
clientKey: fs.readFileSync('client_key.pem'),
clientCert: fs.readFileSync('client_cert.pem'),
caCert: fs.readFileSync('ca_cert.pem'),
passphrase: 'passphrase',
};
// connect to pgx server
let p = pgx.connect(url, options).then(function(session) {
return session.readGraphWithProperties(…); // load graph from pgx server
}).then(function(graph) {
return graph.session.analyst.pagerank(graph); // run pagerank algorithm in pgx server
}).catch(function(err) {
console.log("error: " + err);
});

6.13 分散モードのインメモリー・アナリストの使用

インメモリー・アナリストは、共有メモリー・モードまたは分散モードで実行できます。

- 共有メモリー・モード
複数のスレッドが、単一のノード(単一の共有メモリー・スペース)に格納されているインメモリー・グラフ・データ上で並列して機能します。共有メモリー・モードでは、グラフのサイズは、物理メモリー・サイズによって、および同じノード上で実行されている他のアプリケーションによって制約されます。

- 分散モード
共有メモリー・モードの制限を克服するには、インメモリー・アナリストを分散モードで実行します。これにより、複数のノード(コンピュータ)がクラスタを形成し、分散メモリー全体にわたって大規模なプロパティ・グラフをパーティション化し、連携して機能することにより、効率的かつスケーラブルなグラフ分析を実現します。

インメモリー・アナリスト機能を分散モードで使用する場合、クラスタ内のノードごとに次の要件が適用されます。

- GNU Compiler Collection (GCC) 4.8.2以降
GNU C++ APIの3.4.20上で構築されたC++標準ライブラリが必要です。

- TCPポートを開く機能
分散インメモリー・アナリストでは、初期ハンドシェイクのために指定されたTCPポートを開くことが必要です。デフォルトのポート番号は7777ですが、ランタイム・パラメータpgx_side_channel_portを使用して設定することもできます。

- イーサネットでインフィニバンドまたはUDPを使用する機能
ノード間のデータ通信には主に、イーサネット上のインフィニバンド(IB)またはUDPが使用されます。イーサネットを使用する場合、クラスタ内のマシンが他のコンピュータからUDPパケットを受け取ることが必要です。

- JDK8以降

インメモリー・アナリストを分散モードで起動するには、次の手順を実行します。(この例では、この目的のために4つのモード(コンピュータ)が割り当てられており、これらがホスト名hostname0、hostname1、hostname2およびhostname3を持つことを前提としています。)

ノードごとに、ログインして次の操作を実行します(実際の環境に応じて詳細を変更します)。

export PGX_HOME=/opt/oracle/oracle-spatial-graph/property_graph/pgx
export LD_LIBRARY_PATH=$PGX_HOME/server/distributed/lib:$JAVA_HOME/jre/lib/amd64/server:$LD_LIBRARY_PATH

cd $PGX_HOME/server/distributed
./bin/node ./package/main/ClusterHost.js -server_config=./package/options.json -pgx_hostnames=hostname0,hostname1,hostname2,hostname3

4つのノードすべてで操作が正常に完了した後、次のようなログ・メッセージを参照できます。

17:11:42,709 [hostname0] INFO pgx.dist.cluster_host - PGX.D Server listening on http://hostname0:8023/pgx

これで、分散モードのインメモリー・アナリストは起動して稼働しています。そのサービスはエンドポイントhttp://hostname0:8023/pgxを介して提供されます

このエンドポイントは、リモートでデプロイされた共有メモリー・アナリストと同じ方法で使用できます。Java API、GroovyシェルおよびPGXシェルを使用できます。PGXシェルの使用例は、次のとおりです。

cd $PGX_HOME
./bin/pgx --base_url=http://hostname0:8023/pgx

次の例では、Oracle NoSQL Database用のGroovyシェルのサービスを使用します。

opg-nosql> session=Pgx.createSession("http://hostname0:8023/pgx", "session-id-123");
opg-nosql> analyst=session.createAnalyst();
opg-nosql> pgxGraph = session.readGraphWithProperties(opg.getConfig());

options.jsonファイルの例を次に示します。

$ cat ./package/options.json
{
"pgx_use_infiniband": 1,
"pgx_command_queue_path": ".",
"pgx_builtins_path": "./lib",
"pgx_executable_path": "./bin/pgxd",
"java_class_path": "./jlib/*",
"pgx_httpserver_port": 8023,
"pgx_httpserver_enable_csrf_token": 1,
"pgx_httpserver_enable_ssl": 0,
"pgx_httpserver_client_auth": 1,
"pgx_httpserver_key": "<INSERT_VALUE_HERE>/server_key.pem",
"pgx_httpserver_cert": "<INSERT_VALUE_HERE>/server_cert.pem",
"pgx_httpserver_ca": "<INSERT_VALUE_HERE>/server_cert.pem",
"pgx_httpserver_auth": "<INSERT_VALUE_HERE>/server.auth.json",
"pgx_log_configure": "./package/log4j.xml",
"pgx_ranking_query_max_cache_size": 1048576,
"zookeeper_timeout": 10000,
"pgx_partitioning_strategy": "out_in",
"pgx_partitioning_ignore_ghostnodes": false,
"pgx_ghost_min_neighbors": 5000,
"pgx_ghost_max_node_counts": 40000,
"pgx_use_bulk_communication": true,
"pgx_num_worker_threads": 28
}

6.14 HDFSでのデータの読取りおよび格納

インメモリー・アナリストでは、Hadoop Distributed File System (HDFS)をサポートしています。この例では、インメモリー・アナリストAPIを使用してHDFSのグラフ・データを読み取り、アクセスする方法を示しています。

グラフ構成ファイルはクライアント側で解析されます。グラフ・データと構成ファイルはHDFSに格納されます。Hadoopクライアントはインメモリー分析と同じコンピュータにインストールする必要があります。『Oracle Big Data Applianceソフトウェア・ユーザーズ・ガイド』を参照してください。

注意:

インメモリー・アナリスト・エンジンは、Hadoopクラスタの1つのノードのメモリーでのみ実行されます。

- HDFSからのデータの読込み

- グラフ・スナップショットのHDFSへの格納

- HadoopでのJavaアプリケーションのコンパイルおよび実行

6.14.1 HDFSからのデータの読込み

この例では、sample.adjグラフ・データとその構成ファイルをHDFSにコピーし、それをメモリーに読み込みます。

1. グラフ・データをHDFSにコピーします。

cd $PGX_HOME
hadoop fs -mkdir -p /user/pgx
hadoop fs -copyFromLocal ../examples/pgx/graphs/sample.adj /user/pgx

2. グラフ構成ファイルsample.adj.jsonのuriフィールドを、HDFSリソースを指し示すように編集します。

{
"uri": "hdfs:/user/pgx/sample.adj",
"format": "adj_list",
"node_props": [{
"name": "prop",
"type": "integer"
}],
"edge_props": [{
"name": "cost",
"type": "double"
}],
"separator": " "
}

3. 構成ファイルをHDFSにコピーします。

cd $PGX_HOME
hadoop fs -copyFromLocal ../examples/pgx/graphs/sample.adj.json /user/pgx

4. 次の例に示すように、HDFSからサンプル・グラフをインメモリー・アナリストに読み込みます。

シェルを使用したHDFSからのグラフの読込み

g = session.readGraphWithProperties("hdfs:/user/pgx/sample.adj.json");
===> PgxGraph[name=sample,N=4,E=4,created=1475525438479]

Javaを使用したHDFSからのグラフの読込み

import oracle.pgx.api.*;
PgxGraph g = session.readGraphWithProperties("hdfs:/user/pgx/sample.adj.json");

6.14.2 グラフ・スナップショットのHDFSへの格納

インメモリー・アナリストのバイナリ形式(.pgb)は、インメモリー・アナリスト独自のバイナリ・グラフ形式です。基本的に、.pgbファイルはグラフとそのプロパティ・データのバイナリ・ダンプであり、インメモリー・アナリスト操作を効率的にします。この形式を使用すると、グラフ・スナップショットをディスクにすぐにシリアル化し、後でメモリーに読み込んで戻すことができます。

既存の.pgbファイルは変更しないでください。

次の例では、HDFSで、現在メモリー内にあるサンプル・グラフをPGB形式でHDFSに格納します。

シェルを使用したグラフのHDFSへの格納

g.store(Format.PGB, "hdfs:/user/pgx/sample.pgb", VertexProperty.ALL, EdgeProperty.ALL, true)

Javaを使用したグラフのHDFSへの格納

import oracle.pgx.config.GraphConfig;
import oracle.pgx.api.*;

GraphConfig pgbGraphConfig = g.store(Format.PGB, "hdfs:/user/pgx/sample.pgb", VertexProperty.ALL, EdgeProperty.ALL, true);

PGBファイルが作成されたことを確認するには、/user/pgx HDFSディレクトリでファイルをリストします。

hadoop fs -ls /user/pgx

6.14.3 HadoopでのJavaアプリケーションのコンパイルおよび実行

前の例のHdfsDemo Javaクラスを次に示します。

import oracle.pgx.api.Pgx;
import oracle.pgx.api.PgxGraph;
import oracle.pgx.api.PgxSession;
import oracle.pgx.api.ServerInstance;
import oracle.pgx.config.Format;
import oracle.pgx.config.GraphConfig;
import oracle.pgx.config.GraphConfigFactory;

public class HdfsDemo {
public static void main(String[] mainArgs) throws Exception {
ServerInstance instance = Pgx.getInstance(Pgx.EMBEDDED_URL);
instance.startEngine();
PgxSession session = Pgx.createSession("my-session");
GraphConfig adjConfig = GraphConfigFactory.forAnyFormat().fromPath("hdfs:/user/pgx/sample.adj.json");
PgxGraph graph1 = session.readGraphWithProperties(adjConfig);
GraphConfig pgbConfig = graph1.store(Format.PGB, "hdfs:/user/pgx/sample.pgb");
PgxGraph graph2 = session.readGraphWithProperties(pgbConfig);
System.out.println("graph1 N = " + graph1.getNumVertices() + " E = " + graph1.getNumEdges());
System.out.println("graph2 N = " + graph1.getNumVertices() + " E = " + graph2.getNumEdges());
}
}

これらのコマンドは、HdfsDemoクラスをコンパイルします。

cd $PGX_HOME
mkdir classes
javac -cp ../lib/'*' HdfsDemo.java -d classes

このコマンドはHdfsExampleクラスを実行します。

java -cp ../lib/*:conf:classes:$HADOOP_CONF_DIR HdfsDemo

6.15 YARNアプリケーションとしてのインメモリー・アナリストの実行

この例では、Hadoop NextGen MapReduce (YARN)スケジューリングにより、Hadoopクラスタ上でインメモリー・アナリスト・サーバーを開始、停止および監視する方法について説明します。

- インメモリー・アナリスト・サービスの開始および停止

- インメモリー・アナリスト・サービスへの接続

- インメモリー・アナリスト・サービスの監視

6.15.1 インメモリー・アナリスト・サービスの開始および停止

YARNアプリケーションとしてインメモリー・アナリストを開始する前に、インメモリー・アナリストYARNクライアントを構成する必要があります。

- インメモリー・アナリストYARNクライアントの構成

- 新規インメモリー・アナリスト・サービスの開始

- 長期実行インメモリー・アナリスト・サービスについて

- インメモリー・アナリスト・サービスの停止

6.15.1.1 インメモリー・アナリストYARNクライアントの構成

インメモリー・アナリスト・ディストリビューションには、$PGX_HOME/conf/yarn.confのYARNクライアント構成ファイルのサンプルが含まれています。

必要なフィールドがすべて設定されていることを確認します。指定したパスがHDFSにあり、zookeeper_connect_stringがCDHクラスタで実行中のZooKeeperポートを指し示している必要があります。

6.15.1.2 新規インメモリー・アナリスト・サービスの開始

新規インメモリー・アナリスト・サービスをHadoopクラスタで開始するには、次のコマンドを使用します(<VERSION>を実際のバージョン番号に置き換えます)。

yarn jar $PGX_HOME/yarn/pgx-yarn-<VERSION>.jar

$PGX_HOME/conf/yarn.conf以外のYARNクライアント構成ファイルを使用するには、ファイル・パスを指定します(<VERSION>を実際のバージョン番号に置き換え、/path/to/different/を実際のパスに置き換えます)。

yarn jar $PGX_HOME/yarn/pgx-yarn-<VERSION>.jar /path/to/different/yarn.conf

サービスが開始されると、インメモリー・アナリスト・サービスが起動されているHadoopノードのホスト名とポートが表示されます。

6.15.1.3 長期実行インメモリー・アナリスト・サービスについて

インメモリー・アナリストYARNアプリケーションは、指定した時間後にタイムアウトするようにデフォルトで構成されています。pgx_server_timeout_secsを0に設定してタイムアウトを無効にすると、インメモリー・アナリスト・サーバーはユーザーまたはHadoopによって明示的に停止されるまで継続して実行されます。

6.15.1.4 インメモリー・アナリスト・サービスの停止

実行中のインメモリー・アナリスト・サービスを停止する手順:

yarn application -kill appId

この構文では、appIdがサービス開始時に表示されるアプリケーションIDです。

終了したインメモリー・アナリスト・サービスのログを検証する手順:

yarn logs -applicationId appId

6.15.2 インメモリー・アナリスト・サービスへの接続

YARNのインメモリー・アナリスト・サービスには、任意のインメモリー・アナリスト・サーバーに接続する場合と同じ方法で接続できます。たとえば、シェル・インタフェースでインメモリー・アナリスト・サービスに接続するには、次のようなコマンドを使用します。

$PGX_HOME/bin/pgx --base_url username:password@hostname:port

この構文では、usernameおよびpasswordがYARN構成で指定されているものと一致します。

6.15.3 インメモリー・アナリスト・サービスの監視

インメモリー・アナリスト・サービスを監視するには、リソース・マネージャWeb UIで対応するYARNアプリケーションをクリックします。デフォルトでは、Web UIは次の場所にあります

http://resource-manager-hostname:8088/cluster

6.16 Oracleの2つの表関係形式の使用

リレーショナル・データ・モデルを使用する場合、グラフ・データは2つのリレーショナル表を使用して表現できます。1つの表はノードとそのプロパティ用で、もう1つの表はエッジとそのプロパティ用です。

インメモリー・アナリストでは、2つのリレーショナル(RDBMS)表がノードとエッジを表すようなリレーショナル・グラフ表現でグラフを読み込むことができます。必要なのは、グラフのconfigオブジェクトで次の追加フィールドを指定することのみです。

表6-3 2つの表形式の追加フィールド

フィールド

型

説明

デフォルト

edges_key_column

string

エッジ表内の主キー列の名前

eid

edges_table_name

string

エッジ表の名前

null

from_nid_column

string

ソース・ノードの列名

svid

insert_batch_size

integer

挿入する行のバッチ・サイズ

10000

max_prefetched_rows

integer

ラウンドトリップ時にプリフェッチされた行の最大数(結果セット - データベース)。

10000

nodes_key_column

string

ノード表内の主キー列の名前

vid

nodes_table_name

string

ノード表の名前

null

num_connections

integer

2つの表から/にデータを読み取る/書き込むための接続数

<no-of-cpus>

schema

string

表の書込み先のスキーマ

null

tablespace

string

表の書込み先の表領域

users

to_nid_column

string

宛先ノードの列名

dvid

vertex_id_type

enum[long, string]

頂点IDの型

long

注意:

2つの表形式を使用してOracle DatabaseからOracle Big Data Spatial and Graphインメモリー・アナリストにデータを直接読み込むには、次の1つ以上のライセンスが必要です。

- Oracle Big Data Appliance上のOracle Big Data Spatial and Graphライセンス、または

- サポートされている別の構成上のOracle Big Data Spatial and Graphライセンス、およびOracle Database Enterprise Editionシステム上のOracle Spatial and Graphオプションのライセンス。

Oracle Big Data Spatial and Graphのライセンスの詳細は、『Oracle Big Data Applianceライセンス情報ユーザー・マニュアル』を参照してください。

- 2つの表形式の使用例

- NULL値の処理方法

2つの表形式の使用例

次の例では、次の表に示す値を使用して、2つのリレーション表(NODESおよびEDGES)からグラフ・データを読み込みます。

表6-4 2つの表の例のノード表値

nid

NP1

NP2

NP3

1829107

“hello”

06/06/2012

0.30

1829179

“world”

06/08/2012

0.999

表6-5 2つの表の例のエッジ表値

eid

from_nid

to_nid

EP1

EP2

EP3

21123

1829107

1829179

“alpha”

06/06/2012

10.5

48180

1788817

1829179

“beta”

06/08/2012

22.3

{
"jdbc_url": "jdbc:oracle:thin:@mydatabaseserver:1521/dbName",
"format": "two_tables",
"datastore": "rdbms",
"username": "dbUser",
"password": "dbPassword",
"nodes_table_name": "nodes",
"edges_table_name": "edges",
"node_props": [{
"name": "NP1",
"type": "string"
},{
"name": "NP2",
"type": "date"
},{
"name": "NP3",
"type": "double"
}],
"edge_props": [{
"name": "EP1",
"type": "string"
},{
"name": "EP2",
"type": "date"
},{
"name": "EP3",
"type": "float"
}]
}

2つの表形式の使用の追加例については、「インメモリー・アナリストを使用したApache Spark内のグラフ・データの分析」を参照してください。

NULL値の処理方法

インメモリー・アナリストの場合、ノードまたはエッジ内のプロパティ値をnullにすることはできません。このため、ノードまたはエッジ表内のプロパティ値がnullに設定されている場合は常に、代わりにデフォルト値が割り当てられます。configオブジェクトに指定されていない場合、デフォルト値はプロパティ・タイプのJavaデフォルト値です(たとえば、doubleに対する0.0など)。

ただし、次の例に示すように、configオブジェクトに異なるデフォルト値を指定することもできます。

{
"name": "NP1",
"type": "double",
"default": 1.0
}

6.17 インメモリー・アナリストを使用したApache Spark内のグラフ・データの分析

Oracle Big Data Spatial and Graphのプロパティ・グラフ機能を使用すると、インメモリー分析とApache Sparkを統合できます。

次の例では、Sparkコンテキストを作成し、2つの表形式のグラフ(頂点/ノード表およびエッジ表)をSpark DataFrameとしてロードし、このDataFrameからインメモリー・アナリストに読み込み、最後にインメモリー・グラフを作成します。簡単にするために、Java APIのみについて説明します。

(2つの表形式の詳細は、「Oracleの2つの表リレーショナル形式の使用」を参照してください。)

参照: Apache Spark内の並列度の制御

例6-6 Sparkコンテキストの作成

// import classes required by Apache Spark and PGX
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.*;
import oracle.pgx.api.*;
import org.apache.spark.sql.*;
import org.apache.spark.sql.types.*;

String sparkMaster = "spark://..."; // the access point for your Spark cluster
String sparkAppName = "My Spark App ..."; // the name of this application
String [] appJarPaths = new String[] {"/your/jar/path" }; // a file path to your jar file
// create a Spark configuration and a context
SparkConf sparkConf = new SparkConf().setMaster(sparkMaster).setAppName(sparkAppName).setJars(appJarPaths);
JavaSparkContext sc = new JavaSparkContext(sparkConf);
SQLContext sqlContext = new SQLContext(sc);

例6-7 2つの表形式のグラフからのSpark DataFrameの作成

この例では、頂点CSVファイル("頂点表")の各行にlong integer型のID、integer型のVProp1、およびdouble型のVProf2が含まれることを前提としています。また、エッジCSVファイル("エッジ表")の各行にlong integer型のSRCID、long integer型のDSTID、integer型のEProp1、およびdouble型のEProp2が含まれることを前提としています。

JavaRDD<String> vLines = sc.textFile("<path>/test_graph_nodes_table.csv", 2)
JavaRDD<String> eLines = sc.textFile("<path>/test_graph_edges_table.csv", 2)

JavaRDD<Row> vRowRdd = vLines.map(_.split(",")).map(p=>Row(p(0).toLong,p(1).toInt,p(2).toDouble));
StructType vDataframeScheme = new StructType().add("ID", LongType).add("VProp1", IntegerType).add("VProp2", DoubleType);
Dataframe vDataframe = sqlc.createDataFrame(vRowRdd, vDataframeScheme);

JavaRDD<Row> eRowRdd = eLines.map(_.split(",")).map(p=>Row(p(0).toLong,p(1).toLong,p(2).toInt,p(3).toDouble));
StructType eDataframeScheme = new StructType().add("SRCID", LongType).add("DSTID", LongType).add("EProp1", IntegerType).add("EProp2", DoubleType);
Dataframe eDataframe = sqlc.createDataFrame(eRowRdd, eDataframeScheme);

例6-8 インメモリー・アナリストへのSpark DataFrameの読込み(1)

この例では、PgxSessionおよびPgxSparkContextを作成し、PgxSparkContextを使用して2つのSpark DataFrameからインメモリー・グラフを読み込んで作成します。

String pgxServer = "http://..."; // the access point for a PGX server
// create a PGX session and a context
PgxSession pgxSession = Pgx.getInstance(pgxServer).createSession("spark-session");
PgxSparkContext pgxContext = new PgxSparkContext(sparkContext, pgxSession);

// load into PGX
PgxGraph g = pgxContext.read(vDataframe, eDataframe, "spark-test-graph");

PgxGraphのインスタンスが作成された後、既存のすべての分析機能を使用できます。

例6-9 インメモリー・アナリストへのSpark DataFrameの読込み(2)

次の例では、2つのSpark DataFrameのペアを作成することにより、すでにロードされているインメモリー・グループgをApache Sparkに格納し戻します。ペアの要素により、頂点情報とエッジ情報がそれぞれ格納されます。

// store graph "spark-test-graph" into Apache Spark
Pair<DataFrame, DataFrame> dataframePair = pgxContext.writeToDataframes(vertexDataFrame, eDataframeScheme, "spark-test-graph");

- Apache Spark内の並列度の制御

6.17.1 Apache Spark内の並列度の制御

Apache Sparkでのグラフ読込みジョブの並列度は、頂点およびエッジRDD/DataFrameオブジェクトのパーティションの数によって決まります。頂点およびエッジRDD/DataFrameオブジェクトのパーティションの合計数がApache Sparkクラスタ内で使用可能なワーカーの合計数より多い場合、PgxSparkContext::read関数によって例外がスローされます。

この状況では、RDD/DataFrameオブジェクトのパーティションの数を削減することにより、並列度を調整する必要があります。coalesce APIを使用できます。

たとえば、Sparkクラスタ内に使用可能なワーカーが15あり、インメモリー・アナリストに読み込むグラフに500,000の頂点と1,000,000 (100万)のエッジがあるとします。ワーカーの数が15だとすると、頂点およびエッジ・データ・フレームのパーティションの合計が15を超えないようにする必要があります。そうでない場合、クラスタ内で有効な並列度を超える並列度を要求することになります。

エッジの数が頂点の数の2倍あるため、使用可能なワーカーの1/3 (3分の1)を頂点に割り当て、2/3 (3分の2)をエッジに割り当てることをお薦めします。このような比率で15のワーカーをすべて使用するには、5つの頂点パーティションと10のエッジ・パーティションを作成します。次に例を示します。

var newVertexDataFrame = vertexDataFrame.coalesce(5);
var newEdgeDataFrame = edgeDataFrame.coalesce(10);

6.18 インメモリー・アナリストZeppelinインタプリタの使用

インメモリー・アナリストには、Apache Zeppelinのインタプリタ実装が用意されています。このチュートリアルのトピックでは、ローカルのZeppelinインストールにインメモリー・アナリスト・インタプリタをインストールし、いくつかの簡単な操作を実行する方法について説明します。

インタプリタのインストール

次の手順はZeppelinバージョン0.6.1を使用してテストしたものであり、これよりバージョンが新しい場合は変更する必要がある場合があります。

1. Zeppelinのダウンロードおよびインストールがまだ完了していない場合は、これらを実行します。

2. Big Data Spatial and Graphインストール(/opt/oracle/oracle-spatial-graph/property_graph/pgx/client/pgx-<version>-zeppelin-interpreter.zip)内のインメモリー・アナリスト・インタプリタのパッケージを探します。

3. 公式のインタプリタのインストール手順に従います。

a. インメモリー・アナリスト・インタプリタのパッケージを$ZEPPELIN_HOME/interpreter/pgxに解凍します。

b. $ZEPPELIN_HOME/conf/zeppelin-site.xmlを編集し、インメモリー・アナリストZeppelinインタプリタ・クラスnameoracle.pgx.zeppelin.PgxInterpreterをzeppelin.interpretersプロパティ・フィールドに追加します。

c. 次のステップ(Zeppelinの再起動)の前に、CLASSPATH設定を消去します。Linuxシステムでは、シェルでunset CLASSPATHを実行します。

d. Zeppelinを再起動します。

e. Zeppelinインタプリタ・ページで、「+Create」ボタンをクリックし、インタプリタ・グループpgxの新しいインタプリタを追加します。

4. 新しいインメモリー・アナリスト・インタプリタを構成します。

a. 「interpreter for note」のオプションを選択します。

- Shared: すべてのノートが同じインメモリー・アナリスト・セッションを共有します(非推奨)。

- Scoped: すべてのノートが独自のインメモリー・アナリスト・セッションを取得しますが、同じプロセスを共有します(推奨)。

- Isolated: すべてのノートが独自のインメモリー・クライアント・シェル・プロセスを取得します。これが最高の分離レベルですが、Zeppelinインタプリタを実行しているシステム上で不要なリリースが消費される可能性があります。

b. pgx.baseUrlについては、インメモリー・アナリスト・インタプリタがリモートのインメモリー・アナリスト・サーバーと通信するクライアントのように機能するため、インメモリー・アナリスト・サーバーが実行されているベースURLを少なくとも指定する必要があります。

インタプリタの使用

インメモリー・アナリスト・インタプリタにpgxという名前を付けた場合、他の任意のインタプリタの場合と同じように、パラグラフの先頭を%pgxディレクティブにすることにより、パラグラフをインメモリー・アナリスト・インタプリタに送信できます。

インメモリー・アナリストZeppelinインタプリタは、インメモリー・アナリストと同じ方法でパラグラフを評価し、出力を返します。したがって、次の例のように、任意の有効なインメモリー・アナリスト・シェル・スクリプトがインメモリー・アナリスト・インタプリタ内で動作します。

%pgx
g_brands = session.readGraphWithProperties("/opt/data/exommerce/brand_cat.json")
g_brands.getNumVertices()
rank = analyst.pagerank(g_brands, 0.001, 0.85, 100)
rank.getTopKValues(10)

次の図は、その問合せのアイコンをクリックして実行した後の結果を示します。

この図から分かるように、インメモリー・アナリストZeppelinインタプリタは、rank.getTopKValues(10)から返された値をZeppelin表としてレンダリングすることにより、結果をより便利に閲覧しやすくします。

プロパティ値(getTopKValues()、getBottomKValues()およびgetValues())以外にも、次の戻り型がパラグラフから返される場合、これらも表として自動的にレンダリングされます。

- PgqlResultSet - PgxGraphクラスのqueryPgql("...")メソッドから返されるオブジェクト

- MapIterable - PgxMapクラスのentries()メソッドから返されるオブジェクト

他のすべての戻り型およびエラーは、インメモリー・アナリスト・シェルによる場合と同じように、標準の文字列として返されます。

Zeppelinの詳細は、公式のZeppelinドキュメントを参照してください。

6.19 インメモリー・アナリスト・エンタープライズ・スケジューラの使用

インメモリー・アナリスト・エンタープライズ・スケジューラには、高度なスケジューリング機能が用意されています。

注意:

高度なスケジューリング機能は現在、Linux (x86_64)、Mac OS X (x86_64)およびSolaris (x86_64、SPARC)に対してのみ使用可能です。

このチュートリアルのトピックでは、インメモリー・アナリスト・エンタープライズ・スケジューラの高度なスケジューリング機能を使用する方法を示します。次について説明します。

- インメモリー・アナリスト・サーバーの構成による高度なスケジューリング機能の有効化方法

- 実行環境の取得および検査方法

- 実行環境の変更方法および実行環境でのタスクの実行方法

高度なスケジューリング機能の有効化

高度なスケジューリング機能を有効にするには、インメモリー・アナリスト・インスタンス構成のフラグallow_override_scheduling_informationをtrueに設定します。

{
"allow_override_scheduling_information": true
}

実行環境の取得および検査

実行環境はセッションにバインドされています。セッションの実行環境を取得するには、PgxSessionに対してgetExecutionEnvironment()を呼び出します。

pgx> execEnv = session.getExecutionEnvironment()
==> ExecutionEnvironment[session=576af1fd-73aa-4866-abf0-00a71757d75b]

実行環境は、3つのサブ環境(タスク・タイプごとに1つ)に分割されます。

- IO環境: IOタスク用

- 分析環境: CPUバウンドの分析タスク用

- 高速分析環境: 軽量だがCPUバウンドの分析タスク用

実行環境の現在の状態を問い合せるには、getValues()メソッドを呼び出します。

pgx> execEnv.getValues()
==> io-pool.num_threads_per_task=72
==> analysis-pool.max_num_threads=72
==> analysis-pool.weight=72
==> analysis-pool.priority=MEDIUM
==> fast-track-analysis-pool.max_num_threads=72
==> fast-track-analysis-pool.weight=1
==> fast-track-analysis-pool.priority=HIGH

サブ環境を取得するには、getIoEnvironment()、getAnalysisEnvironment()およびgetFastAnalysisEnvironment()メソッドを使用します。各サブ環境には、サブ環境の構成を取得するために独自のgetValues()メソッドが用意されています。

pgx> ioEnv = execEnv.getIoEnvironment()
==> IoEnvironment[pool=io-pool]
pgx> ioEnv.getValues()
==> num_threads_per_task=72

pgx> analysisEnv = execEnv.getAnalysisEnvironment()
==> CpuEnvironment[pool=analysis-pool]
pgx> analysisEnv.getValues()
==> max_num_threads=72
==> weight=72
==> priority=MEDIUM

pgx> fastAnalysisEnv = execEnv.getFastAnalysisEnvironment()
==> CpuEnvironment[pool=fast-track-analysis-pool]
pgx> fastAnalysisEnv.getValues()
==> max_num_threads=72
==> weight=1
==> priority=HIGH

実行環境の変更および更新済環境でのタスクの発行

IoEnvironmentのsetNumThreadsPerTask()メソッドを使用することにより、I/O環境のスレッドの数を変更できます。この値は即時更新され、更新後に発行されたタスクはすべて、更新された値を使用して実行されます。

pgx> ioEnv.setNumThreadsPerTask(8)
==> 8
pgx> g = session.readGraphWithProperties(...)
==> PgxGraph[name=graph,N=3,E=6,created=0]

環境を初期値にリセットするには、reset()メソッドを呼び出します。

pgx> ioEnv.reset()
==> null

CPU環境の場合、setWeight()、setPriority()およびsetMaxThreads()メソッドを使用してスレッドの重み、優先度および最大数を変更できます。

pgx>  analysisEnv.setWeight(50)
==> 50
pgx> fastAnalysisEnv.setMaxThreads(1)
==> 1
pgx> rank = analyst.pagerank(g)
==> VertexProperty[name=pagerank,type=double,graph=graph]

ExecutionEnvironmentに対してreset()を呼び出すと、すべての環境を一度にリセットできます。

pgx> execEnv.reset()
==> null

- 実行環境を使用したラムダ構文の使用

6.19.1 実行環境でのラムダ構文の使用

ラムダ構文を使用して、実行環境で使用する手順を結合できます。通常、この環境は次の方法で使用されます。

1. 実行環境の設定

2. タスクの実行

3. 実行環境のリセット

これらの手順を簡単にするために、これら3つの手順を結合するためのメソッドが用意されています。setメソッドごとに、更新された値をとるwith接頭辞および更新された値を使用して実行する必要があるラムダを使用するメソッドがあります。たとえば、setNumThreadsPerTask()の代わりに、次のように呼び出すことができるwithNumThreadsPerTask()と呼ばれるメソッドがあります。

- JavaアプリケーションでJava 8ラムダを使用する場合:

import oracle.pgx.api.*;
import oracle.pgx.api.executionenvironment.*;

PgxGraph g = ioEnv.withNumThreadsPerTask(8, () -> session.readGraphWithPropertiesAsync(...));

- インメモリー・アナリスト・シェルでGroovyのクロージャを使用する場合:

pgx> g = ioEnv.withNumThreadsPerTask(8, { session.readGraphWithPropertiesAsync(...) } )
==> PgxGraph[name=graph,N=3,E=6,created=0]

これらは両方とも、次の空き指定のシーケンスと等価です。

oldValue = ioEnv.getNumThreadsPerTask()
ioEnv.setNumThreadsPerTask(currentValue)
g = session.readGraphWithProperties(...)
ioEnv.setNumThreadsPerTask( oldValue )

7 マルチメディア分析の使用

ビッグ・データ環境でマルチメディア分析フレームワークを使用すると、ビデオおよびイメージで顔認識を実行できます。

- マルチメディア分析について
Oracle Big Data Spatial and Graphのマルチメディア分析機能は、Apache Hadoopでビデオおよびイメージ・データを処理するためのフレームワークを提供します。

- マルチメディア分析フレームワークを使用したHDFSに格納されたビデオおよびイメージの処理
マルチメディア分析フレームワークは、MapReduceを使用してHDFSに格納されたビデオおよびイメージ・データを処理します。

- マルチメディア分析フレームワークを使用したストリーミング・ビデオの処理
マルチメディア分析フレームワークは、Apache Sparkを使用してRTSPおよびHTTPサーバーからのストリーミング・ビデオを処理します。

- マルチメディア分析フレームワークを使用した顔認識
マルチメディア分析機能は、OpenCVライブラリを使用して顔認識を実行するように構成されています。このOpenCVライブラリは製品で使用できます。

- マルチメディア分析の構成プロパティ
マルチメディア分析フレームワークでは、hadooopコマンドで構成プロパティを指定するために標準メソッドを使用します。

- サードパーティ・ソフトウェアとマルチメディア分析フレームワークの併用
マルチメディアのデコードおよび処理のために、カスタム・モジュールを実装およびインストールできます。

- 出力のイメージの表示
出力がイメージとして表示される場合、oracle.ord.hadoop.OrdPlayImagesを使用して、出力HDFSディレクトリ内のすべてのイメージを表示できます。

7.1 マルチメディア分析について

Oracle Big Data Spatial and Graphのマルチメディア分析機能は、Apache Hadoopでビデオおよびイメージ・データを処理するためのフレームワークを提供します。

このフレームワークにより、ビデオおよびイメージ・データの分散処理が可能になります。このフレームワークには、次のような機能があります。

- Apache Hadoopでビデオおよびイメージ・データを処理および分析するためのAPI

- MapReduceを使用してビデオおよびイメージ・データを処理および分析するためのAPI (入力データはHDFS、Oracle NoSQL DatabaseまたはApache HBaseのいずれかに格納されます)

- Apache Sparkを使用してストリーミング・ビデオをリアルタイムで処理および分析するためのAPI

- Apache Hadoopの並列性を活用した、スケーラブルな高速処理

- OpenCVを使用した組込みの顔認識

- カスタム・ビデオ/イメージ処理(ライセンス・プレート認識など)をインストールおよび実装して、Apache Hadoopでこのフレームワークを使用して実行できる機能

ビデオ分析フレームワークは、Oracle Spatial and Graphのライセンスが付与されている場合にOracle Big Data Applianceにインストールされ、他のHadoopクラスタにインストールできます。

7.2 マルチメディア分析フレームワークを使用したHDFSに格納されたビデオおよびイメージの処理

マルチメディア分析フレームワークは、MapReduceを使用してHDFSに格納されたビデオおよびイメージ・データを処理します。

OpenCVを使用した顔認識は、フレームワークに統合されており、製品で使用できます。顔認識、ライセンス・プレート認識およびオブジェクト認識などの様々なユースケースを対象としてサード・パーティの処理コードをフレームワークに統合することもできます。

ビデオおよびイメージ・データの処理には、次が含まれます

1. 入力データは、HDFS、Oracle NoSQL DatabaseまたはApache HBaseから提供されます。

- ビデオ入力データをHDFSに格納したり、デコードされたフレームをOracle NoSQL DatabaseまたはApache HBaseに格納したりできます。

- イメージ入力データは、HDFS、Oracle NoSQL DatabaseまたはApache HBaseに格納できます。

2. データは、一連のイメージまたはビデオ・フレームに分割されます。

3. イメージまたはビデオ・フレームは、OpenCVまたはサード・パーティのコードを使用して各ノードで処理されます。

4. 処理の出力は、HDFSまたはApache HBaseに格納されます。

7.3 マルチメディア分析フレームワークを使用したストリーミング・ビデオの処理

マルチメディア分析フレームワークは、Apache Sparkを使用してRTSPおよびHTTPサーバーからのストリーミング・ビデオを処理します。

OpenCVを使用した顔検出および顔認識は、フレームワークに統合されており、製品で使用できます。顔認識、ライセンス・プレート認識およびオブジェクト認識などの様々なユースケースを対象としてサード・パーティの処理コードをフレームワークに統合できます。

ストリーミング・ビデオは、Apache Sparkジョブによって処理されます。Sparkジョブは、各フレームを処理し、結果をHDFSに出力するか、出力を書き込むためのカスタム実装を使用した特別な出力場所に出力します。ローカル・ファイル・システムに書き込み、データをデモ・イメージ・プレーヤに送信するカスタム・ライターのサンプル実装は、製品に用意されています。

ストリーミング・ビデオ処理には、次が含まれます

1. 入力データは、RTSPまたはHTTPストリーミング・サーバーまたはHDFSから提供されます。フレームワークは、ビデオ・ストリーミングをHDFSに読み込むこともできます。

2. ビデオ・ストリーミングは、フレームにデコードされます。

3. ビデオ・フレームは、Apache Sparkによって処理されます。

4. 処理の結果は、HDFSに書き込むか、カスタム・プラグインを使用したイメージ・プレーヤなどの特別な場所に書き込むことができます。サンプル・プラグインは、次を目的として使用できます。

- ローカル・ファイル・システムへのJSON、CSVおよび/またはイメージ・データの書込み

- イメージ・プレーヤへのイメージ・データの送信による結果のリアルタイム表示の実現。(デモ・イメージ・プレーヤは製品に含まれています。)

7.4 マルチメディア分析フレームワークを使用した顔認識

マルチメディア分析機能は、OpenCVライブラリを使用して顔認識を実行するように構成されています。このOpenCVライブラリは製品で使用できます。

このトピックでは、この顔認識機能をMapReduceとともに使用して、HDFSに格納されているビデオおよびイメージを処理する方法について説明します。顔認識には次の2つのステップがあります。

1. 顔のイメージを使用してモデルをトレーニングします。このステップは、任意のHadoopクライアントまたはノードで実行できます。

2. トレーニング・モデルを使用して、入力ビデオまたはイメージから顔を認識します。このステップは、Hadoopクラスタで実行するMapReduceジョブです。

トレーニング・プロセスにより、ファイルに格納されるモデルが作成されます。このファイルは、ビデオまたはイメージからの顔認識の入力として使用されます。

- 顔を検出するためのトレーニング

- トレーニングに使用する顔の選択

- ビデオでの顔の検出

- イメージでの顔の検出

- Oracle NoSQL Databaseの操作

- Apache HBaseの操作

- 顔検出の例およびトレーニング資料

7.4.1 顔を検出するためのトレーニング

トレーニングは、ordhadoop_multimedia_analytics.jarの一部であるJavaプログラムOrdFaceTrainerを使用して行われます。このプログラムへの入力は、イメージと、イメージをラベルにマッピングするラベル・マッピング・ファイルのセットです。出力は、ファイルに書き込まれるトレーニング・モデルです。(このファイルは編集しないでください。)

顔を検出(認識)するためにマルチメディア分析機能をトレーニングするには、次の手順に従います。

1. 認識の対象となるイメージを格納する、親ディレクトリとサブディレクトリを作成します。
各サブディレクトリには、1人の人物のイメージが1つ以上含まれている必要があります。1人の人物のイメージを複数のサブディレクトリに格納することはできますが、1つのサブディレクトリに含めることができるのは1人の人物のイメージのみです。たとえば、imagesという名前の親ディレクトリが存在し、1つのサブディレクトリ(d1)にはAndrewという名前の人物のイメージが含まれ、2つのサブディレクトリ(d2およびd3)にはBettyという名前の人物のイメージ(2つの異なる場所で2つの異なる時間に撮影された写真など)が含まれているとします。この例では、ディレクトリとその内容は次のようになる可能性があります。

- images/1には、Andrewのイメージが5つ含まれています。

- images/2には、Bettyのイメージが2つ含まれています。

- images/3には、Bettyのイメージが4つ含まれています。

2. イメージのサブディレクトリをラベルにマップするマッピング・ファイルを作成します。
ラベルとは、認識されるイメージの人物に関連付けられる数値IDです。たとえば、Andrewはラベル値100に関連付けられ、Bettyはラベル値101に関連付けられる、というようになります。マッピング・ファイル内の各レコード(行)には、次の構造が含まれている必要があります。

<subdirectory>,<label-id>,<label-text>

次に例を示します。

1,100,Andrew
2,101,Betty
3,101,Betty

3. 必須の構成プロパティを設定します。

oracle.ord.hadoop.ordfacemodel
oracle.ord.hadoop.ordfacereader
oracle.ord.hadoop.ordsimplefacereader.dirmap
oracle.ord.hadoop.ordsimplefacereader.imagedir

使用可能なプロパティの詳細は、「マルチメディア分析の構成プロパティ」を参照してください。

4. トレーニング・モデルを作成します。次の一般的な形式でコマンドを入力します。

hadoop jar ${MMA_HOME}/lib/ordhadoop-multimedia-analytics-example.jar faceTrainer <training_config_file.xml>

注意:
$MMA_HOME/exampleには、サンプル・ファイルのセットがあります。これには、Java CLASSPATHを設定するためのスクリプトが含まれています。トレーニング・モデルを作成するために、必要に応じて例を編集できます。

7.4.2 トレーニングに使用する顔の選択

トレーニング・モデルの作成に使用するイメージは、顔のみを含み、できるかぎり顔の周囲に細かいものが写っていないようにする必要があります。次のいくつかの例は、同じ男性がそれぞれ異なる表情をした4つのイメージを示しています。

トレーニングのためのイメージの選択は、正確なマッチングのために重要です。次のガイドラインが適用されます。

- イメージのセットには、目を閉じたり笑ったりするなど、考え得るあらゆる構えや表情の顔を含める必要があります。

- イメージは同じサイズである必要があります。

- イメージは解像度が高く、ピクセル品質がよい必要があります。

- 非常に似ているイメージを含めることは避けてください。

- 人物をいくつかの異なる背景や照明条件の下で認識する必要がある場合は、それらの背景を持つイメージを含めます。

- 含めるイメージの数は、入力データで予想される動きや背景の多様さによって異なります。

一連のイメージ内のイメージを処理し、質の高いトレーニング・イメージを作成する方法の例は、$MMA_HOME/example/facetrain/runFaceTrainUIExample.shを参照してください

7.4.3 ビデオでの顔の検出

ビデオ内の顔を検出(認識)するには、ビデオ処理ソフトウェアでビデオ・データをトランスコードするために、次のオプションがあります。

- OpenCVで使用可能な任意の正面顔のカスケード分類器とともに、フレーム・プロセッサとしてOrdOpenCVFaceRecognizerMultiを使用します。
手始めにHaarcascade_frontalface_alt2.xmlを使用すると便利です。様々なカスケード分類器を試して、要件に合ったものを特定できます。

- サードパーティの顔認識ソフトウェアを使用します。

認識を実行するには、次の手順に従います。

1. (顔を認識するビデオを含む)ビデオ・ファイルをHDFSにコピーします。

2. これらの必要なファイルを、クラスタのすべてのノードがアクセス可能な共有の場所にコピーします。

- 生成したトレーニング・モデル

- イメージ・サブディレクトリをラベルにマップするマッピング・ファイル

- カスケード分類器XMLファイル

3. 構成ファイルを作成します。
必須構成パラメータ:

- oracle.ord.hadoop.inputtype: 入力データのタイプ(videoまたはimage)。

- oracle.ord.hadoop.outputtypes: 生成された結果の形式(JSON/テキスト/イメージ)。

- oracle.ord.hadoop.ordframegrabber: ビデオ・データからビデオ・フレームを取得します。製品で使用可能なJavaクラスを使用するか、または抽象の実装を提供できます。

- OrdJCodecFrameGrabberは製品で使用できます。このクラスは、追加のステップなしで使用できます。JCodecの詳細は、www.jcodec.orgを参照してください。

- OrdFFMPEGFrameGrabberは製品で使用できます。このクラスは、FFMPEGライブラリのインストールを必要とします。詳細は、www.ffmpeg.orgを参照してください

- oracle.ord.hadoop.ordframeprocessor: ビデオ・フレームで顔を認識するために使用するプロセッサ。製品で使用可能なJavaクラスを使用するか、または抽象の実装を提供できます。製品で使用できるクラスは次のとおりです。

- 顔認識用のoracle.ord.hadoop.mapreduce.OrdOpenCVFaceRecognize。

- 顔検出用のoracle.ord.hadoop.demo.OrdFaceDetectionSample。

- oracle.ord.hadoop.recognizer.classifier: カスケード分類器XMLファイル。

- oracle.ord.hadoop.recognizer.labelnamefile: イメージ・サブディレクトリをラベルにマップするマッピング・ファイル。

オプションの構成パラメータ:

- oracle.ord.hadoop.frameinterval: 処理されるフレーム間の時間間隔(秒数)。デフォルト: 1。

- oracle.ord.hadoop.numofsplits: Hadoopクラスタ上のビデオ・ファイルの分割の数で、Hadoopクラスタの各ノードで1つの分割が分析されます。デフォルト: 1。

- oracle.ord.hadoop.recognizer.cascadeclassifier.scalefactor: トレーニングで使用されたイメージと、ビデオ・フレームまたはイメージで認識された顔をマッチングするために使用されるスケール係数。デフォルト: 1.1 (スケーリングなし)

- oracle.ord.hadoop.recognizer.cascadeclassifier.minneighbor: ビデオ・フレームまたはイメージで顔を検出するためのスライディング・ウィンドウのサイズを決定します。デフォルト: 1。

- oracle.ord.hadoop.recognizer.cascadeclassifier.flags: 顔検出のタイプを決定します。

- oracle.ord.hadoop.recognizer.cascadeclassifier.minsize: 顔の検出に使用される最小の境界ボックス。

- oracle.ord.hadoop.recognizer.cascadeclassifier.maxsize: 顔の検出に使用される最大の境界ボックス。

- oracle.ord.hadoop.recognizer.cascadeclassifier.maxconfidence: 検出される顔とモデルの顔の間の最大許容距離。

- oracle.ord.hadoop.ordframeprocessor.k2: OrdFrameProcessorの実装クラスのキー・クラス。

- oracle.ord.hadoop.ordframeprocessor.v2: OrdFrameProcessorの実装クラスの値クラス。

4. 顔を認識するHadoopジョブを実行します。次の形式でコマンドを入力します。

$ hadoop jar $MMA_HOME/lib/orhadoop-multimedia-analytics.jar -conf <conf file> <hdfs_input_directory_containing_video_data> <hdfs_output_directory_to_write_results>

構成ファイルでoracle.ord.hadoop.ordframeprocessorプロパティが必要な値で指定されていることを確認してください。

顔の検出の正確さは、照明、明度、顔の向き、カメラから顔までの距離、ビデオまたはイメージの鮮明さなど、様々な要因によって決まります。複数の構成プロパティを試して、ユースケースに最も適した値のセットを特定する必要があります。偽陽性(顔が異なるオブジェクトの識別)と誤認(顔のラベル付けの誤り)は、常に発生する可能性があることに注意してください。

注意:
$MMA_HOME/exampleには、サンプル・ファイルのセットがあります。 これには、Java CLASSPATHを設定するためのスクリプトが含まれています。必要に応じて編集し、顔を検出するジョブを発行します。

7.4.4 イメージでの顔の検出

イメージ上の顔を検出するには、イメージをHDFSにコピーします。次のプロパティを指定します。

<property>
<name>oracle.ord.hadoop.inputtype</name>
<value>image</value>
</property>

7.4.5 Oracle NoSQL Databaseの操作

Oracle NoSQL Databaseを使用すると、イメージなどの小さいオブジェクトを操作するときにパフォーマンスが向上します。イメージは、Oracle NoSQL Databaseに格納し、マルチメディア分析フレームワークによってアクセスできます。入力データがビデオである場合、ビデオをフレームにデコードし、フレームをOracle NoSQL Databaseに格納する必要があります。HDFSまたはHBaseを使用して、マルチメディア処理の出力を格納できます。

Oracle NoSQL Database Release 4.3以降、ユーザー認証がデフォルトで有効になります。Oracle NoSQL Databaseを使用する場合、ユーザー・アクセスを認証するためのメカニズムを設定する必要があります。$MMA_HOME/example/kvliteでデモを構成する手順は、$MMA_HOME/example/README.txtを参照してください。

入力がOracle NoSQL Database内にある場合、次のプロパティが必要です。

- oracle.ord.hadoop.datasource – 入力データの記憶域オプション。入力データがOracle NoSQL Database内にある場合、kvstoreを指定します。デフォルトはHDFSです。

- oracle.ord.kvstore.input.name – NoSQL Database記憶域の名前。

- oracle.ord.kvstore.input.table – NoSQL Database表の名前。

- oracle.ord.kvstore.input.hosts – ホスト名およびポート。

- oracle.ord.kvstore.input.primarykey – 表内のレコードにアクセスするための主キー。

- oracle.ord.hadoop.datasink – マルチメディア分析の出力の記憶域オプション。デフォルトはHDFSです。出力を格納するためにHBase表を使用する場合、HBaseを指定します。

関連項目

- ブログ投稿: "Oracle NoSQL Databaseによるデータ・セットの保管"

- Oracle NoSQL Databaseセキュリティ・ガイド

- Oracle NoSQL Databaseのドキュメント

7.4.6 Apache HBaseの操作

Apacheを使用すると、イメージなどの小さいオブジェクトを操作するときにパフォーマンスが向上します。イメージは、HBase表に格納し、マルチメディア分析フレームワークによってアクセスできます。入力データがビデオである場合、ビデオをフレームにデコードし、フレームをHBase表に格納する必要があります。

入力または出力がHBase表内にある場合、次のプロパティが使用されます。

- oracle.ord.hadoop.datasource – 入力データの記憶域オプション。入力データがHBase表内にある場合、HBaseを指定します。デフォルトはHDFSです。

- oracle.ord.hbase.input.table – 入力データが含まれるHBase表の名前。

- oracle.ord.hbase.input.columnfamily – 入力データが含まれるHBase列ファミリの名前。

- oracle.ord.hbase.input.column – 入力データが含まれるHBase列の名前。

- oracle.ord.hadoop.datasink – マルチメディア分析の出力の記憶域オプション。出力を格納するためにHBase表を使用する場合、HBaseを指定します。デフォルトはHDFSです。

- oracle.ord.hbase.output.columnfamily – 出力HBase表内のHBase列ファミリの名前。

7.4.7 顔検出の例およびトレーニング資料

顔の検出を始める際に役立つように、いくつかの例とトレーニング資料が提供されています。

$MMA_HOMEには次のディレクトリがあります。

video/ (contains a sample video file in mp4 and avi formats)
facetrain/
analytics/

facetrain/にはトレーニングの例が含まれています。facetrain/config/にはサンプル構成ファイルが含まれており、facetrain/faces/には、トレーニング・モデルを作成するためのイメージと、イメージにラベルをマップするマッピング・ファイルが含まれています。

runFaceTrainExample.shは、トレーニング手順を実行するためのbashのスクリプト例です。

次のようにして、トレーニング・モデルを作成できます。

$ ./runFaceTrainExample.sh

トレーニング・モデルはordfacemodel_bigdata.datに書き込まれます。

ビデオでの顔の検出について、analytics/には、入力ビデオ・ファイルで顔を検出するためのHadoopジョブの実行例が含まれています。このディレクトリには、構成ファイルの例を含むconf/が含まれています。

次のようにして、ジョブを実行できます(HDFSディレクトリvinputへのビデオ・ファイルのコピーも含みます)

$ ./runFaceDetectionExample.sh

ジョブの出力はHDFSディレクトリvoutputに含められます。

ビデオでの顔の認識について、analytics/には、入力ビデオ・ファイルで顔を認識するためのHadoopジョブの実行例が含まれています。このディレクトリには、構成ファイルの例を含むconf/が含まれています。次のようにして、ジョブを実行できます(HDFSディレクトリvinputへのビデオ・ファイルのコピーも含みます):

$ ./runFaceRecognizerExample.sh

顔認識ジョブの後、出力イメージを表示できます。

$ ./runPlayImagesExample.sh

7.5 マルチメディア分析の構成プロパティ

マルチメディア分析フレームワークでは、hadooopコマンドで構成プロパティを指定するために標準メソッドを使用します。

構成ファイルを指定する場合は–confオプションを使用し、個別のプロパティを指定する場合は-Dオプションを使用します。

このトピックでは、次のサブトピックに分けられた構成プロパティに関する参照情報を示します。

- 格納されたビデオおよびイメージの処理用のプロパティの構成

- ストリーミング・ビデオの処理用のプロパティの構成

- トレーニング・イメージおよび顔認識用のプロパティの構成

7.5.1 格納されたビデオおよびイメージの処理用のプロパティの構成

マルチメディア分析フレームワークの構成プロパティのこのカテゴリは、格納されているビデオおよびイメージの処理に適用されます。

これらのプロパティ名はすべてoracle.ordから始まります。これらは、2つのサブカテゴリに分けることができます。

- 一般的なフレームワーク・プロパティ

- 顔認識プロパティ(文字列recognizerが含まれます)

各サブカテゴリ内では、使用可能な構成プロパティがアルファベット順にリストされます。各プロパティについて、プロパティ名をリストし、その次にそのプロパティに関する情報を示します。

一般的なフレームワーク・プロパティ

oracle.ord.hadoop.datasink

文字列。マルチメディア分析の出力の記憶域オプション: HBase表を使用して出力を格納する場合はHBase、それ以外の場合はHDFSです。デフォルト値: HDFS。例:

<property>
<name>oracle.ord.hadoop.datasink</name>
<value>hbase</value>
</property>

oracle.ord.hadoop.datasource

文字列。入力データの記憶域オプション: 入力データがHBaseデータベース内にある場合はHBase、入力データがOracle NoSQL Database内にある場合はkvstore、それ以外の場合はHDFSです。デフォルト値: HDFS: 例:

<property>
<name>oracle.ord.hadoop.datasource</name>
<value>hbase</value>
</property>

oracle.ord.hadoop.frameinterval

文字列。処理のためにフレームを抽出するタイムスタンプ間隔(秒)。許容値: 正の整数および浮動小数点数。デフォルト値: 1。例:

<property>
<name>oracle.ord.hadoop.frameinterval</name>
<value>1</value>
</property>

oracle.ord.hadoop.inputformat

文字列。フレームワーク内の入力ファイル・タイプを表す、フレームワーク内のInputFormatクラス名。デフォルト値: oracle.ord.hadoop.OrdVideoInputFormat。例:

<property>
<name>oracle.ord.hadoop.inputformat</name>
<value>oracle.ord.hadoop.OrdVideoInputFormat</value>
</property>

oracle.ord.hadoop.inputtype

文字列。入力データのタイプ: videoまたはimage。例:

<property>
<name>oracle.ord.hadoop.inputtype</name>
<value>video</value>
</property>

oracle.ord.hadoop.numofsplits

正の整数。Hadoopクラスタ上のビデオ・ファイルの分割の数で、Hadoopクラスタの各ノードで1つの分割を分析できます。推奨値: クラスタのノード/プロセッサの数。デフォルト値: 1。例:

<property>
<name>oracle.ord.hadoop.numofsplits</name>
<value>1</value>
</property>

oracle.ord.hadoop.ordfacemodel

文字列。トレーニングによって作成されたモデルを格納するファイルの名前。例:

<property>
<name> oracle.ord.hadoop.ordfacemodel </name>
<value>ordfacemodel_bigdata.dat</value>
</property>

oracle.ord.hadoop.ordfacereader

文字列。顔認識モデルのトレーニングに使用されるイメージを読み込むJavaクラスの名前。例:

<property>
<name> oracle.ord.hadoop.ordfacereader </name>
<value> oracle.ord.hadoop.OrdSimpleFaceReader </value>
</property>

oracle.ord.hadoop.ordfacereaderconfig

文字列。特定のアプリケーション用の追加の構成プロパティを含むファイル。例:

<property>
<name> oracle.ord.hadoop.ordfacereaderconfig </name>
<value>config/ordsimplefacereader_bigdata.xml</value>
</property>

oracle.ord.hadoop.ordframegrabber

文字列。ビデオ・ファイルをデコードするJavaクラスの名前。これはOrdFrameGrabberの実装済クラスで、ビデオ・ファイルをデコードするためにマッパーによって使用されます。製品で使用可能なインストール済の実装: oracle.ord.hadoop.OrdJCodecFrameGrabber (デフォルト)およびoracle.ord.hadoop.OrdFFMPEGFrameGrabber (ユーザーによってFFMPEGがインストールされている場合)。カスタム実装を追加できます。例:

<property>
<name>oracle.ord.hadoop.ordframegrabber</name>
<value>oracle.ord.hadoop.OrdJCodecFrameGrabber</value>
</property>

oracle.ord.hadoop.ordframeprocessor

文字列。フレームの処理および対象オブジェクトの認識のためにマッパーによって使用される、インタフェースOrdFrameProcessorの実装済Javaクラスの名前。デフォルト値: oracle.ord.hadoop.mapreduce.OrdOpenCVFaceRecognizerMulti。例:

<property>
<name>oracle.ord.hadoop.ordframeprocessor </name>
<value>oracle.ord.hadoop.mapreduce.OrdOpenCVFaceRecognizerMulti</value>
</property>

oracle.ord.hadoop.ordframeprocessor.k2

文字列。Javaクラス名、インタフェースOrdFrameProcessorの実装済クラスの出力キー・クラス。デフォルト値: org.apache.hadoop.io.Text。例:

<property>
<name>oracle.ord.hadoop.ordframeprocessor.k2</name>
<value>org.apache.hadoop.io.Text</value>
</property>

oracle.ord.hadoop.ordframeprocessor.v2

文字列。Javaクラス名、インタフェースOrdFrameProcessorの実装済クラスの出力値クラス。デフォルト値: oracle.ord.hadoop.mapreduce.OrdImageWritable。例:

<property>
<name>oracle.ord.hadoop.ordframeprocessor.v2 </name>
<value>oracle.ord.hadoop.mapreduce.OrdImageWritable</value>
</property>

oracle.ord.hadoop.ordoutputprocessor

文字列。カスタム(ユーザー指定)プラグインにのみ関連します。Reduceフェーズでマップ出力からのキー値ペアを処理する、インタフェースOrdOutputProcessorの実装済Javaクラスの名前です。例:

<property>
<name>oracle.ord.hadoop.ordframeprocessor</name>
<value>mypackage.MyOutputProcessorClass</value>
</property>

oracle.ord.hadoop.ordsimplefacereader.dirmap

文字列。顔ラベルをディレクトリ名と顔イメージにマップするマッピング・ファイル。例:

<property>
<name> oracle.ord.hadoop.ordsimplefacereader.dirmap </name>
<value>faces/bigdata/dirmap.txt</value>
</property>

oracle.ord.hadoop.ordsimplefacereader.imagedir

文字列。モデルの作成に使用される顔を含む、ファイル・システム・ディレクトリ。これは通常、ローカルのファイル・システムです。例:

<property>
<name> oracle.ord.hadoop.ordsimplefacereader.imagedir </name>
<value>faces/bigdata</value>
</property>

oracle.ord.hadoop.outputformat

文字列。フレームワーク内の出力ファイル・タイプを表すOutputFormatクラスの名前。デフォルト値: org.apache.hadoop.mapreduce.lib.output.TextOutputFormat。例:

<property>
<name>oracle.ord.hadoop.outputformat</name>
<value> org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; </value>
</property>

oracle.ord.hadoop.outputtype

文字列。識別される顔の顔ラベルとタイムスタンプ、場所および一致の信頼度を含む出力の形式は、json、imageまたはtextである必要があります。例:

<property>
<name>oracle.ord.hadoop.outputtype</name>
<value>json</value>
</property>

oracle.ord.hadoop.parameterfile

文字列。特定のジョブ用の追加の構成プロパティを含むファイル。例:

<property>
<name>oracle.ord.hadoop.parameterfile </name>
<value>oracle_multimedia_face_recognition.xml</value>
</property>

oracle.ord.hadoop.recognizer.cascadeclassifier.flags

文字列。このプロパティは、オブジェクト検出のタイプを選択するために使用します。CASCADE_DO_CANNY_PRUNING、CASCADE_SCALE_IMAGE、CASCADE_FIND_BIGGEST_OBJECT (最も大きい顔のみを調べます)またはCASCADE_DO_ROUGH_SEARCHである必要があります。デフォルト: CASCADE_SCALE_IMAGE | CASCADE_DO_ROUGH_SEARCH。例:

<property>
<name> oracle.ord.hadoop.recognizer.cascadeclassifier.flags</name>
<value>CASCADE_SCALE_IMAGE</value>
</property>

oracle.ord.hadoop.recognizer.cascadeclassifier.maxconfidence

浮動小数点値。モデルの顔と入力データの顔の間に許容される距離(差異)を指定します。値が大きいと一致率は高くなりますが、精度が低くなります(偽陽性が多くなります)。値が小さいと一致率は減りますが、精度が上がります。例:

<property>
<name> oracle.ord.hadoop.recognizer.cascadeclassifier.maxconfidence</name>
<value>200.0</value>
</property

oracle.ord.hbase.input.column

文字列。入力データが含まれるHBase列の名前。例:

<property>
<name>oracle.ord.hbase.input.column</name>
<value>binary_data</value>
</property>

oracle.ord.hbase.input.columnfamily

文字列。入力データが含まれるHBase列ファミリの名前。例:

<property>
<name>oracle.ord.hbase.input.columnfamily</name>
<value>image_data</value>
</property>

oracle.ord.hbase.input.table

文字列。入力データが含まれるHBase表の名前。例:

<property>
<name>oracle.ord.hbase.input.table</name>
<value>images</value>
</property>

oracle.ord.hbase.output.columnfamily

文字列。出力HBase表内のHBase列ファミリの名前。例:

<property>
<name>oracle.ord.hbase.output.columnfamily</name>
<value>face_data</value>
</property>

oracle.ord.hbase.output.table

文字列。出力データのHBase表の名前。例:

<property>
<name>oracle.ord.hbase.output.table</name>
<value>results</value>
</property>

oracle.ord.kvstore.get.consistency

文字列。読込み時の整合性制約を定義します。読込み操作は、マスターまたはレプリカ・ノードで処理できます。デフォルト値のABSOLUTEの場合、読込み操作がマスター・ノードで処理されることを確認できます。例:

<property>
<name>oracle.ord.kvstore.get.consistency</name>
<value>absolute</value>
</property>

oracle.ord.kvstore.get.timeout

数字。ラージ・オブジェクトのチャンクまたはその関連メタデータを取得するための時間間隔の上限。指定された限度を超えないよう最善が尽くされます。ゼロの場合、KVStoreConfig.getLOBTimeout(java.util.concurrent.TimeUnit)値が使用されます。デフォルト値は5です。例:

<property>
<name>oracle.ord.kvstore.get.timeout</name>
<value>5</value>
</property>

oracle.ord.kvstore.get.timeunit

文字列。timeoutパラメータの単位をNULLにできるのは、timeoutがゼロである場合のみです。デフォルト値はsecondsです。例:

<property>
<name>oracle.ord.kvstore.get.timeunit</name>
<value>seconds</value>
</property>

oracle.ord.kvstore.input.hosts

文字列。Oracle NoSQL Databaseストア内のアクティブなノードのホストおよびポート。例:

<property>
<name>oracle.ord.kvstore.input.hosts</name>
<value>localhost:5000</value>
</property>

oracle.ord.kvstore.input.lob.prefixおよびoracle.ord.kvstore.input.lob.suffix

Oracle NoSQL Databaseは、これらを使用して、ラージ・オブジェクト(LOB)をロードおよび取得するために使用するキーを作成します。oracle.ord.kvstore.input.lob.prefixのデフォルト値はlobprefixです。oracle.ord.kvstore.input.lob.suffixのデフォルト値はlobsuffix.lobです。例:

<property>
<name>oracle.ord.kvstore.lob.prefix</name>
<value>lobprefix</value>
</property>
<property>
<name>oracle.ord.kvstore.lob.suffix</name>
<value>lobsuffix.lob</value>
</property>

oracle.ord.kvstore.input.name

文字列。Oracle NoSQL Databaseストアの名前。ここで指定する名前は、ストアをインストールしたときに使用した名前と同一である必要があります。例:

<property>
<name>oracle.ord.kvstore.input.name</name>
<value>kvstore</value>
</property>

oracle.ord.kvstore.input.primarykey

文字列。Oracle NoSQL Database表の主キー。例:

<property>
<name>oracle.ord.kvstore.input.primarykey</name>
<value>filename</value>
</property>

oracle.ord.kvstore.input.table

文字列。入力データが含まれるOracle NoSQL Database表の名前。例:

<property>
<name>oracle.ord.kvstore.input.table</name>
<value>images</value>
</property>

顔認識プロパティ(文字列recognizerが含まれます)

oracle.ord.hadoop.recognizer.cascadeclassifier.flags

文字列。このプロパティは、オブジェクト検出のタイプを選択するために使用します。CASCADE_DO_CANNY_PRUNING、CASCADE_SCALE_IMAGE、CASCADE_FIND_BIGGEST_OBJECT (最も大きい顔のみを調べます)またはCASCADE_DO_ROUGH_SEARCHである必要があります。デフォルト: CASCADE_SCALE_IMAGE | CASCADE_DO_ROUGH_SEARCH。例:

<property>
<name> oracle.ord.hadoop.recognizer.cascadeclassifier.flags</name>
<value>CASCADE_SCALE_IMAGE</value>
</property>

oracle.ord.hadoop.recognizer.cascadeclassifier.maxconfidence

浮動小数点値。モデルの顔と入力データの顔の間に許容される距離(差異)を指定します。値が大きいと一致率は高くなりますが、精度が低くなります(偽陽性が多くなります)。値が小さいと一致率は減りますが、精度が上がります。例:

<property>
<name> oracle.ord.hadoop.recognizer.cascadeclassifier.maxconfidence</name>
<value>200.0</value>
</property

oracle.ord.hadoop.recognizer.cascadeclassifier.maxsize

文字列(具体的には値のペア)。検出されるオブジェクトの境界ボックスの最大サイズを指定します。オブジェクトが近いと境界ボックスが大きくなり、海辺での顔のようにオブジェクトが遠いと、境界ボックスが小さくなります。境界ボックスが最大サイズよりも大きいオブジェクトは無視されます。例:

<property>
<name> oracle.ord.hadoop.recognizer.cascadeclassifier.maxsize</name>
<value>(500,500)</value>
</property>

oracle.ord.hadoop.recognizer.cascadeclassifier.minneighbor

整数。入力データでオブジェクトを検出するために使用される、スライディング・ウィンドウのサイズを決定します。値が高いほど、検出されるオブジェクトは少なくなりますが、品質は高くなります。デフォルト値: 1。例:

<property>
<name> oracle.ord.hadoop.recognizer.cascadeclassifier.minneighbor</name>
<value>1</value>
</property>

oracle.ord.hadoop.recognizer.cascadeclassifier.minsize

文字列(具体的には値のペア)。検出されるオブジェクトの境界ボックスの最小サイズを指定します。オブジェクトが近いと境界ボックスが大きくなり、海辺での顔のようにオブジェクトが遠いと、境界ボックスが小さくなります。境界ボックスが最小サイズよりも小さいオブジェクトは無視されます。例:

<property>
<name> oracle.ord.hadoop.recognizer.cascadeclassifier.minsize</name>
<value>(100,100)</value>
</property>

oracle.ord.hadoop.recognizer.cascadeclassifier.scalefactor

浮動小数点数。顔ラベルをディレクトリ名と顔イメージにマップするマッピング・ファイルとともに使用される、スケーリング係数。値1.1は、ランタイム入力の顔とトレーニング・プロセス中にサブディレクトリに格納されたイメージを比較する前に、スケーリングされないことを意味します。例:

<property>
<name> oracle.ord.hadoop.recognizer.cascadeclassifier.scalefactor</name>
<value>1.1</value>
</property>

oracle.ord.hadoop.recognizer.classifier

文字列。顔の分類器を含むXMLファイル。この機能は、OpenCVで使用可能な任意の正面顔のトレーニング前の分類器とともに使用できます。例:

<property>
<name> oracle.ord.hadoop.recognizer.classifier</name>
<value>haarcascade_frontalface_alt2.xml</value>
</property>

oracle.ord.hadoop.recognizer.labelnamefile

文字列。顔ラベルをディレクトリ名と顔イメージにマップするマッピング・ファイル。例:

<property>
<name> oracle.ord.hadoop.recognizer.labelnamefiler</name>
<value>haarcascade_frontalface_alt2.xml</value>
</property>

oracle.ord.hadoop.recognizer.modelfile

文字列。トレーニング・ステップで生成されたモデルを含むファイル。このファイルは、すべてのクラスタ・ノードがアクセスできる共有の場所に格納する必要があります。例:

<property>
<name> oracle.ord.hadoop.recognizer.modelfile</name>
<value>myface_model.dat</value>
</property>

7.5.2 ストリーミング・ビデオの処理用のプロパティの構成

マルチメディア分析フレームワークの構成プロパティのこのカテゴリは、ストリーミング・ビデオの処理に適用されます。

これらのプロパティ名はすべてspark.oracle.ordから始まります。これらは、2つのサブカテゴリに分けることができます。

- 一般的なフレームワーク・プロパティ

- 顔認識および顔検出プロパティ(文字列recognizerが含まれます)

各サブカテゴリ内では、使用可能な構成プロパティがアルファベット順にリストされます。各プロパティについて、プロパティ名をリストし、その次にそのプロパティに関する情報を示します。

一般的なフレームワーク・プロパティ

spark.oracle.ord.demo.imageplayer.framerate

文字列。サンプル・イメージ・プレーヤによって結果が処理の結果が含まれるフレームとして表示される場合のフレーム・レート。プレーヤにより、新しいフレームがn秒ごとに表示されます。デフォルトは1です。

例:

spark.oracle.ord.demo.imageplayer.framerate=1

spark.oracle.ord.demo.localfswriter.outputcsvpath

文字列。ビデオ・フレーム処理のCSV出力を受け取るローカルのファイル・システム・ディレクトリ。例:

spark.oracle.ord.demo.localfswriter.outputcsvpath=/home/oracle/example/spark/facerecognizer/output/csv

spark.oracle.ord.demo.localfswriter.outputimagepath

文字列。ビデオ・フレーム処理のイメージ出力を受け取るローカルのファイル・システム・ディレクトリ。例:

spark.oracle.ord.demo.localfswriter.outputimagepath=/home/oracle/example/spark/facerecognizer/output/image

spark.oracle.ord.demo.localfswriter.outputjsonpath

文字列。ビデオ・フレーム処理のJSON出力を受け取るローカルのファイル・システム・ディレクトリ。例:

spark.oracle.ord.demo.localfswriter.outputjsonpath=/home/oracle/example/spark/facerecognizer/output/json

spark.oracle.ord.inputdirectory

文字列。Sparkストリーミング・アダプタからビデオ・フレームを受け取るHDFSディレクトリ。例:

spark.oracle.ord.inputdirectory=spark_input

spark.oracle.ord.demo.localfswriter.outputimagepath

文字列。ビデオ・フレーム処理のイメージ出力を受け取るローカルのファイル・システム・ディレクトリ。例:

spark.oracle.ord.demo.localfswriter.outputimagepath=/home/oracle/example/spark/facerecognizer/output/image

spark.oracle.ord.demo.localfswriter.outputjsonpath

文字列。ビデオ・フレーム処理のJSON出力を受け取るローカルのファイル・システム・ディレクトリ。例:

spark.oracle.ord.demo.localfswriter.outputjsonpath=/home/oracle/example/spark/facerecognizer/output/json

spark.oracle.ord.ordsparkframeprocessor

文字列。ビデオ・フレームを処理するために使用するプロセッサ。顔検出および認識用として製品で使用可能なJavaクラスを使用するか、または抽象の実装を提供できます。次に例を示します。

- spark.oracle.ord.ordsparkframeprocessor=oracle.ord.spark.demo.OrdSparkFaceDetectorは、ビデオ・フレーム内に顔があることを検出します。

- spark. oracle.ord.ordsparkframeprocessor=oracle.ord.spark.demo.OrdSparkFaceRecognizerは、トレーニング・モデルを使用して顔を識別します。

OrdSparkFaceDetectorおよびOrdSparkFaceRecognizerは、spark.oracle.ord.ordsparkframeprocessorとともに使用するサンプル実装として製品で使用できます。

spark.oracle.ord.ordsparkresultwriter

文字列。ビデオ・フレームを再生するイメージ・プレーヤを実装するクラスの名前。例:

spark.oracle.ord.ordsparkresultwriter=oracle.ord.spark.demo.OrdSparkImagePlayer

spark.oracle.ord.outputdirectory

文字列。ビデオ・フレーム処理の出力を受け取るHDFSディレクトリ。例:

spark.oracle.ord.outputdirectory=spark_output

spark.oracle.ord.outputtypes

文字列。生成された結果の形式(JSON/CSV/image)。例:

spark.oracle.ord.outputtypes=JSON

spark.oracle.ord.streamingduration

数字。バッチとして処理されるフレーム・セットを決定する時間間隔。単位はミリ秒です。デフォルトは5です。例:

spark.oracle.ord.streamingduration=5

spark.oracle.ord.streamsink

文字列。Sparkジョブ・プロセスの出力。デフォルトでは、出力はHDFSに書き込まれますが、カスタム・ライターを実装できます。製品には、ローカル・ファイル・システムおよびイメージ・プレーヤに書き込むためのカスタム・ライターが含まれています。例:

spark.oracle.ord.streamsink=HDFS

spark.oracle.ord.streamsource

Sparkジョブの入力データ。これには、HTTPまたはRTSPストリーミング・サーバーまたはHDFSを使用できます。デフォルトはHDFSです。例:

spark.oracle.ord.streamsource=HDFS

顔認識および顔検出プロパティ(文字列recognizerが含まれます)

spark.oracle.ord.recognizer.classifier

文字列。顔の分類器を含むXMLファイル。この機能は、OpenCVで使用可能な任意の正面顔のトレーニング前の分類器とともに使用できます。例:

spark.oracle.ord.recognizer.classifier=haarcascade_frontalface_alt2_opencv3.0.xml

spark.oracle.ord.recognizer.flags

文字列。このプロパティは、オブジェクト検出のタイプを選択するために使用します。CASCADE_DO_CANNY_PRUNING、CASCADE_SCALE_IMAGE、CASCADE_FIND_BIGGEST_OBJECT (最も大きい顔のみを調べます)またはCASCADE_DO_ROUGH_SEARCHである必要がありますデフォルト: CASCADE_SCALE_IMAGE | CASCADE_DO_ROUGH_SEARCH。例:

spark.oracle.ord.recognizer.flags=CASCADE_SCALE_IMAGE|CASCADE_DO_ROUGH_SEARCH

spark.oracle.ord.recognizer.gridx

数字。ヒストグラムを抽出するために各フレームで使用されるX軸上のグリッド・セルの数。通常の値は8です。値が大きくなるほど、結果として生成される機能ベクトルの次元が高くなります。例:

spark.oracle.ord.recognizer.gridx=8

spark.oracle.ord.recognizer.gridy

数字。ヒストグラムを抽出するために各フレームで使用されるY軸上のグリッド・セルの数。通常の値は8です。次に例を示します。

spark.oracle.ord.recognizer.gridy=8

spark.oracle.ord.recognizer.labelfilepath

文字列。顔ラベルをディレクトリ名と顔イメージにマップするマッピング・ファイル。例:

spark.oracle.ord.recognizer.labelfilepath=faces/bigdata/dirmap.txt

spark.oracle.ord.recognizer.maxsize

文字列。検出されたオブジェクトの境界ボックスの最大サイズを(XおよびY軸上のピクセルの数として)指定します。オブジェクトが近いと境界ボックスが大きくなり、海辺での顔のようにオブジェクトが遠いと、境界ボックスが小さくなります。境界ボックスが最大サイズよりも大きいオブジェクトは無視されます。例:

spark.oracle.ord.recognizer.maxsize=500

spark.oracle.ord.recognizer.minneighbors

整数。使用可能なオプションは1、2または3です。1の場合、より多くの顔が認識されますが、顔でないオブジェクトが認識される可能性があります。3が最も正確ですが、一部の顔を検出し損なう可能性があります。例:

spark.oracle.ord.recognizer.minneighbors=1

spark.oracle.ord.recognizer.minsize

文字列。検出されたオブジェクトの境界ボックスの最小サイズを(XおよびY軸上のピクセルの数として)指定します。オブジェクトが近いと境界ボックスが大きくなり、海辺での顔のようにオブジェクトが遠いと、境界ボックスが小さくなります。境界ボックスが最小サイズよりも小さいオブジェクトは無視されます。例:

spark.oracle.ord.recognizer.minsize=100

spark.oracle.ord.recognizer.neighbors

数字。円形のローカル・バイナリ・パターンを作成するためのサンプル・ポイントの数。例:

spark.oracle.ord.recognizer.neighbors=8

spark.oracle.ord.recognizer.scalefactor

浮動小数点数。アルゴリズムがイメージに対して複数のパスを作成する際にスケールを拡大する速度を指定します。この値を大きくすると、(パスの数が減るために)ディテクタがより高速に動作しますが、非常に大きい値にすると、新しいスケールにジャンプするために情報をとり逃す可能性があります。デフォルトは1.1です。これは、パスごとにスケールが10%ずつ大きくなることを意味します。このパラメータには、値1.1、1.2、1.3または1.4を使用できます。例:

spark.oracle.ord.recognizer.scalefactor=1.1

spark.oracle.ord.recognizer.threshold

数字。顔が一致するかどうかを決定する値。顔をビデオ内の顔と比較する際の出力値がこの値より大きい場合、この顔は一致しないと見なされます。それ以外の場合は、一致すると見なされます。デフォルトは130です。例:

spark.oracle.ord.recognizer.threshold=130

spark.oracle.ord.recognizer.trainingmodelpath

文字列。トレーニングによって作成されたモデルを格納するファイルの名前。例:

spark.oracle.ord.recognizer.trainingmodelpath=ordfacemodel_bigdata.data

7.5.3 トレーニング・イメージおよび顔認識用のプロパティの構成

マルチメディア分析フレームワークの構成プロパティのこのカテゴリは、顔認識のイメージのトレーニングに適用されます。

これらのプロパティには文字列faceが含まれ、これらはアルファベット順にリストされます。各プロパティについて、プロパティ名をリストし、その次にそのプロパティに関する情報を示します。

oracle.ord.hadoop.ordfacemodel

文字列。トレーニングによって作成されたモデルを格納するファイルの名前。例:

<property>
<name> oracle.ord.hadoop.ordfacemodel </name>
<value>ordfacemodel_bigdata.dat</value>
</property>

oracle.ord.hadoop.ordfacereader

文字列。顔認識モデルのトレーニングに使用されるイメージを読み込むJavaクラスの名前。例:

<property>
<name> oracle.ord.hadoop.ordfacereader </name>
<value> oracle.ord.hadoop.OrdSimpleFaceReader </value>
</property>

oracle.ord.hadoop.ordfacereaderconfig

文字列。特定のアプリケーション用の追加の構成プロパティを含むファイル。例:

<property>
<name> oracle.ord.hadoop.ordfacereaderconfig </name>
<value>config/ordsimplefacereader_bigdata.xml</value>
</property>

oracle.ord.hadoop.ordsimplefacereader.dirmap

文字列。顔ラベルをディレクトリ名と顔イメージにマップするマッピング・ファイル。例:

<property>
<name> oracle.ord.hadoop.ordsimplefacereader.dirmap </name>
<value>faces/bigdata/dirmap.txt</value>
</property>

oracle.ord.hadoop.ordsimplefacereader.imagedir

文字列。モデルの作成に使用される顔を含む、ファイル・システム・ディレクトリ。これは通常、ローカルのファイル・システムです。例:

<property>
<name> oracle.ord.hadoop.ordsimplefacereader.imagedir </name>
<value>faces/bigdata</value>
</property>

7.6 サードパーティ・ソフトウェアとマルチメディア分析フレームワークの併用

マルチメディアのデコードおよび処理のために、カスタム・モジュールを実装およびインストールできます。

抽出クラスoracle.ord.hadoop.decoder.OrdFrameGrabberを実装することにより、フレームワークでカスタム・ビデオ・デコーダを使用できます。詳細は、Javadocを参照してください。製品には、JCodecおよびFFMPEG用にOrdFrameGrabberを拡張するビデオ・デコーダの実装が2つ含まれています(FFMPEGは別途インストールする必要があります)。

2つの抽出クラスを実装することにより、フレームワークでカスタム・マルチメディア分析を使用できます。

- oracle.ord.hadoop.mapreduce.OrdFrameProcessor<K1,V1,K2,V2>。OrdFrameProcessorの拡張クラスは、ビデオ・フレームまたはイメージを処理するMapReduceジョブのMapフェーズで使用されます。(K1, V1)は入力キー値ペア・タイプで、(K2, V2)は出力キー値ペア・タイプです。詳細は、Javadocを参照してください。製品には、OpenCVを使用した実装が含まれています。

- oracle.ord.hadoop.mapreduce.OrdOutputProcessor<K1,V1,K2,V2>。OrdFrameProcessorの拡張クラスは、ビデオ・フレームまたはイメージを処理するMapReduceジョブのReducerフェーズで使用されます。(K1, V1)は入力キー値ペア・タイプで、(K2, V2)は出力キー値ペア・タイプです。詳細は、Javadocを参照してください。ほとんどの実装は、このクラスの実装を必要としません。

フレームワーク構成パラメータの例は、$MMA_HOME/example/analytics/conf/oracle_multimedia_analysis_framework.xmlにあります。

7.7 出力のイメージの表示

出力がイメージとして表示される場合、oracle.ord.hadoop.OrdPlayImagesを使用して、出力HDFSディレクトリ内のすべてのイメージを表示できます。

これは、識別された顔のラベルでマークされたイメージ・フレームを表示します。次に例を示します。

$ java oracle.ord.hadoop.demo.OrdPlayImages –hadoop_conf_dir $HADOOP_CONF_DIR –image_file_dir voutput

A 同梱されているソフトウェアのサード・パーティ・ライセンス

Oracle Big Data Spatial and Graphは、複数のサード・パーティ製品をインストールします。この付録では、すべてのApache Licensed Codeに適用される情報、およびインストールされているサード・パーティ製品のライセンス情報を示します。

- Apache Licensed Code

- ANTLR 3

- AOP Alliance

- Apache Commons CLI

- Apache Commons Codec

- Apache Commons Collections

- Apache Commons Configuration

- Apache Commons IO

- Apache Commons Lang

- Apache Commons Logging

- Apache Commons VFS

- Apache fluent

- Apache Groovy

- Apache htrace

- Apache HTTP Client

- Apache HTTPComponents Core

- Apache Jena

- Apache Log4j

- Apache Lucene

- Apache Tomcat

- Apache Xerces2

- Apache xml-commons

- Argparse4j

- check-types

- Cloudera CDH

- cookie

- Fastutil

- functionaljava

- GeoNamesデータ

- Geospatial Data Abstraction Library (GDAL)

- Google Guava

- Google Guice

- Google protobuf

- int64-native

- Jackson

- Jansi

- JCodec

- Jettison

- JLine

- Javassist

- json-bignum

- Jung

- Log4js

- MessagePack

- Netty

- Node.js

- node-zookeeper-client

- OpenCV

- rxjava-core

- Slf4j

- Spoofax

- Tinkerpop Blueprints

- Tinkerpop Gremlin

- Tinkerpop Pipes

A.1 Apache Licensed Code

次に示すものは、Apache 2.0 Licenseの条件に従って予告として含まれ、Apache 2.0ライセンスの基に使用許諾されているすべてのプログラムに適用されます。

Apache License Version 2.0 (「ライセンス」)に従わない場合は、これらのファイルを使用することができない場合があります。

ライセンスのコピーは、次から入手できます

http://www.apache.org/licenses/LICENSE-2.0

ライセンスのコピーは次の条件で複製することができます。

適用法により求められた場合、または書面をもって同意された場合を除き、ライセンスに基づいて配布されたソフトウェアは、明示的、黙示的を問わず一切の保証または条件なしに「現状のまま」で提供されています。

特定の言語下のライセンス許諾事項および制限事項については、ライセンスを確認してください。

Apache License

Version 2.0, January 2004

http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions

"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity.For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship.For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner.For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

2. Grant of Copyright LicenseSubject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. Grant of Patent LicenseSubject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted.If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

4. RedistributionYou may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that you meet the following conditions:

a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

b) You must cause any modified files to carry prominent notices stating that You changed the files; and

c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear.The contents of the NOTICE file are for informational purposes only and do not modify the License.You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

5.Submission of ContributionsUnless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions.Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

6. TrademarksThis License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

7.Disclaimer of WarrantyUnless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

8.Limitation of LiabilityIn no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

9.Accepting Warranty or Additional LiabilityWhile redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License.However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work

To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information.(Do not include the brackets!)The text should be enclosed in the appropriate comment syntax for the file format.We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.ライセンスのコピーは、次から入手できます

http://www.apache.org/licenses/LICENSE-2.0

適用法により求められた場合、または書面をもって同意された場合を除き、ライセンスに基づいて配布されたソフトウェアは、明示的、黙示的を問わず一切の保証または条件なしに「現状のまま」で提供されています。特定の言語下のライセンス許諾事項および制限事項については、ライセンスを確認してください。

This product includes software developed by The Apache Software Foundation (http://www.apache.org/Opens a new window) (listed below):

A.2 ANTLR 3

この製品はANTLRを使用して作成され、次の条件に従ってOracleに提供されます。Copyright (c) 2010 Terence ParrAll rights reserved.Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

A.3 AOP Alliance

ライセンス: AOP Allianceで提供されるソース・コードはすべて、パブリック・ドメインです。

A.4 Apache Commons CLI

Copyright 2001-2009 The Apache Software Foundationこの製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.5 Apache Commons Codec

Copyright 2002-2009 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java contains test data from http://aspell.sourceforge.net/test/batch0.tab.

Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org).この文書全体の逐語的なコピーと配布は、この通知が保持されている場合に任意の媒体で許可されます。

A.6 Apache Commons Collections

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

Apache Commons Collections Copyright 2001-2008 The Apache Software Foundation

A.7 Apache Commons Configuration

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

Apache Commons Configuration Copyright 2001-2014 The Apache Software Foundation

A.8 Apache Commons IO

Copyright 2002-2012 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.9 Apache Commons Lang

Copyright 2001-2010 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.10 Apache Commons Logging

Copyright 2003-2007 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.11 Apache Commons VFS

Apache License Version 2.0 (「ライセンス」)に従わない場合は、これらのファイルを使用することができない場合があります。

ライセンスのコピーは、http://www.apache.org/licenses/LICENSE-2.0から入手できます。ライセンスのコピーは、このドキュメントでも複製されます。

適用法により求められた場合、または書面をもって同意された場合を除き、ライセンスに基づいて配布されたソフトウェアは、明示的、黙示的を問わず一切の保証または条件なしに「現状のまま」で提供されています。

特定の言語下のライセンス許諾事項および制限事項については、ライセンスを確認してください。

A.12 Apache fluent

Copyright © 2011-2014 The Apache Software Foundation.All rights reserved.

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.13 Apache Groovy

Copyright 2009-2015 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.14 Apache htrace

Copyright 2009-2015 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.15 Apache HTTP Client

Copyright 1999-2013 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.16 Apache HTTPComponents Core

Copyright 2005-2013 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

このプロジェクトには、JCIP-ANNOTATIONSに基づく注釈が含まれています

Copyright (c) 2005 Brian Goetz and Tim Peierls.http://www.jcip.netを参照してください

A.17 Apache Jena

Copyright 2011, 2012, 2013, 2014 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

このソフトウェアの一部は本来、次のいずれかに基づいています。

- Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Hewlett-Packard Development Company, LP

- Copyright 2010, 2011 Epimorphics Ltd.

- Copyright 2010, 2011 Talis Systems Ltd.

これらはソフトウェア認可によりApache Software Foundationに使用許諾されています。

この製品には、BSDライセンスに基づき、PluggedIn Softwareによって開発されたソフトウェアが含まれています。

この製品には、Mort Bay Consulting Ptyによって開発されたソフトウェアが含まれています。Ltd.

Copyright (c) 2004-2009 Mort Bay Consulting Pty.Ltd.

A.18 Apache Log4j

Copyright 2007 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.19 Apache Lucene

Copyright 2011-2012 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.20 Apache Tomcat

Copyright 1999-2014 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

Apache License Version 2.0 (「ライセンス」)に従わない場合は、これらのファイルを使用することができない場合があります。

ライセンスのコピーは、http://www.apache.org/licenses/LICENSE-2.0から入手できます。ライセンスのコピーは、このドキュメントでも複製されます。

Windowsインストーラは、オープン・ソース・ソフトウェアであるNullsoft Scriptable Install System (NSIS)で作成されています。元のソフトウェアおよび関連情報はhttp://nsis.sourceforge.netで入手できます。

JSPページのJavaコンパイル・ソフトウェアは、オープン・ソース・ソフトウェアであるEclipseによって提供されています。元のソフトウェアおよび関連情報は次の場所で入手できます

http://www.eclipse.org

A.21 Apache Xerces2

Copyright 1999-2012 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.22 Apache xml-commons

Apache XML Commons XML APIs

Copyright 1999-2009 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

このソフトウェアの一部は本来、次のいずれかに基づいています。

- software copyright (c) 1999, IBM Corporation., http://www.ibm.com.

- software copyright (c) 1999, Sun Microsystems., http://www.sun.com.

- software copyright (c) 2000 World Wide Web Consortium, http://www.w3.org

A.23 Argparse4j

Copyright (C) 2011, 2014, 2015 Tatsuhiro Tsujikawa

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE

SOFTWARE.

A.24 check-types

Copyright © 2012, 2013, 2014, 2015 Phil Booth

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

A.25 Cloudera CDH

コントリビュータ・ライセンス契約により、Apache Software Foundation (ASF)に使用許諾されています。著作権所有に関する追加情報は、この著作物に同梱されているNOTICEファイルを参照してください。ASFはApache License、Version 2.0 ("ライセンス")に基づきこのファイルをライセンス供与します。ライセンスに準拠している場合を除き、このファイルは使用できません。ライセンスのコピーは、次から入手できます

http://www.apache.org/licenses/LICENSE-2.0

適用法により求められた場合、または書面をもって同意された場合を除き、ライセンスに基づいて配布されたソフトウェアは、明示的、黙示的を問わず一切の保証または条件なしに「現状のまま」で提供されています。

特定の言語下のライセンス許諾事項および制限事項については、ライセンスを確認してください。

A.26 cookie

Copyright (c) 2012-2014 Roman Shtylman <shtylman@gmail.com>

Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

A.27 Fastutil

FastutilはApache License、Version 2.0に基づいて提供されます。

A.28 functionaljava

Copyright (c) 2008-2011, Tony Morris, Runar Bjarnason, Tom Adams, Brad Clow, Ricky Clarkson, Jason Zaugg All rights reserved.

Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

A.29 GeoNamesデータ

このディストリビューションには、GeoNames地勢図データベースの修正バージョンが含まれます。あるいは、この修正バージョンがworld_xxxxx.json形式でそれぞれ都市、郡、州、国向けの一連のファイルにあるディストリビューション用のサービスで使用されます。また、db_alternate_names.txtという別名のファイルもあります。これらのファイルはすべて、GeoNamesデータベースから生成されます。元のGeoNamesデータベースは、次に記載するライセンスに基づき、www.geonames.orgで入手できます。

CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES.DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP.CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS.CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE.

License

THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE").THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW.ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.

BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE.TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.

1. Definitions

"Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License.For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License.

"Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole.A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License.

"Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership.

"Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License.

"Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast.

"Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work.

"You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.

"Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images.

"Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium.

2. Fair Dealing Rights.Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws.

3. License Grant.Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:

to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections;

to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work.For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified.";

to Distribute and Publicly Perform the Work including as incorporated in Collections; and, to Distribute and Publicly Perform Adaptations.

For the avoidance of doubt:

Non-waivable Compulsory License Schemes.In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License;

Waivable Compulsory License Schemes.In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and,

Voluntary License Schemes.The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License.

The above rights may be exercised in all media and formats whether now known or hereafter devised.The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats.Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved.

4. Restrictions.The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:

You may Distribute or Publicly Perform the Work only under the terms of this License.You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform.You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License.You may not sublicense the Work.You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform.When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License.This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License.If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested.If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested.

If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author").The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors.For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties.

Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation.Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise.

5. Representations, Warranties and Disclaimer

UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE.SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.

6. Limitation on Liability.EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. Termination

This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License.Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses.Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.

Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work).Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.

8. Miscellaneous

Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.

Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.

If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.

No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.

This License constitutes the entire agreement between the parties with respect to the Work licensed here.There are no understandings, agreements or representations with respect to the Work not specified here.Licensor shall not be bound by any additional provisions that may appear in any communication from You.This License may not be modified without the mutual written agreement of the Licensor and You.

The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971).These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law.If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law.

Creative Commons Notice

Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work.Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license.Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor.

Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons.Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time.For the avoidance of doubt, this trademark restriction does not form part of this License.

Creative Commons may be contacted at http://creativecommons.org/.

A.30 Geospatial Data Abstraction Library (GDAL)

GDAL/OGR General

----------------

In general GDAL/OGR is licensed under an MIT/X style license with the

following terms:

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESSOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

gdal/frmts/gtiff/tif_float.c

----------------------------

Copyright (c) 2002, Industrial Light & Magic, a division of Lucas Digital Ltd. LLC

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

- Neither the name of Industrial Light & Magic nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

gdal/frmts/hdf4/hdf-eos/*

------------------------

Copyright (C) 1996 Hughes and Applied Research Corporation

Permission to use, modify, and distribute this software and its documentation

for any purpose without fee is hereby granted, provided that the above

copyright notice appear in all copies and that both that copyright notice and

this permission notice appear in supporting documentation.

gdal/frmts/pcraster/libcsf

--------------------------

Copyright (c) 1997-2003, Utrecht University

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

- Neither the name of Utrecht University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

gdal/frmts/grib/degrib/*

------------------------

The degrib and g2clib source code are modified versions of code produced by NOAA NWS and are in the public domain subject to the following restrictions:

http://www.weather.gov/im/softa.htm

DISCLAIMER The United States Government makes no warranty, expressed or implied, as to the usefulness of the software and documentation for any purpose.The U.S. Government, its instrumentalities, officers, employees, and agents assumes no responsibility (1) for the use of the software and documentation listed below, or (2) to provide technical support to users.

http://www.weather.gov/disclaimer.php

The information on government servers are in the public domain, unless specifically annotated otherwise, and may be used freely by the public so long as you do not 1) claim it is your own (e.g. by claiming copyright for NWS information -- see below), 2) use it in a manner that implies an endorsement or affiliation with NOAA/NWS, or 3) modify it in content and then present it as official government material.You also cannot present information of your own in a way that makes it appear to be official government information.

The user assumes the entire risk related to its use of this data.NWS is providing this data "as is," and NWS disclaims any and all warranties, whether express or implied, including (without limitation) any implied warranties of merchantability or fitness for a particular purpose.In no event will NWS be liable to you or to any third party for any direct, indirect, incidental, consequential, special or exemplary damages or lost profit resulting from any use or misuse of this data.

As required by 17 U.S.C. 403, third parties producing copyrighted works consisting predominantly of the material appearing in NWS Web pages must provide notice with such work(s) identifying the NWS material incorporated and stating that such material is not subject to copyright protection.

port/cpl_minizip*

-----------------

This is version 2005-Feb-10 of the Info-ZIP copyright and license.

The definitive version of this document should be available at

ftp://ftp.info-zip.org/pub/infozip/license.html indefinitely.

Copyright (c) 1990-2005 Info-ZIP.All rights reserved.

For the purposes of this copyright and license, "Info-ZIP" is defined as

the following set of individuals:

Mark Adler, John Bush, Karl Davis, Harald Denker, Jean-Michel Dubois,

Jean-loup Gailly, Hunter Goatley, Ed Gordon, Ian Gorman, Chris Herborth,

Dirk Haase, Greg Hartwig, Robert Heath, Jonathan Hudson, Paul Kienitz,

David Kirschbaum, Johnny Lee, Onno van der Linden, Igor Mandrichenko,

Steve P.Miller, Sergio Monesi, Keith Owens, George Petrov, Greg Roelofs,

Kai Uwe Rommel, Steve Salisbury, Dave Smith, Steven M.Schweda,

Christian Spieler, Cosmin Truta, Antoine Verheijen, Paul von Behren,

Rich Wales, Mike White

This software is provided "as is," without warranty of any kind, express or implied.In no event shall Info-ZIP or its contributors be held liable for any direct, indirect, incidental, special or consequential damages arising out of the use of or inability to use this software.

Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:

1. Redistributions of source code must retain the above copyright notice, definition, disclaimer, and this list of conditions.

2. Redistributions in binary form (compiled executables) must reproduce the above copyright notice, definition, disclaimer, and this list of conditions in documentation and/or other materials provided with the distribution.The sole exception to this condition is redistribution of a standard UnZipSFX binary (including SFXWiz) as part of a self-extracting archive; that is permitted without inclusion of this license, as long as the normal SFX banner has not been removed from the binary or disabled.

3. Altered versions--including, but not limited to, ports to new operating systems, existing ports with new graphical interfaces, and dynamic, shared, or static library versions--must be plainly marked as such and must not be misrepresented as being the original source.Such altered versions also must not be misrepresented as being Info-ZIP releases--including, but not limited to, labeling of the altered versions with the names "Info-ZIP" (or any variation thereof, including, but not limited to, different capitalizations), "Pocket UnZip," "WiZ" or "MacZip" without the explicit permission of Info-ZIP.Such altered versions are further prohibited from misrepresentative use of the Zip-Bugs or Info-ZIP e-mail addresses or of the Info-ZIP URL(s).

4. Info-ZIP retains the right to use the names "Info-ZIP," "Zip," "UnZip," "UnZipSFX," "WiZ," "Pocket UnZip," "Pocket Zip," and "MacZip" for its own source and binary releases.

gdal/ogr/ogrsf_frmts/dxf/intronurbs.cpp

---------------------------------------

This code is derived from the code associated with the book "An Introduction to NURBS" by David F.RogersMore information on the book and the code is available at:

http://www.nar-associates.com/nurbs/

Copyright (c) 2009, David F.Rogers

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

- Neither the name of the David F.Rogers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

A.31 Google Guava

GuavaはApache License、Version 2.0に基づいてライセンスされています。

Copyright 2006 - 2011 Google, Inc. All rights reserved.

A.32 Google Guice

GuiceはApache License, Version 2.0に基づいてライセンスされています。

Copyright 2006 – 2011 Google, Inc. All rights reserved.

A.33 Google protobuf

Copyright 2008, Google Inc. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

- Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

A.34 int64-native

Copyright (c) 2014 Robert Kieffer

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

A.35 Jackson

Copyright 2009 FasterXML, LLC

JacksonはApache License、Version 2.0に基づいて提供されます。

A.36 Jansi

Copyright (C) 2009, Progress Software Corporation and/or its subsidiaries or affiliates.

JansiはApache License、Version 2.0に基づいて提供されます。

A.37 JCodec

このソフトウェアはIndependent JPEG Groupの著作物の一部に基づいています。

2ファイルを除き、すべてのファイルがFreeBSDライセンスに基づいて入手可能です。

http://www.jcodec.org/lic.html

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

----------------------------------------------

1 file (StringUtils.java) is "borrowed from Apache".This file is from Apache Commons Lang which is licensed under Apache 2.0

http://www.apache.org/licenses/LICENSE-2.0

----------------------------

1 file (VP8DCT.java) refers to Independent JPEG Group) which has the following license (note - the configuration scripts and GIF code mentioned by the license are not included):

The authors make NO WARRANTY or representation, either express or implied, with respect to this software, its quality, accuracy, merchantability, or fitness for a particular purpose.This software is provided "AS IS", and you, its user, assume the entire risk as to its quality and accuracy.

This software is copyright (C) 1991-2014, Thomas G.Lane, Guido Vollbeding.

All Rights Reserved except as specified below.

Permission is hereby granted to use, copy, modify, and distribute this software (or portions thereof) for any purpose, without fee, subject to these conditions:

(1) If any part of the source code for this software is distributed, then this README file must be included, with this copyright and no-warranty notice unaltered; and any additions, deletions, or changes to the original files must be clearly indicated in accompanying documentation.

(2) If only executable code is distributed, then the accompanying documentation must state that "this software is based in part on the work of the Independent JPEG Group".

(3) Permission for use of this software is granted only if the user accepts full responsibility for any undesirable consequences; the authors accept NO LIABILITY for damages of any kind.

These conditions apply to any software derived from or based on the IJG code, not just to the unmodified library.If you use our work, you ought to acknowledge us.

Permission is NOT granted for the use of any IJG author's name or company name in advertising or publicity relating to this software or products derived from it.This software may be referred to only as "the Independent JPEG Group's software".

We specifically permit and encourage the use of this software as the basis of commercial products, provided that all warranty or liability claims are assumed by the product vendor.

The Unix configuration script "configure" was produced with GNU Autoconf.

It is copyright by the Free Software Foundation but is freely distributable.

The same holds for its supporting scripts (config.guess, config.sub, ltmain.sh).Another support script, install-sh, is copyright by X Consortium but is also freely distributable.

The IJG distribution formerly included code to read and write GIF files.To avoid entanglement with the Unisys LZW patent (now expired), GIF reading support has been removed altogether, and the GIF writer has been simplified to produce "uncompressed GIFs".This technique does not use the LZW algorithm; the resulting GIF files are larger than usual, but are readable by all standard GIF decoders.

We are required to state that "The Graphics Interchange Format(c) is the Copyright property of CompuServe Incorporated.GIF(sm) is a Service Mark property of CompuServe Incorporated."

A.38 Jettison

Copyright 2006 Envoi Solutions LLC.

JettisonはApache License、Version 2.0に基づいて提供されます。

A.39 JLine

Copyright (c) 2002-2006, Marc Prud'hommeaux <mwp1@cornell.edu>

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

Neither the name of JLine nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

A.40 Javassist

Copyright 1999-2015 by Shigeru Chiba.

このソフトウェアのコンテンツは、Apache License Version 2.0の条項に基づいて使用できます。

A.41 json-bignum

Copyright (c) 2012-2013 Datalanche, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

A.42 Jung

THE JUNG LICENSE

Copyright (c) 2003-2004, Regents of the University of California and the JUNG Project All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

- Neither the name of the University of California nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

A.43 Log4js

This product includes software developed by the Apache Software Foundation (http://www.apache.org).

Copyright 2015 Gareth Jones (with contributions from many other people)

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.ライセンスのコピーは、次から入手できます

http://www.apache.org/licenses/LICENSE-2.0

適用法により求められた場合、または書面をもって同意された場合を除き、ライセンスに基づいて配布されたソフトウェアは、明示的、黙示的を問わず一切の保証または条件なしに「現状のまま」で提供されています。特定の言語下のライセンス許諾事項および制限事項については、ライセンスを確認してください。

------------------------------------------------------------------

SEMVER 4.3.6 license:

The ISC License

Copyright (c) Isaac Z.Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

--------------------------------------------------------------------------------------

readable-stream 1.0.33 license:

Copyright Joyent, Inc. and other Node contributors.All rights reserved.Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

------------------------------------------------------------------------

core-util-is 1.0.2 license:

Copyright Node.js contributors.All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-------------------------------------------------------------

inherits 2.0.1 license:

The ISC License

Copyright (c) Isaac Z.Schlueter

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

------------------------------------------------------------

isarray 0.0.1 license:

(MIT)

Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

------------------------------------------------

string_decoder 0.10.31 license

Copyright Joyent, Inc. and other Node contributors.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the

following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

A.44 MessagePack

Copyright (C) 2008-2010 FURUHASHI Sadayuki

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.ライセンスのコピーは、次から入手できます

http://www.apache.org/licenses/LICENSE-2.0

適用法により求められた場合、または書面をもって同意された場合を除き、ライセンスに

基づいて配布されたソフトウェアは、明示的、黙示的を問わず一切の保証または条件なしに「現状のまま」で提供されています。特定の言語下のライセンス許諾事項および制限事項については、ライセンスを確認してください。

A.45 Netty

The Netty Project

=================

追加情報については、Netty Webサイトを参照してください:

http://netty.io/

Copyright 2011 The Netty Project

Netty ProjectはApache License、version 2.0 ("ライセンス")に基づきこのファイルをライセンス供与します。ライセンスに準拠している場合を除き、このファイルは使用できません。ライセンスのコピーは、

http://www.apache.org/licenses/LICENSE-2.0

適用法により求められた場合、または書面をもって同意された場合を除き、ライセンスに基づいて配布されたソフトウェアは、明示的、黙示的を問わず一切の保証または条件なしに「現状のまま」で提供されています。特定の言語下のライセンス許諾事項および制限事項については、ライセンスを確認してください。

また、この製品が依存しているコンポーネントのライセンス条項については、配布ファイルの'license'ディレクトリにある、それぞれのLICENSE.<component>.txtファイルを参照してください。

-------------------------------------------------------------------------------

この製品には、次の著作物に基づくCollections Frameworkの拡張機能が含まれています: JSR-166 EG、Doug LeaおよびJason T.Greene:

* ライセンス:

* license/LICENSE.jsr166y.txt (パブリック・ドメイン)

* ホームページ:

* http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/

* http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbosscache/experimental/jsr166/

この製品には、次の場所から入手できるRobert Harderのパブリック・ドメインBase64エンコーダおよびデコーダの修正バージョンが含まれています。

* ライセンス:

* license/LICENSE.base64.txt (パブリック・ドメイン)

* ホームページ:

* http://iharder.sourceforge.net/current/java/base64/

この製品には、次の場所から入手できる、Pure Javaでのzlib再実装である'JZlib'の修正バージョンが含まれています。

* ライセンス:

* license/LICENSE.jzlib.txt (BSD Style License)

* ホームページ:

* http://www.jcraft.com/jzlib/

Copyright (c) 2000-2011 ymnk, JCraft,Inc.All rights reserved.

Redistribution and use in source and binary forms, with or without

modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice,

this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright

notice, this list of conditions and the following disclaimer in

the documentation and/or other materials provided with the distribution.

3. The names of the authors may not be used to endorse or promote products

derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL JCRAFT, INC.OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

この製品は、次の場所から入手できる、Googleのデータ交換形式である'Protocol Buffers'によって異なる場合があります。

* ライセンス:

* license/LICENSE.protobuf.txt (新しいBSDライセンス)

* ホームページ:

* http://code.google.com/p/protobuf/

この製品は、次の場所から入手できる、Javaの簡易ロギング・ファサードである'SLF4J'によって異なる場合があります。

* ライセンス:

* license/LICENSE.slf4j.txt (MITライセンス)

* ホームページ:

* http://www.slf4j.org/

この製品は、次の場所から入手できる、簡易ロギング・フレームワークである'Apache Commons Logging'によって異なる場合があります。

* ライセンス:

* license/LICENSE.commons-logging.txt (Apacheライセンス2.0)

* ホームページ:

* http://commons.apache.org/logging/

この製品は、次の場所から入手できる、ロギング・フレームワークである'Apache Log4J'によって異なる場合があります。

* ライセンス:

* license/LICENSE.log4j.txt (Apacheライセンス2.0)

* ホームページ:

* http://logging.apache.org/log4j/

この製品は、次の場所から入手できる、ロギング・フレームワークである'JBoss Logging'によって異なる場合があります。

* ライセンス:

* license/LICENSE.jboss-logging.txt (GNU LGPL 2.1)

* ホームページ:

* http://anonsvn.jboss.org/repos/common/common-logging-spi/

この製品は、次の場所から入手できる、オープン・ソースOSGiフレームワーク実装である'Apache Felix'によって異なる場合があります。

* ライセンス:

* license/LICENSE.felix.txt (Apacheライセンス2.0)

* ホームページ:

* http://felix.apache.org/

この製品は、Javaイベント・ベースのWebSocketおよびHTTPサーバーである'Webbit'によって異なる場合があります。

* ライセンス:

* license/LICENSE.webbit.txt (BSDライセンス)

* ホームページ:

* https://github.com/joewalnes/webbit

A.46 Node.js

Copyright Node.js contributors.All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

*******

Copyright Joyent, Inc. and other Node contributors.All rights reserved.Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

********

Node.js also includes a number of externally maintained third-party dependencies, including the following:

--c-ares v '1.10.1-DEV'

--http-parser v '2.5.2'

--libuv v '1.8.0'

----tree.h

----inet_pton, inet_ntop

----stdint-msvc2008

----pthread-fixes.hs

----android-ifaddrs.h, android-ifaddrs.c

--OpenSSL v '1.0.2g'

--Punnycode.js

--v8 v '4.5.103.35'

----PCRE test suite

----Layout tests

----Strongtalk assembler

----Valgrind client API header

--zlib v '1.2.8'

"""

The following licensees apply to these externally maintained dependencies:

- c-ares is licensed as follows:

Copyright 1998 by the Massachusetts Institute of Technology.

Copyright (C) 2007-2013 by Daniel Stenberg

Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of M.I.T. not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission.M.I.T. makes no representations about the suitability of this software for any purpose.It is provided "as is" without express or implied warranty.

"""

- HTTP Parser is licensed as follows:

http_parser.c is based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev.

Additional changes are licensed under the same terms as NGINX and copyright Joyent, Inc. and other Node contributors.All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

"""

- libuv is licensed as follows:

"""

libuv is part of the Node project: http://nodejs.org/

libuv may be distributed alone under Node's license:

====

Copyright Joyent, Inc. and other Node contributors.All rights reserved.Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

====

This license applies to all parts of libuv that are not externally maintained libraries.

The externally maintained libraries used by libuv are:

- tree.h (from FreeBSD), copyright Niels Provos.Two clause BSD license.

- inet_pton and inet_ntop implementations, contained in src/inet.c, are copyright the Internet Systems Consortium, Inc., and licensed under the ISC license.

- stdint-msvc2008.h (from msinttypes), copyright Alexander Chemeris.Three clause BSD license.

- pthread-fixes.h, pthread-fixes.c, copyright Google Inc. and Sony Mobile Communications AB.Three clause BSD license.

- android-ifaddrs.h, android-ifaddrs.c, copyright Berkeley Software Design Inc, Kenneth MacKay and Emergya (Cloud4all, FP7/2007-2013, grant agreement n° 289016).Three clause BSD license.

- OpenSSL, located at deps/openssl, is licensed as follows:

/* ====================================================================

* Copyright (c) 1998-2016 The OpenSSL Project.All rights reserved.

*

* Redistribution and use in source and binary forms, with or without

* modification, are permitted provided that the following conditions

* are met:

*

* 1.Redistributions of source code must retain the above copyright

* notice, this list of conditions and the following disclaimer.

*

* 2.Redistributions in binary form must reproduce the above copyright

* notice, this list of conditions and the following disclaimer in

* the documentation and/or other materials provided with the

* distribution.

*

* 3.All advertising materials mentioning features or use of this

* software must display the following acknowledgment:

* "This product includes software developed by the OpenSSL Project

* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"

*

* 4.The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to

* endorse or promote products derived from this software without

* prior written permission.For written permission, please contact

* openssl-core@openssl.org.

*

* 5.Products derived from this software may not be called "OpenSSL"

* nor may "OpenSSL" appear in their names without prior written

* permission of the OpenSSL Project.

*

* 6.Redistributions of any form whatsoever must retain the following

* acknowledgment:

* "This product includes software developed by the OpenSSL Project

* for use in the OpenSSL Toolkit (http://www.openssl.org/)"

*

* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY

* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR

* PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE OpenSSL PROJECT OR

* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,

* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT

* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;

* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,

* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)

* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED

* OF THE POSSIBILITY OF SUCH DAMAGE.

* ====================================================================

*

* This product includes cryptographic software written by Eric Young

* (eay@cryptsoft.com).This product includes software written by Tim

* Hudson (tjh@cryptsoft.com).

*

*/ """

- Punycode.js, located at lib/punycode.js, is licensed as follows:

Copyright Mathias Bynens <https://mathiasbynens.be/>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

"""

- V8, located at deps/v8, is licensed as follows:

This license applies to all parts of V8 that are not externally maintained libraries.The externally maintained libraries used by V8 are:

- PCRE test suite, located in test/mjsunit/third_party/regexp-pcre/regexp-pcre.js.This is based on the test suite from PCRE-7.3, which is copyrighted by the University of Cambridge and Google, Inc. The copyright notice and license are embedded in regexp-pcre.js.

(/ PCRE LICENCE

// ------------

//

// PCRE is a library of functions to support regular expressions whose syntax

// and semantics are as close as possible to those of the Perl 5 language.

//

// Release 7 of PCRE is distributed under the terms of the "BSD" licence, as

// specified below.The documentation for PCRE, supplied in the "doc"

// directory, is distributed under the same terms as the software itself.

//

// The basic library functions are written in C and are freestanding.Also

// included in the distribution is a set of C++ wrapper functions.)

- Layout tests, located in test/mjsunit/third_party/object-keys.These are based on layout tests from webkit.org which are copyrighted by Apple Computer, Inc. and released under a 3-clause BSD license.

- Strongtalk assembler, the basis of the files assembler-arm-inl.h, assembler-arm.cc, assembler-arm.h, assembler-ia32-inl.h, assembler-ia32.cc, assembler-ia32.h, assembler-x64-inl.h, assembler-x64.cc, assembler-x64.h, assembler-mips-inl.h, assembler-mips.cc, assembler-mips.h, assembler.cc and assembler.h. This code is copyrighted by Sun Microsystems Inc. and released under a 3-clause BSD license.

- Valgrind client API header, located at third_party/valgrind/valgrind.h This is release under the BSD license.

These libraries have their own licenses; we recommend you read them, as their terms may differ from the terms below.

Further license information can be found in LICENSE files located in sub-directories.

Copyright 2014, the V8 project authors.All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

* Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

"""

- zlib, located at deps/zlib, is licensed as follows:

"""

zlib.h -- interface of the 'zlib' general purpose compression library version 1.2.8, April 28th, 2013

Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler

This software is provided 'as-is', without any express or implied warranty.In no event will the authors be held liable for any damages arising from the use of this software.

Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software.If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.

2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.

3. This notice may not be removed or altered from any source distribution.

Jean-loup Gailly Mark Adler

jloup@gzip.org madler@alumni.caltech.edu

"""

ISC lisence for inet-pton and inet-ntop:

ISC License (ISC)

Copyright (c) 4-digit year, Company or Person's Name <E-mail address>

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

A.47 node-zookeeper-client

note-zookeeper-client, version 0.2.2, is licensed under the following terms:

Copyright (c) 2013 Yahoo! Inc. All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

node-zokeeper-client also comes with two related components, async v0.2.10 and underscore v1.4.4.

License for async v0.2.10:

Copyright (c) 2010-2016 Caolan McMahon

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

License for underscore v1.4.4:

Copyright (c) 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative

Reporters & Editors

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

A.48 OpenCV

重要: ダウンロード、コピー、インストール、または使用の前にお読みください。

ソフトウェアをダウンロード、コピー、インストール、または使用して、このライセンスに同意します。このライセンスに同意していない場合は、ソフトウェアをダウンロード、インストール、コピーまたは使用しないでください。

ライセンス契約

Open Source Computer Vision Library向け

Copyright (C) 2000-2008, Intel Corporation, all rights reserved.

Copyright (C) 2008-2011, Willow Garage Inc., all rights reserved.

サード・パーティの著作権は個々の所有者のプロパティです。

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

* The name of the copyright holders may not be used to endorse or promote products derived from this software without specific prior written permission.

This software is provided by the copyright holders and contributors "as is" and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed.

In no event shall the Intel Corporation or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.

A.49 rxjava-core

Apache License Version 2.0 (「ライセンス」)に従わない場合は、これらのファイルを使用することができない場合があります。

ライセンスのコピーは、http://www.apache.org/licenses/LICENSE-2.0から入手できます。ライセンスのコピーは、このドキュメントでも複製されます。

適用法により求められた場合、または書面をもって同意された場合を除き、ライセンスに基づいて配布されたソフトウェアは、明示的、黙示的を問わず一切の保証または条件なしに「現状のまま」で提供されています。

特定の言語下のライセンス許諾事項および制限事項については、ライセンスを確認してください。

A.50 Slf4j

Copyright (c) 2004-2011 QOS.ch

All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

A.51 Spoofax

Copyright 2016 Delft University of Technology

This project includes software developed at the Programming Languages Group at Delft University of Technology (http://www.tudelft.nl).

Apache License Version 2.0 (「ライセンス」)に従わない場合は、これらのファイルを使用することができない場合があります。

A.52 Tinkerpop Blueprints

Copyright (c) 2009-2012, TinkerPop [http://tinkerpop.com]

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

* Neither the name of the TinkerPop nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL TINKERPOP BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

A.53 Tinkerpop Gremlin

Copyright (c) 2009-2012, TinkerPop [http://tinkerpop.com]

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

* Neither the name of the TinkerPop nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL TINKERPOP BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

A.54 Tinkerpop Pipes

Copyright (c) 2009-2012, TinkerPop [http://tinkerpop.com]

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

* Neither the name of the TinkerPop nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL TINKERPOP BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

B Hive空間関数

この付録では、Hive空間関数に関する参照情報を提供します。

これらの関数を使用するには、「Oracle Big Data Spatial Vector Hive Analysis」、特に「Hive Spatial APIの使用」で説明されているコンセプトおよび技術を理解する必要があります。

これらの関数はアルファベット順に示します。ただし、これらは、タイプ、単一のジオメトリ関数、2つのジオメトリ関数にグループ化できます。

タイプ:

- ST_Geometry

- ST_LineString

- ST_MultiLineString

- ST_MultiPoint

- ST_MultiPolygon

- ST_Point

- ST_Polygon

単一のジオメトリ関数:

- ST_Area

- ST_AsWKB

- ST_AsWKT

- ST_Buffer

- ST_ConvexHull

- ST_Envelope

- ST_Length

- ST_Simplify

- ST_SimplifyVW

- ST_Volume

2つのジオメトリ関数:

- ST_AnyInteract

- ST_Contains

- ST_Distance

- ST_Inside

- ST_AnyInteract

- ST_Area

- ST_AsWKB

- ST_AsWKT

- ST_Buffer

- ST_Contains

- ST_ConvexHull

- ST_Distance

- ST_Envelope

- ST_Geometry

- ST_Inside

- ST_Length

- ST_LineString

- ST_MultiLineString

- ST_MultiPoint

- ST_MultiPolygon

- ST_Point

- ST_Polygon

- ST_Simplify

- ST_SimplifyVW

- ST_Volume

B.1 ST_AnyInteract

形式

ST_AnyInteract(
geometry1  ST_Geometry,
geometry1  ST_Geometry,
tolerance  NUMBER DEFAULT 0 (nongeodetic geometries) or 0.05 (geodetic geometries));

説明

geometry1がgeometry2との空間的相互作用を持つかどうかを確認し、trueまたはfalseを返します。

パラメータ

geometry1

2次元および3次元のオブジェクト。

geometry2

もう1つの2次元および3次元のオブジェクト。

tolerance

geometry2が有効である許容差。

使用上の注意

これらのジオメトリは両方とも、同じ数の次元(2または3)および同じ空間参照システム(SRIDまたは座標系)を持つ必要があります。

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」も参照してください。

例

select ST_AnyInteract(
ST_Point('{ "type": "Point", "coordinates": [2, 3]}', 8307),
ST_Polygon('{"type": "Polygon","coordinates": [[[1, 2], [5, 2], [5, 6], [1, 6], [1, 2]]]}', 8307))
from hivetable LIMIT 1;
-- return true

B.2 ST_Area

形式

ST_Area(
geometry   ST_Geometry
tolerance  NUMBER DEFAULT 0 (nongeodetic geometries) or 0.05 (geodetic geometries));

説明

ポリゴンまたはマルチポリゴン・ジオメトリの領域を返します。

パラメータ

geometry

ST_Geometryオブジェクト。

tolerance

2つの点が離れていながら同じであると見なすことができる距離を表す値。

使用上の注意

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」を参照してください。

例

select ST_Area(ST_Polygon('{"type": "Polygon","coordinates": [[[1, 2], [5, 2], [5, 7], [1, 7], [1, 2]]]}', 0))
from hivetable LIMIT 1;  -- return 20

B.3 ST_AsWKB

形式

ST_AsWKB(
geometry ST_Geometry);

説明

ジオメトリのWKB (Well-Known Binary)表現を返します。

パラメータ

geometry

ST_Geometryオブジェクト。

使用上の注意

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」を参照してください。

例

select ST_AsWKB( ST_Point('{ "type": "Point", "coordinates": [0, 5]}', 8307))
from hivetable LIMIT 1;

B.4 ST_AsWKT

形式

ST_AsWKT(
geometry ST_Geometry);

説明

ジオメトリのWKT (Well-Known Text)表現を返します。

パラメータ

geometry

ST_Geometryオブジェクト。

使用上の注意

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」を参照してください。

例

select ST_AsWKT(ST_Point('{ "type": "Point", "coordinates": [0, 5]}', 8307))
from hivetable LIMIT 1;

B.5 ST_Buffer

形式

ST_Buffer(
geometry     ST_Geometry,
bufferWidth  NUMBER,
arcTol       NUMBER DEFAULT 0 (nongeodetic geometries) or 0.05 (geodetic geometries));

説明

入力ジオメトリがバッファされたバージョンである新しいST_Geometryオブジェクトを生成します。

パラメータ

geometry

任意の2次元オブジェクト。ジオメトリが測地である場合、これはWGS84空間参照システム内の緯度/情報値として解釈され、bufferWidthおよびtoleranceはメートルとして解釈されます。

bufferWidth

バッファに使用する距離値。

arcTol

測地円弧高密度化に使用する許容差。(非測地ジオメトリの場合は無視されます。)

使用上の注意

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」を参照してください。

例

select ST_Buffer(ST_Point('{ "type": "Point", "coordinates": [0, 5]}', 0), 3)
from hivetable LIMIT 1;
-- return {"type":"Polygon", "coordinates":[[[-3,5],[0,2],[3,5]]],"crs":{"type":"name","properties":{"name":"EPSG:0"}}}

B.6 ST_Contains

形式

ST_Contains(
geometry1  ST_Geometry,
geometry1  ST_Geometry,
tolerance  NUMBER DEFAULT 0 (nongeodetic geometries) or 0.05 (geodetic geometries));

説明

geometry1にgeometry2が含まれるかどうかを確認し、trueまたはfalseを返します。

パラメータ

geometry1

ポリゴンまたは立体ジオメトリ・オブジェクト。

geometry2

もう1つの2次元および3次元のオブジェクト。

tolerance

geometry2が有効である許容差。

使用上の注意

これらのジオメトリは両方とも、同じ数の次元(2または3)および同じ空間参照システム(SRIDまたは座標系)を持つ必要があります。

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」も参照してください。

例

select ST_Contains(
ST_Polygon('{"type": "Polygon","coordinates": [[[1, 2], [5, 2], [5, 6], [1, 6], [1, 2]]]}', 8307),
ST_Point('{ "type": "Point", "coordinates": [2, 3]}', 8307))
from hivetable LIMIT 1;
-- return true

B.7 ST_ConvexHull

形式

ST_ConvexHull(
geometry ST_Geometry);

説明

入力ジオメトリの凸包をST_Geometryオブジェクトとして返します。

パラメータ

geometry

2次元のST_Geometryオブジェクト。

使用上の注意

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」を参照してください。

例

select ST_ConvexHull(
ST_MultiPoint(' { "type": "MultiPoint","coordinates": [ [1, 2], [-1, -2], [5, 6] ] }', 0))
from hivetable LIMIT 1;
-- return {"type":"Polygon", "coordinates":[[[5,6],[1,2],[-1,-2],[5,6]]],"crs":{"type":"name","properties":{"name":"EPSG:0"}}}

B.8 ST_Distance

形式

ST_Distance(
geometry1  ST_Geometry,
geometry1  ST_Geometry,
tolerance  NUMBER DEFAULT 0 (nongeodetic geometries) or 0.05 (geodetic geometries));

説明

2つの2次元ジオメトリ間の距離を確認します。

パラメータ

geometry1

2次元のジオメトリ・オブジェクト。

geometry2

2次元のジオメトリ・オブジェクト。

tolerance

geometry2が有効である許容差。

使用上の注意

この関数は、2つの特定のジオメトリ間の距離を返します。投影されたデータの場合、距離の単位は投影の単位と同じです。測地データの場合、距離はメートル単位です。

エラーが発生した場合、この関数は-1を返します。

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」も参照してください。

例

select ST_Distance(
ST_Point('{ "type": "Point", "coordinates": [0, 0]}', 0),
ST_Point('{ "type": "Point", "coordinates": [6, 8]}', 0))
from hivetable LIMIT 1;
-- return 10.0

B.9 ST_Envelope

形式

ST_Envelope(
geometry ST_Geometry);

説明

入力ジオメトリのエンベロープ(境界ポリゴン)をST_Geometryオブジェクトとして返します。

パラメータ

geometry

2次元のST_Geometryオブジェクト。

使用上の注意

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」を参照してください。

例

select ST_Envelope(
ST_MultiPoint(' { "type": "MultiPoint","coordinates": [ [1, 2], [-1, -2], [5, 6] ] }', 0))
from hivetable LIMIT 1;
-- return {"type":"Polygon", "coordinates":[[[-1,-2],[5,-2],[5,6],[-1,6],[-1,-2]]],"crs":{"type":"name","properties":{"name":"EPSG:0"}}}

B.10 ST_Geometry

形式

ST_GEOMETRY(
geometry STRING
srid INT);

または

ST_GEOMETRY(
geometry BINARY
srid INT);

または

ST_GEOMETRY(
geometry Object
hiveRecordInfoProvider STRING);

説明

ジオメトリのGeoJSON文字列表現を作成し、ジオメトリのGeoJSON文字列表現を返します。

パラメータ

geometry

GeoJSONまたはWKT文字列からジオメトリを作成するには(最初の形式): GeoJSONまたはWKT形式のジオメトリ定義。

WKBオブジェクトからジオメトリを作成するには(2番目の形式): WKB形式のジオメトリ定義。

Hiveオブジェクトを使用してジオメトリを作成するには(3番目の形式): Hiveでサポートされているタイプのジオメトリ定義。

srid

空間参照システム(座標系)識別子。

HiveRecordProvider

ジオメトリをGeoJSON形式で抽出するためのインタフェースoracle.spatial.hadoop.vector.hive.HiveRecordInfoProviderの実装の完全修飾名。

使用上の注意

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」を参照してください。

例

-- creates a point using GeoJSON
select ST_Geometry (' { "type": "Point", "coordinates": [100.0, 0.0]}', 8307) from hivetable LIMIT 1;
-- creates a point using WKT
select ST_Geometry ('point(100.0 0.0)', 8307) from hivetable LIMIT 1;
-- creates the geometries using a HiveRecordInfoProvider
select ST_Geometry (geoColumn, ‘hive.samples.SampleHiveRecordInfoProviderImpl’) from hivetable;

B.11 ST_Inside

形式

ST_Inside(
geometry1  ST_Geometry,
geometry1  ST_Geometry,
tolerance  NUMBER DEFAULT 0 (nongeodetic geometries) or 0.05 (geodetic geometries));

説明

geometry1がgeometry2内にあるかどうかを確認し、trueまたはfalseを返します。

パラメータ

geometry1

2次元および3次元のオブジェクト。

geometry2

ポリゴンまたは立体ジオメトリ・オブジェクト。

tolerance

geometry1が有効である許容差。

使用上の注意

これらのジオメトリは両方とも、同じ数の次元(2または3)および同じ空間参照システム(SRIDまたは座標系)を持つ必要があります。

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」も参照してください。

例

select ST_Inside(
ST_Point('{ "type": "Point", "coordinates": [2, 3]}', 8307),
ST_Polygon('{"type": "Polygon","coordinates": [[[1, 2], [5, 2], [5, 6], [1, 6], [1, 2]]]}', 8307))
from hivetable LIMIT 1;
-- return true

B.12 ST_Length

形式

ST_Length(
geometry   ST_Geometry
tolerance  NUMBER DEFAULT 0 (nongeodetic geometries) or 0.05 (geodetic geometries));

説明

線またはポリゴン・ジオメトリの長さを返します。

パラメータ

geometry

ST_Geometryオブジェクト。

tolerance

2つの点が離れていながら同じであると見なすことができる距離を表す値。

使用上の注意

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」を参照してください。

例

select ST_Length(ST_Polygon('{"type": "Polygon","coordinates": [[[1, 2], [5, 2], [5, 6], [1, 6], [1, 2]]]}', 0))
from hivetable LIMIT 1;  -- return 16

B.13 ST_LineString

形式

ST_LineString(
geometry STRING
srid INT);

または

ST_LineString(
geometry BINARY
srid INT);

または

ST_LineString(
geometry Object
hiveRecordInfoProvider STRING);

説明

線ストリング・ジオメトリをGeoJSON形式で作成し、ジオメトリのGeoJSON文字列表現を返します。

パラメータ

geometry

GeoJSONまたはWKT文字列からジオメトリを作成するには(最初の形式): GeoJSONまたはWKT形式のジオメトリ定義。

WKBオブジェクトからジオメトリを作成するには(2番目の形式): WKB形式のジオメトリ定義。

Hiveオブジェクトを使用してジオメトリを作成するには(3番目の形式): Hiveでサポートされているタイプのジオメトリ定義。

srid

空間参照システム(座標系)識別子。

HiveRecordProvider

ジオメトリをGeoJSON形式で抽出するためのインタフェースoracle.spatial.hadoop.vector.hive.HiveRecordInfoProviderの実装の完全修飾名。

使用上の注意

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」を参照してください。

例

-- creates a line using GeoJSON
select ST_LineString (' { "type": "LineString","coordinates": [ [100.0, 0.0], [101.0, 1.0] ]} ', 8307) from hivetable LIMIT 1;
-- creates a line using WKT
select ST_LineString (' linestring(1 1, 5 5, 10 10, 20 20)', 8307) from hivetable LIMIT 1;
-- creates the lines using a HiveRecordInfoProvider
select ST_LineString (geoColumn, ‘mypackage.hiveRecordInfoProviderImpl’) from hivetable;

B.14 ST_MultiLineString

形式

ST_MultiLineString(
geometry STRING
srid INT);

または

ST_MultiLineString(
geometry BINARY
srid INT);

または

ST_MultiLineString(
geometry Object
hiveRecordInfoProvider STRING);

説明

複数の線ストリング・ジオメトリをGeoJSON形式で作成し、ジオメトリのGeoJSON文字列表現を返します。

パラメータ

geometry

GeoJSONまたはWKT文字列からジオメトリを作成するには(最初の形式): GeoJSONまたはWKT形式のジオメトリ定義。

WKBオブジェクトからジオメトリを作成するには(2番目の形式): WKB形式のジオメトリ定義。

Hiveオブジェクトを使用してジオメトリを作成するには(3番目の形式): Hiveでサポートされているタイプのジオメトリ定義。

srid

空間参照システム(座標系)識別子。

HiveRecordProvider

ジオメトリをGeoJSON形式で抽出するためのインタフェースoracle.spatial.hadoop.vector.hive.HiveRecordInfoProviderの実装の完全修飾名。

使用上の注意

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」を参照してください。

例

-- creates a MultiLineString using GeoJSON
select ST_ MultiLineString (' { "type": "MultiLineString","coordinates": [ [ [100.0, 0.0], [101.0, 1.0] ], [ [102.0, 2.0], [103.0, 3.0] ]] }', 8307) from hivetable LIMIT 1;
-- creates a MultiLineString using WKT
select ST_ MultiLineString ('multilinestring ((10 10, 20 20, 10 40),
(40 40, 30 30, 40 20, 30 10))', 8307) from hivetable LIMIT 1;
-- creates MultiLineStrings using a HiveRecordInfoProvider
select ST_ MultiLineString (geoColumn, ‘mypackage.hiveRecordInfoProviderImpl’) from hivetable;

B.15 ST_MultiPoint

形式

ST_MultiPoint(
geometry STRING
srid INT);

または

ST_MultiPoint(
geometry BINARY
srid INT);

または

ST_MultiPoint(
geometry Object
hiveRecordInfoProvider STRING);

説明

複数点ジオメトリをGeoJSON形式で作成し、ジオメトリのGeoJSON文字列表現を返します。

パラメータ

geometry

GeoJSONまたはWKT文字列からジオメトリを作成するには(最初の形式): GeoJSONまたはWKT形式のジオメトリ定義。

WKBオブジェクトからジオメトリを作成するには(2番目の形式): WKB形式のジオメトリ定義。

Hiveオブジェクトを使用してジオメトリを作成するには(3番目の形式): Hiveでサポートされているタイプのジオメトリ定義。

srid

空間参照システム(座標系)識別子。

HiveRecordProvider

ジオメトリをGeoJSON形式で抽出するためのインタフェースoracle.spatial.hadoop.vector.hive.HiveRecordInfoProviderの実装の完全修飾名。

使用上の注意

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」を参照してください。

例

-- creates a MultiPoint using GeoJSON
select ST_MultiPoint (' { "type": "MultiPoint","coordinates": [ [100.0, 0.0], [101.0, 1.0] ] }', 8307) from hivetable LIMIT 1;
-- creates a MultiPoint using WKT
select ST_ MultiPoint ('multipoint ((10 40), (40 30), (20 20), (30 10))', 8307) from hivetable LIMIT 1;
-- creates MultiPoints using a HiveRecordInfoProvider
select ST_ MultiPoint (geoColumn, ‘mypackage.hiveRecordInfoProviderImpl’) from hivetable;

B.16 ST_MultiPolygon

形式

ST_MultiPolygon(
geometry STRING
srid INT);

または

ST_MultiPolygon(
geometry BINARY
srid INT);

または

ST_MultiPolygon(
geometry Object
hiveRecordInfoProvider STRING);

説明

複数ポリゴン・ジオメトリをGeoJSON形式で作成し、ジオメトリのGeoJSON文字列表現を返します。

パラメータ

geometry

GeoJSONまたはWKT文字列からジオメトリを作成するには(最初の形式): GeoJSONまたはWKT形式のジオメトリ定義。

WKBオブジェクトからジオメトリを作成するには(2番目の形式): WKB形式のジオメトリ定義。

Hiveオブジェクトを使用してジオメトリを作成するには(3番目の形式): Hiveでサポートされているタイプのジオメトリ定義。

srid

空間参照システム(座標系)識別子。

HiveRecordProvider

ジオメトリをGeoJSON形式で抽出するためのインタフェースoracle.spatial.hadoop.vector.hive.HiveRecordInfoProviderの実装の完全修飾名。

使用上の注意

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」を参照してください。

例

-- creates a MultiPolygon using GeoJSON
select ST_ MultiPolygon (' { "type": "MultiPolygon","coordinates": [[[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]], [[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]], [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]] ] }', 8307) from hivetable LIMIT 1;
-- creates a MultiPolygon using WKT
select ST_ MultiPolygon ('multipolygon(((30 20, 45 40, 10 40, 30 20)),
((15 5, 40 10, 10 20, 5 10, 15 5)))', 8307) from hivetable LIMIT 1;
-- creates MultiPolygons using a HiveRecordInfoProvider
select ST_ MultiPolygon (geoColumn, ‘mypackage.hiveRecordInfoProviderImpl’) from hivetable;

B.17 ST_Point

形式

ST_Point(
geometry STRING
srid INT);

または

ST_Point(
geometry BINARY
srid INT);

または

ST_Point(
geometry Object
hiveRecordInfoProvider STRING);

説明

点ジオメトリをGeoJSON形式で作成し、ジオメトリのGeoJSON文字列表現を返します。

パラメータ

geometry

GeoJSONまたはWKT文字列からジオメトリを作成するには(最初の形式): GeoJSONまたはWKT形式のジオメトリ定義。

WKBオブジェクトからジオメトリを作成するには(2番目の形式): WKB形式のジオメトリ定義。

Hiveオブジェクトを使用してジオメトリを作成するには(3番目の形式): Hiveでサポートされているタイプのジオメトリ定義。

srid

空間参照システム(座標系)識別子。

HiveRecordProvider

ジオメトリをGeoJSON形式で抽出するためのインタフェースoracle.spatial.hadoop.vector.hive.HiveRecordInfoProviderの実装の完全修飾名。

使用上の注意

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」を参照してください。

例

-- creates a point using GeoJSON
select ST_Point (' { "type": "Point", "coordinates": [100.0, 0.0]}', 8307) from hivetable LIMIT 1;
-- creates a point using WKT
select ST_Point ('point(100.0 0.0)', 8307) from hivetable LIMIT 1;
-- creates the points using a HiveRecordInfoProvider
select ST_Point (geoColumn, ‘hive.samples.SampleHiveRecordInfoProviderImpl’) from hivetable;

B.18 ST_Polygon

形式

ST_Polygon(
geometry STRING
srid INT);

または

ST_Polygon(
geometry BINARY
srid INT);

または

ST_Polygon(
geometry Object
hiveRecordInfoProvider STRING);

説明

ポリゴン・ジオメトリをGeoJSON形式で作成し、ジオメトリのGeoJSON文字列表現を返します。

パラメータ

geometry

GeoJSONまたはWKT文字列からジオメトリを作成するには(最初の形式): GeoJSONまたはWKT形式のジオメトリ定義。

WKBオブジェクトからジオメトリを作成するには(2番目の形式): WKB形式のジオメトリ定義。

Hiveオブジェクトを使用してジオメトリを作成するには(3番目の形式): Hiveでサポートされているタイプのジオメトリ定義。

srid

空間参照システム(座標系)識別子。

HiveRecordProvider

ジオメトリをGeoJSON形式で抽出するためのインタフェースoracle.spatial.hadoop.vector.hive.HiveRecordInfoProviderの実装の完全修飾名。

使用上の注意

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」を参照してください。

例

-- creates a polygon using GeoJSON
select ST_Polygon (' { "type": "Polygon","coordinates": [ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]] }', 8307) from hivetable LIMIT 1;
-- creates a polygon using WKT
select ST_ Polygon ('polygon((0 0, 10 0, 10 10, 0 0))', 8307) from hivetable LIMIT 1;
-- creates the polygons using a HiveRecordInfoProvider
select ST_ Polygon (geoColumn, ‘mypackage.hiveRecordInfoProviderImpl’) from hivetable;

B.19 ST_Simplify

形式

ST_Simplify(
geometry   ST_Geometry,
threshold  NUMBER);

説明

Douglas-Peuckerアルゴリズムを使用して入力ジオメトリを簡素化することにより、新しいST_Geometryオブジェクトを生成します。

パラメータ

geometry

任意の2次元オブジェクト。ジオメトリが測地である場合、これはWGS84空間参照システム内の緯度/情報値として解釈され、bufferWidthおよびtoleranceはメートルとして解釈されます。

threshold

ジオメトリの簡素化に使用するしきい値。正数である必要があります。(ゼロを使用すると、入力ジオメトリが返されます。)入力ジオメトリが測地である場合、この値はメートル数です。入力ジオメトリが測地以外である場合、この値はデータに関連付けられた単位数です。

しきい値が下がると、生成されるジオメトリが入力ジオメトリに近くなる可能性があり、しきい値が上がると、返されるジオメトリ内の頂点の数が減る可能性があります。

使用上の注意

しきい値に応じて、ポリゴンを線または点に簡素化したり、線を点に簡素化したりできます。したがって、出力ジオメトリ・タイプが入力ジオメトリ・タイプとは異なる可能性があるため、出力オブジェクトのタイプをチェックする必要があります。

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」も参照してください。

例

select ST_Simplify(
ST_Polygon('{"type": "Polygon","coordinates": [[[1, 2], [1.01, 2.01], [5, 2], [5, 6], [1, 6], [1, 2]]]}', 8307),
1)
from hivetable LIMIT 1;
-- return {"type":"Polygon", "coordinates":[[[1,2],[5,2],[5,6],[1,6],[1,2]]],"crs":{"type":"name","properties":{"name":"EPSG:8307"}}}

B.20 ST_SimplifyVW

形式

ST_SimplifyVW(
geometry   ST_Geometry,
threshold  NUMBER);

説明

Visvalingham-Whyattアルゴリズムを使用して入力ジオメトリを簡素化することにより、新しいST_Geometryオブジェクトを生成します。

パラメータ

geometry

任意の2次元オブジェクト。ジオメトリが測地である場合、これはWGS84空間参照システム内の緯度/情報値として解釈され、bufferWidthおよびtoleranceはメートルとして解釈されます。

threshold

ジオメトリの簡素化に使用するしきい値。正数である必要があります。(ゼロを使用すると、入力ジオメトリが返されます。)入力ジオメトリが測地である場合、この値はメートル数です。入力ジオメトリが測地以外である場合、この値はデータに関連付けられた単位数です。

しきい値が下がると、生成されるジオメトリが入力ジオメトリに近くなる可能性があり、しきい値が上がると、返されるジオメトリ内の頂点の数が減る可能性があります。

使用上の注意

しきい値に応じて、ポリゴンを線または点に簡素化したり、線を点に簡素化したりできます。したがって、出力ジオメトリ・タイプが入力ジオメトリ・タイプとは異なる可能性があるため、出力オブジェクトのタイプをチェックする必要があります。

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」も参照してください。

例

select ST_SimplifyVW(
ST_Polygon('{"type": "Polygon","coordinates": [[[1, 2], [1.01, 2.01], [5, 2], [5, 6], [1, 6], [1, 2]]]}', 8307),
50)
from hivetable LIMIT 1;
-- return {"type":"Polygon", "coordinates":[[[1,2],[5,6],[1,6],[1,2]]],"crs":{"type":"name","properties":{"name":"EPSG:8307"}}}

B.21 ST_Volume

形式

ST_Volume(
multipolygon  ST_MultiPolygon,
tolerance     NUMBER DEFAULT 0 (nongeodetic geometries) or 0.05 (geodetic geometries));

説明

マルチポリゴン3次元ジオメトリの領域を返します。マルチポリゴンは立体として処理されます。

パラメータ

multipolygon

ST_Multipolygonオブジェクト。

tolerance

2つの点が離れていながら同じであると見なすことができる距離を表す値。

使用上の注意

投影されたデータの場合、ボリュームの単位は投影の単位と同じです。測地データの場合、ボリュームは立方メートルです。

エラーの場合、-1を返します。

コンセプトおよび使用に関する情報は、「Oracle Big Data Spatial Vector Hive Analysis」も参照してください。

例

select select ST_Volume(
ST_MultiPolygon (' { "type": "MultiPolygon", "coordinates":
[[[[0, 0, 0], [0, 0, 1], [0, 1, 1], [0, 1, 0], [0, 0, 0]]],
[[[0, 0, 0], [0, 1, 0], [1, 1, 0], [1, 0, 0], [0, 0, 0]]],
[[[0, 0, 0], [1, 0, 0], [1, 0, 1], [0, 0, 1], [0, 0, 0]]],
[[[1, 1, 0], [1, 1, 1], [1, 0, 1], [1, 0, 0], [1, 1, 0]]],
[[[0, 1, 0], [0, 1, 1], [1, 1, 1], [1, 1, 0], [0, 1, 0]]],
[[[0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1], [0, 0, 1]]]]}',
0))
from hivetable LIMIT 1; -- return 1.0

Oracleの法律上の注意点

コピーライト

Copyright © 1994-2018, Oracle and/or its affiliates. All rights reserved.

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクルまでご連絡ください。

制限付権利について

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、Oracle Corporationおよびその関連会社は一切の責任を負いかねます。

商標と登録商標について

OracleおよびJavaはオラクルおよびその関連会社の登録商標です。その他の社名、商品名等は各社の商標または登録商標である場合があります。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

Pre-General Availability (一般提供前)版のドキュメントについて

このドキュメントがPre-General Availability (一般提供前)版の場合:

このドキュメントはPre-General Availability (一般提供前)版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。Oracle Corporationおよびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

非公開のPre-General Availability (一般提供前)版のドキュメントについて

このドキュメントが非公開のPre-General Availability (一般提供前)版の場合:

このドキュメントに含まれる情報は、情報の共有のみを目的としたものであって、顧客諮問委員会(Customer Advisory Board)のメンバーとしてのお客様の立場でのみ、またはお客様のPre-General Availability Trial Agreement (Pre-GAトライアル契約)のみに従って検討されるべきものとします。マテリアル、コード、または機能の提供をお約束するものではなく、購入決定を行う際の判断材料とすべきではありません。このドキュメントに記載されている特徴または機能の開発、リリースおよび時期については、オラクルの裁量により決定されます。

このドキュメントには、ソフトウェアまたは印刷物などの形式を問わず、オラクルが独占的な権利を有する財産的情報が含まれています。この機密資料へのアクセスと使用は、お客様とオラクルとの間で締結され、お客様が遵守に同意した、Oracle Master Agreement、Oracle License and Oracle Services Agreement (オラクル・ライセンスおよびサービスに関する契約書)、Oracle Partner Network Agreement、Oracle Distribution Agreementまたはその他のライセンス契約の条件に従うものとします。このドキュメントとその内容の開示、コピー、複製および配布には、オラクルによる事前の承諾を必要とします。このドキュメントはライセンス契約の一部となるものではなく、オラクルおよびその子会社や関連会社との契約を構成するものではありません。

ドキュメントのアクセシビリティ

オラクルのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracle Supportへのアクセス

サポートをご契約のお客様には、My Oracle Supportを通して電子支援サービスを提供しています。詳細情報は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info)か、聴覚に障害のあるお客様は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)を参照してください。