Oracle® Big Data Spatial and Graph

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

リリース1.1

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

2015年12月

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

E70114-02

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

原本著者: Chuck Murray、Harihara Subramanian、Donna Carver

原本協力者: 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およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

図一覧

表一覧

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

はじめに

- 対象読者

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

- 関連ドキュメント

- 表記規則

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 Oracle Big Data ApplianceディストリビューションのためのImage Processing Frameworkのインストール

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

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

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

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

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

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

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

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

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

- 1.7.1.1 Oracle Big Data ApplianceでImage Serverをインストールするための前提条件

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

- 1.7.1.3 環境の構成

- 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.8 Oracle Big Data Spatial Hadoop Vectorコンソールのインストール

- 1.8.1 前提および前提条件ライブラリ

- 1.8.1.1 前提

- 1.8.1.2 前提条件ライブラリ

- 1.8.2 Oracle Big Data ApplianceでのSpatial Hadoop Vectorコンソールのインストール

- 1.8.3 その他システム(Big Data Appliance以外)のSpatial Hadoop Vectorコンソールのインストール

- 1.8.4 Oracle Big Data ApplianceでのSpatial Hadoop Vectorコンソールの構成

- 1.8.5 その他システム(Big Data Appliance以外)のSpatial Hadoop Vectorコンソールの構成

- 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.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.6 Oracle Spatial Hadoop Raster Processing APIを使用したイメージのロードおよび処理

- 2.7 Oracle Big Data Spatial Vector Analysis

- 2.7.1 空間の索引付け

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

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

- 2.7.1.3 空間索引の入力形式

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

- 2.7.2 MVSuggestの使用

- 2.7.3 空間のフィルタ処理

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

- 2.7.4 データの階層分類

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

- 2.7.4.2 検索階層の制御

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

- 2.7.5 バッファの生成

- 2.7.6 空間のビニング

- 2.7.7 空間のクラスタ化

- 2.7.8 RecordInfoProvider

- 2.7.8.1 サンプルRecordInfoProvider実装

- 2.7.8.2 LocalizableRecordInfoProvider

- 2.7.9 HierarchyInfo

- 2.7.9.1 サンプルHierarchyInfo実装

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

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

- 2.8 Oracle Big Data Spatial and Graph Vectorコンソールの使用

- 2.8.1 コンソールを使用した空間索引の作成

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

- 2.8.3 コンソールを使用したカテゴリ化ジョブの実行

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

- 2.8.5 手動でのカテゴリ化結果の作成

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

- 2.8.7 テンプレートの構成

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

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

- 2.8.10 階層結果を作成するジョブの実行

- 2.8.11 バッファを生成するジョブの実行

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

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

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

- 3.1 ソフトウェア構成のチューニング

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

- 3.1.1.1 Apache HBase構成の変更

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

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

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

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

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

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

- 4.1.2.1 分析レイヤー

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

- 4.1.2.3 ストレージ管理

- 4.1.2.4 RESTful Webサービス

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

- 4.2.1 GraphMLデータ形式

- 4.2.2 GraphSONデータ形式

- 4.2.3 GMLデータ形式

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

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

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

- 4.4.1 Java APIの概要

- 4.4.1.1 Oracle Big Data Spatial and Graph Java API

- 4.4.1.2 TinkerPop Blueprints Java API

- 4.4.1.3 Apache Hadoop Java API

- 4.4.1.4 Oracle NoSQL Database Java API

- 4.4.1.5 Apache HBase Java API

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

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

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

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

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

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

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

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

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

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

- 4.4.3.1 Oracle NoSQL Databaseの使用

- 4.4.3.2 Apache HBaseの使用

- 4.4.4 頂点の作成

- 4.4.5 エッジの作成

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

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

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

- 4.4.8.1 Oracle NoSQL Databaseの使用

- 4.4.8.2 Apache HBaseの使用

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

- 4.5.1 Apache Lucene検索エンジンによる自動索引の使用

- 4.5.2 SolrCloud検索エンジンによる手動索引の使用

- 4.5.3 データ型の処理

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

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

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

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

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

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

- 4.7 セキュアなApache HBase/Hadoopのサポート

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

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

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

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

- 4.9.3 出力の例について

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

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

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

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

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

- 4.10.2 頂点ファイル

- 4.10.3 エッジ・ファイル

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

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

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

5 インメモリー分析の使用

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

- 5.1.1 インメモリー分析サーバー・インスタンスへの接続

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 5.4.1 インメモリー分析について

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

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

- 5.5 サブグラフの作成

- 5.5.1 フィルタ式について

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

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

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

- 5.6 Jettyへのデプロイ

- 5.6.1 認証メカニズムについて

- 5.7 Apache Tomcatへのデプロイ

- 5.8 Oracle WebLogic Serverへのデプロイ

- 5.8.1 Oracle WebLogic Serverのデプロイ

- 5.8.2 インメモリー分析のデプロイ

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

- 5.9 インメモリー分析サーバーへの接続

- 5.9.1 インメモリー分析シェルによる接続

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

- 5.9.2 Javaによる接続

- 5.9.3 HTTPリクエストによる接続

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

- 5.10.1 HDFSからのデータのロード

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

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

- 5.11 YARNアプリケーションとしてのインメモリー分析の実行

- 5.11.1 インメモリー分析サービスの開始および停止

- 5.11.1.1 インメモリー分析YARNクライアントの構成

- 5.11.1.2 新規インメモリー分析サービスの開始

- 5.11.1.3 長期実行インメモリー分析サービスについて

- 5.11.1.4 インメモリー分析サービスの停止

- 5.11.2 インメモリー分析サービスへの接続

- 5.11.3 インメモリー分析サービスの監視

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

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

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

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

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

- 6.2.3 ビデオでの顔の検出

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

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

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

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

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

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 fluent

- A.12 Apache Groovy

- A.13 Apache htrace

- A.14 Apache HTTP Client

- A.15 Apache HTTPComponents Core

- A.16 Apache Jena

- A.17 Apache Log4j

- A.18 Apache Lucene

- A.19 Apache Xerces2

- A.20 Apache xml-commons

- A.21 Cloudera CDH

- A.22 Fastutil

- A.23 GeoNamesデータ

- A.24 Geospatial Data Abstraction Library (GDAL)

- A.25 Google Guava

- A.26 Google Guice

- A.27 Google protobuf

- A.28 Jackson

- A.29 Jansi

- A.30 JCodec

- A.31 Jettison

- A.32 JLine

- A.33 Javassist

- A.34 Jung

- A.35 MessagePack

- A.36 Netty

- A.37 OpenCV

- A.38 Slf4j

- A.39 Tinkerpop Blueprints

- A.40 Tinkerpop Gremlin

- A.41 Tinkerpop Pipes

図一覧

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

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

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

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

- 5-3 src.prop == 10と一致するエッジ

- 5-4 簡易フィルタで作成されたグラフ

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

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

表一覧

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

- 2-1 ImageBandWritableプロパティ

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

- 4-1 Apache Luceneデータ型識別子

- 4-2 SolrCloudデータ型識別子

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

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

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

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

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

はじめに

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

対象読者

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

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

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

Oracle Supportへのアクセス

サポートを購入したOracleのお客様は、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 Connectorsユーザーズ・ガイド』

- Oracle Big Data Spatial and Graph Apache HBase Java APIリファレンス

- Oracle Big Data Spatial and Graph Oracle NoSQL Database Java APIリファレンス

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

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

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

表記規則

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

規則

意味

太字

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

イタリック

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

固定幅フォント

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

1 Big Data Spatial and Graphの概要

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

- Big Data Spatial and Graphについて

- 空間機能

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

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

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

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

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

- Oracle Big Data Spatial Hadoop Vectorコンソールのインストール

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

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

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 Special 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 Special 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オーナーズ・ガイド』を参照してください。

ソフトウェア構成手順の詳細は、『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のインストール」の手順に従ってください。

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

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

Oracle Big Data Applianceのディストリビューションでは、構成があらかじめインストールされています。ただし、これが確実に機能するように次のアクションを実行してください。

- /opt/shareddir/spatialでALL_ACCESS_FOLDERを特定します。

- libproj.so (Proj.4) Cartographic Projections Libraryをユーザーがアクセスできるようにし、次のようにlibproj.soを/opt/oracle/oracle-spatial-graph/spatial/gdal/lib,のgdal/libフォルダにコピーします。

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

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

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

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

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

1.6.2 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で作成したディレクトリ構造にフォルダconsole、examples、jlib、gdal、およびtestsがあることを確認します。また、index.htmlはコンテンツを表し、HadoopRasterProcessorAPI.zipにはAPIのJavadocがあります。

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

1. libproj.so (Proj.4) Cartographic Projections Libraryをユーザーがアクセスできるようにし、libproj.soを/opt/oracle/oracle-spatial-graph/spatial/raster/gdal/lib,のgdal/libにコピーします。

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

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

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

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

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

4. このジョブ実行に関連するすべてのユーザーの書込みアクセス権とともに、ALL_ACCESS_FOLDERにディレクトリSHARED_FOLDERを作成します。テスト実行のためにhdfsユーザーがここに表示されますが、このユーザーによってジョブ結果が書き込まれるため、yarnユーザーにも書込みアクセス権を検討してください。この構成には、グループ・アクセスを使用できます。

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

cd SHARED_FOLDER

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

mkdir ALL_ACCESS_FOLDER

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

chmod 777 ALL_ACCESS_FOLDER

5. /opt/oracle/oracle-spatial-graph/spatial/demoのデータ・フォルダをALL_ACCESS_FOLDERにコピーします。

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

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

chmod 777 ALL_ACCESS_FOLDER/data/xmls/

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

いくつかのテスト用スクリプトが用意されており、イメージのロード機能、イメージの処理機能、DEMでの勾配計算の処理クラス、およびマップ代数演算をテストできます。これらのスクリプトを実行して、イメージ処理フレームワークが正常にインストールされたことを検証します。

スクリプトを実行するには、現在のユーザーがhdfsユーザーであることを確認してください。スクリプトを実行する前にこのユーザーに切り替え、このユーザーに必要なディレクトリへの書込みアクセス権があることを確認します。

sudo su - hdfs

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

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

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

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

/oracle/oracle-spatial-graph/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 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

1.6.3.2 Image Processorテスト・スクリプト

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

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

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

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

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

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

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

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

./runimageprocessor.sh

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

./runimageprocessor.sh -s ALL_ACCESS_FOLDER

実行が完了すると、ファイルのある場所を示すHDFS内のパス(このパスはALL_ACCESS_FOLDERの定義によって異なります)、およびHDFSに作成されたイメージとサムネイルのリストを示すメッセージ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.3.3 Image Processor DEMテスト・スクリプト

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

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

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

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

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

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

./runimageprocessordem.sh

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

./runimageprocessordem.sh -s ALL_ACCESS_FOLDER

実行が完了すると、ファイルのある場所を示すHDFS内のパス(このパスはALL_ACCESS_FOLDERの定義によって異なります)、およびHDFSに作成されたイメージとサムネイルのリストを示すメッセージ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.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コンソールのインストール後の検証の例」を参照)。

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

このトピックでは、次の手順に従います。

- Oracle Big Data ApplianceでImage Serverをインストールするための前提条件

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

- 環境の構成

1.7.1.1 Oracle Big Data ApplianceでImage Serverをインストールするための前提条件

1. Jettyダウンロード・ページhttp://www.eclipse.org/jetty/downloads.phpからOracle DBAリソース・マネージャ・ノードに最新のJettyコア・コンポーネント・バイナリをダウンロードします。

2. Jetty webappsディレクトリ、または次のように選択したディレクトリで、imageserver.warを解凍します。

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

注意:

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

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

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

4. $JETTY_HOME/start.iniファイルを編集し、プロパティjsp-impl=apacheを任意にjsp-impl=glassfishに変更します。これらのjarはhttp://mvnrepository.com/またはApache jarプロバイダからダウンロードできます。

xalan-2.7.1.jar

xercesImpl-2.11.0.jar

xml-apis-1.4.01.jar

serializer-2.7.1.jar

5. これらのjarsを$JETTY_HOME/lib/apache-jspにコピーします。

6. 次を実行してバージョンを確認します: $JETTY_HOME/java -jar start.jar –version

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

1. /opt/oracle/oracle-spatial-graph/spatial/jlib/gdal.jarのgdal.jarファイルを$JETTY_HOME/lib/extにコピーします。

2. /opt/oracle/oracle-spatial-graph/spatial/conf/jetty-imgserver-realm.propertiesファイルを$JETTY_HOME/etcフォルダにコピーします

3. $JETTY_HOME/etc/jetty-imgserver-realm.propertiesファイルを編集してパスワードとロールを追加します

a. <password>を削除して新しいパスワードを入力します。

b. <admin_role>テキストから<>を削除してadmin_roleを保持します。

4. java -jar $JETTY_HOME/start.jarを実行してjettyサーバーを起動します。

1.7.1.3 環境の構成

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

2. 「Oracle Big Data ApplianceでのImage Server Webのインストール」で作成した資格証明を使用してコンソールにログインします。

3. 「Hadoop Configuration Parameters」セクションの「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クラスタ環境にあらかじめロードされています。

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

ヒント:

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

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

このトピックでは、次の手順に従います。

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

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

- 環境の構成

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

- 「その他のディストリビューションのImage Processing Frameworkをインストールするための前提条件」に示す手順を実行します。

- 「その他のディストリビューションのImage Processing Frameworkのインストール」に示す手順を実行します。

- 「環境の構成」に示す手順を実行します。

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

- 「Oracle Big Data ApplianceでImage Serverをインストールするための前提条件」に示す手順を実行します。

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

- 「環境の構成」に示す手順を実行します。

1.7.2.3 環境の構成

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

2. 「Oracle Big Data ApplianceでのImage Server Webのインストール」で作成した資格証明を使用してコンソールにログインします。

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

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

b. 「Start」に完全な書込みアクセス権のあるsaveimagesという子フォルダを作成します。たとえば、「Start=/home」の場合はsaveimages=/home/saveimagesです。

c. クラスタにSHARED_FOLDERにアクセスするマウント・ポイントが必要な場合は、マウント・ポイントを指定します。たとえば、/net/homeです。そうでない場合は、空白のままにして続行します。

d. Hadoopネイティブ・ライブラリと追加ライブラリが含まれているフォルダのパスを入力します(HADOOP_LIB_PATH)。

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

注意:

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

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

ヒント:

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

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

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

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

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

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

関連サブトピック:

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

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

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

1. (http://<hostname>:8080/imageserver/console.jsp)Image Serverコンソールを開きます。

2. デフォルトのユーザー/パスワードadmin/adminを使用してログインします。

3. 「Hadoop Loader」タブに移動します。

4. 「Open」をクリックし、ハワイの一連のイメージのあるdemoフォルダを参照します。これらは/opt/shareddir/spatial/demo/imageserver/imagesにあります。

5. imagesフォルダを選択し、「Load images」をクリックします。

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

注意:

エラーが表示されなければ、これでImage Loader Webインタフェースのインストールが完了しました。

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

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

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

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

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

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

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

5. newdataフォルダを参照し、イメージを確認します。

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

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

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

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

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

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

10. 「Load default configuration file」をクリックし、/opt/shareddir/spatial/demo/imageserverを参照してtestFS.xmlを選択します。

注意:

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

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

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

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

1.8 Oracle Big Data Spatial Hadoop Vectorコンソールのインストール

Oracle Big Data Spatial Hadoop Vectorコンソールをインストールするには、このトピックの手順を実行します。

- 前提および前提条件ライブラリ

- Oracle Big Data ApplianceでのSpatial Hadoop Vectorコンソールのインストール

- その他システム(Big Data Appliance以外)のSpatial Hadoop Vectorコンソールのインストール

- Oracle Big Data ApplianceでのSpatial Hadoop Vectorコンソールの構成

- その他システム(Big Data Appliance以外)のSpatial Hadoop Vectorコンソールの構成

1.8.1 前提および前提条件ライブラリ

次の前提、および前提条件がSpatial Hadoop Vectorコンソールのインストールと構成に適用されます。

1.8.1.1 前提

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

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

1.8.1.2 前提条件ライブラリ

Vector Analysis APIでは、Hadoop環境jarsの他にもここに示すライブラリが必要です。

sdohadoop-vector.jar
sdoutil.jar
sdoapi.jar
ojdbc.jar
commons-fileupload-1.3.1.jar
commons-io-2.4.jar
jackson-annotations-2.1.4.jar
jackson-core-2.1.4.jar
jackson-core-asl-1.8.1.jar
jackson-databind-2.1.4.jar
javacsv.jar
lucene-analyzers-common-4.6.0.jar
lucene-core-4.6.0.jar
lucene-queries-4.6.0.jar
lucene-queryparser-4.6.0.jar
mvsuggest_core.jar
sqlite-jdbc-3.7.15-M1.jar

1.8.2 Oracle Big Data ApplianceでのSpatial Hadoop Vectorコンソールのインストール

1. Jettyダウンロード・ページhttp://www.eclipse.org/jetty/downloads.phpからOracle DBAリソース・マネージャ・ノードに最新のJettyコア・コンポーネント・バイナリをダウンロードします。

2. Jetty webappsディレクトリで、次のようにspatialviewer.warファイルを解凍します。

unzip /opt/oracle/oracle-spatial-graph/spatial/vector/console/spatialviewer.war -d $JETTY_HOME/webapps/spatialviewer

注意:

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

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

cp /opt/cloudera/parcels/CDH/lib/hadoop/client/* $JETTY_HOME/webapps/spatialviewer/WEB-INF/lib/

4. 「Oracle Big Data ApplianceでのSpatial Hadoop Vectorコンソールのインストール」で説明した構成手順を完了します。

5. Jettyサーバーを起動します。$JETTY_HOME/java -jar start.jar

1.8.3 その他システム(Big Data Appliance以外)のSpatial Hadoop Vectorコンソールのインストール

「Oracle Big Data ApplianceでのSpatial Hadoop Vectorコンソールのインストール」で説明した手順を実行します。ただし、ステップ3では、パス/opt/cloudera/parcels/CDH/lib/を実際のライブラリ・パス(デフォルトは/usr/lib/)に置き換えます。

1.8.4 Oracle Big Data ApplianceでのSpatial Hadoop Vectorコンソールの構成

1. 構成ファイル$JETTY_HOME/webapps/spatialviewer/conf/console-conf.xmlを編集し、電子メール送信用、およびその他の構成パラメータ用のデータを指定します。
構成パラメータを使用して、次の手順を実行します

a. 通知URLを編集します。これはコンソール・サーバーが稼働しているURLです。Hadoopクラスタに対しては、ジョブの終了を通知するよう表示される必要があります。設定例は次のとおりです: <baseurl>http:// hadoop.console.url:8080</baseurl>

b. 階層関係の一時データを含むHDFSパスである、一時的な階層索引を使用してディレクトリを編集します。例: <hierarchydataindexpath>hdfs://hadoop.cluster.url:8020/user/myuser/hierarchyIndexPath</hierarchydataindexpath>

c. MVSuggestで生成済の索引を含むHDFSディレクトリを編集します。例: <mvsuggestindex> hdfs://hadoop.cluster.url:8020/user/myuser /mvSuggestIndex</mvsuggestindex>

d. 必要に応じて、eLocationの背景マップを取得するURLを編集します。例: <elocationmvbaseurl>http://elocation.oracle.com/mapviewer</elocationmvbaseurl>

f. 索引メタデータを含むHDFSディレクトリを編集します。例: <indexmetadatapath>hdfs:// hadoop.cluster.url:8020/user/myuser/indexMetadata</indexmetadatapath>

g. データ・プロセスの調査に使用する一時データのHDFSディレクトリを編集します。例: <exploretempdatapath>hdfs:// hadoop.cluster.url:8020/user/myuser/exploreTmp<exploretempdatapath>

h. 一般的なHadoopジョブ構成を編集します。このコンソールでは2つのHadoopジョブを使用します。1つ目はHDFSの既存ファイル上に空間索引を作成し、2つ目は索引に基づいて表示される結果を生成します。構成の一部は両方のジョブに共通のものであり、別の一部は各ジョブに固有のものです。共通の構成は、<hadoopjobs><configuration>要素内にあります。構成の例を次に示します。

<hadoopjobs>
<configuration>
<property>
<!--hadoop user. The user is a mandatory property.-->
<name>hadoop.job.ugi</name>
<value>hdfs</value>
</property>

<property>
<!-- like defined in core-site.xml
If in core-site.xml the path fs.defaultFS is define as the nameservice ID
(High Availability configuration) then set the full address and IPC port
of the currently active name node. The service is define in the file hdfs-site.xml.-->
<name>fs.defaultFS</name>
<value>hdfs://hadoop.cluster.url:8020</value>
</property>

<property>
<!-- like defined in mapred-site.xml -->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

<property>
<!-- like defined in yarn-site.xml -->
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop.cluster.url:8030</value>
</property>

<property>
<!-- like defined in yarn-site.xml -->
<name>yarn.resourcemanager.address</name>
<value>hadoop.cluster.url:8032</value>
</property>

<property>
<!-- like defined in yarn-site.xml (full path) -->
<name>yarn.application.classpath</name>
<value>/etc/hadoop/conf/,/opt/cloudera/parcels/CDH/lib/hadoop/*,/opt/cloudera/parcels/CDH/lib/hadoop/lib/*,/opt/cloudera/parcels/CDH/lib/hadoop-hdfs/*,/opt/cloudera/parcels/CDH/lib/hadoop-hdfs/lib/*,/opt/cloudera/parcels/CDH/lib/hadoop-yarn/*,/opt/cloudera/parcels/CDH/lib/hadoop-yarn/lib/*,/opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/*,/opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/lib/*</value>
</property>
</configuration>
<hadoopjobs>

2. 索引ジョブ固有の構成を作成します。空間索引を作成するジョブには、追加のHadoopパラメータを指定できます。追加の構成は次のとおりです。

<hadoopjobs>
<configuration>
...
</configuration>
<indexjobadditionalconfiguration>
<property>
<!-- Increase the mapred.max.split.size, so that less mappers are allocated in slot and thus reduces the mapper initializing overhead. -->
<name>mapred.max.split.size</name>
<value>1342177280</value>
</property>
</indexjobadditionalconfiguration>
<hadoopjobs>

3. カテゴリ化の結果を生成するジョブに固有の構成を作成します。プロパティ設定の例を次に示します。

<hadoopjobs>
<configuration>
...
</configuration>

<indexjobadditionalconfiguration>
...
</indexjobadditionalconfiguration>

<hierarchicaljobadditionalconfiguration>
<property>
<!-- Increase the mapred.max.split.size, so that less mappers are allocated in slot and thus reduces the mapper initializing overhead. -->
<name>mapred.max.split.size</name>
<value>1342177280</value>
</property>
</hierarchicaljobadditionalconfiguration>
<hadoopjobs>

4. 通知電子メールを指定します。ジョブ完了ステータスを通知する電子メール通知が送信されます。これは<notificationmails>要素内で定義されます。ユーザー(<user>)、パスワード(<password>)および送信者電子メール(<mailfrom>)の指定は必須です。<configuration>要素では、Javaメールに必要な構成プロパティを設定する必要があります。この例は、SSL接続を使用したSMTPサーバーを介した電子メール送信の標準的な構成です。

<notificationmails>
<!--Authentication parameters. The Authentication parameters are mandatory.-->
<user>user@mymail.com</user>
<password>mypassword</password>
<mailfrom>user@mymail.com</mailfrom>

<!--Parameters that will be set to the system properties. Below the parameters needed to send mails via SMTP server using a SSL connection.    -->

<configuration>
<property>
<name>mail.smtp.host</name>
<value>mail.host.com</value>
</property>

<property>
<name>mail.smtp.socketFactory.port</name>
<value>myport</value>
</property>

<property>
<name>mail.smtp.socketFactory.class</name>
<value>javax.net.ssl.SSLSocketFactory</value>
</property>

<property>
<name>mail.smtp.auth</name>
<value>true</value>
</property>
</configuration>
</notificationmails>

1.8.5 その他システム(Big Data Appliance以外)のSpatial Hadoop Vectorコンソールの構成

「Oracle Big Data ApplianceでのSpatial Hadoop Vectorコンソールの構成」で説明した手順を実行します。ただし、この手順(一般的なHadoopジョブ構成)では、Hadoopプロパティyarn.application.classpathによって/opt/cloudera/parcels/CDH/lib/が実際のライブラリ・パス(デフォルトは/usr/lib/)と置き換えられます。

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

これらの製品のサポート・バージョンおよび相互依存性の詳細は、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/jdk7

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.2.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

2. /opt/oracle/oracle-spatial-graph/multimediaを指し示すように$MMA_HOMEを設定します。

3. 次のライブラリの場所を特定します。

- Hadoop jarファイル($HADOOP_HOME/jarsで使用可能)

- ビデオ処理ライブラリ(「トランスコーディング・ソフトウェア(オプション)」を参照)

- OpenCVライブラリ(製品で使用可能)

4. 必要であれば、ビデオ・データをトランスコーディングするために必要なビデオ処理ソフトウェアをインストールします(「トランスコーディング・ソフトウェア(オプション)」を参照)。

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ベクトル・データおよびラスター・データの処理

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

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

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

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

- Oracle Big Data Spatial Vector Analysis

- Oracle Big Data Spatial and Graph Vectorコンソールの使用

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

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

空間データは、実際の空間または地理情報システム(GIS)やその他の位置情報アプリケーション上の概念的な空間に関連する実際、または概念的なオブジェクトの位置特性を表します。

Oracle Big Data Spatial and Graphの機能では、位置情報に基づく意思決定のために、空間データを迅速かつ効率的に格納、アクセス、および分析できます。

この機能を使用して、特定の位置の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開発者ガイド』を参照してください

空間のコンセプト、データおよび操作の概要は、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環境にロードします。ラスター空間データでは、次の基本操作を実行できます。

- モザイク: 複数のラスター・イメージを組み合せて単一のモザイク・イメージを作成します。

- サブセット: 個々のイメージに対してサブセット操作を実行します。

この機能は、ラスター分析操作のためのMapReduceフレームワークをサポートしています。ユーザーは、ラスター・データの代数関数などの独自のラスター操作をカスタムで構築できます。たとえば、地形など、数値標高モデルや空間的表面の3次元の表現の各基盤の傾斜を計算します。詳細は、「ラスター・データ処理のためのOracle Big Data Spatial Hadoop Image Processing Framework」を参照してください。

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

この機能は、空間ベクトル・データの処理をサポートしています。

- Hadoop HDFS環境へのロードおよび格納

- デカルトまたは測地データとして格納

格納された空間ベクトル・データは次の問合せ操作などの実行に使用されます。

- ポイントインポリゴン

- 距離計算

- ANYINTERACT

- バッファ作成

空間ベクトル・データでは、2つの異なるデータ・サービス操作がサポートされています。

- データ・エンリッチメント

- データ・カテゴリ化

また、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ジョブで表されます。また、Image Server Webアプリケーションを使用してイメージをロードおよび処理し、Java APIを使用してフレームワークの機能を公開できます。

- Image Loader

- Image Processor

- Image Server

インストールと構成について詳しくは、次を参照してください。

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

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

- Big Data Spatial 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つ、ゼロ、または複数です。処理クラスの実行後、モザイク操作を実行し、ピクセルを調整してユーザーが要求した最終的な出力形式にします。

- マッパーは、データのローカル性を保ちながら、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>]

説明:

- SOURCE_IMGS_PATHはソース・イメージまたはフォルダのパスです。入力が複数の場合はカンマで区切ります。NFSを介してクラスタ内のすべてにアクセスできるパスを指定する必要があります。

- HDFS_OUTPUT_FOLDERはロードしたイメージを格納するHDFS出力フォルダです。

- OVERLAPPING_PIXELSはそれぞれの四角形の境界線上で重なるピクセルの任意の数であり、このパラメータが指定されていない場合、重なっている2つのピクセルのデフォルトが使用されます。

- GDAL_LIB_PATHはGDALライブラリの場所を示すパスです。

- GDAL_DATA_PATHはGDALデータ・フォルダの場所を示すパスです。NFSを介してクラスタ内のすべてにアクセスできるパスを指定する必要があります。

- THUMBNAIL_PATHはロードしたイメージのサムネイルを格納する任意のパスです。NFSを介してクラスタ内のすべてにアクセスでき、Yarnユーザーの書込みアクセス権のあるパスを指定する必要があります。

たとえば、次のコマンドでは、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

2.4.3 出力パラメータ

リデューサは、入力イメージごとに2つの出力ファイルを生成します。1つ目は、ソース・イメージのすべての四角形を集める.ohifファイルであり、それぞれの四角形は処理マッパーによって別のインスタンスとして処理されます。四角形は内部でHDFSブロックとして格納されます。ブロックは複数のノードに配置され、1つのノードには特定の.ohifファイルのブロックが1つ以上含まれます。.ohifファイルは/user/<USER_EXECUTING_JOB>/OUT_FOLDER/<PARENT_DIRECTORIES_OF_SOURCE_RASTER>フォルダのユーザーが指定したフォルダで、-outフラグを付けて格納され、ファイルは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 イメージ処理ジョブ

イメージ処理ジョブには、独自のカスタムFilterInputFormatがあり、SRIDおよび座標に基づいて処理対象の四角形を決定します。モザイク入力のデータ型(ピクセル深度)と同じデータ型(モザイク深度)のイメージのみが該当します。ユーザーがモザイク出力に指定した座標と交差する四角形のみが含まれます。四角形が選択されると、それぞれについてカスタムImageProcessSplitが作成されます。

マッパーがImageProcessSplitを受け取ると、ImageSplitの指定に基づいて情報が読み取られ、ユーザーが指定した帯域のみを選択するようフィルタ処理され、地図操作、および(要求に定義されていれば)処理クラスのリストが実行されます。

それぞれのマッパー処理は、データがあるノードで実行されます。地図代数演算および処理クラスが実行されると、最終プロセスによってモザイク操作が実行されます。モザイク操作では、すべての四角形から出力に適合するピクセルのみを選択し、必要に応じて解像度を変更してモザイク出力に追加します。その結果のバイト数は、ImageBandWritable型に含まれるコンテキストに設定されます。

1つのリデューサで複数の四角形を選択し、それをまとめます。ユーザーがHDFS出力を選択すると、ImageLoaderが呼び出され、結果がHDFSに格納されます。それ以外の場合、イメージはデフォルトでGDALによって用意され、ファイル・システム(NFS)に格納されます。

2.5.2 入力パラメータ

次の入力パラメータをHadoopコマンドに指定します。

hadoop jar /opt/oracle/oracle-spatial-graph/spatial/raster/jlib/hadoop-imageprocessor.jar
-catalog  <IMAGE_CATALOG_PATH>
-config  <MOSAIC_CONFIG_PATH>
[-usrlib  <USER_PROCESS_JAR_PATH>]
[-thumbnail  <THUMBNAIL_PATH>]
-gdal  <GDAL_LIBRARIES_PATH>
-gdalData  <GDAL_DATA_PATH>

説明:

- IMAGE_CATALOG_PATHは、処理対象のHDFSイメージをリストするカタログxmlへのパスです。

- MOSAIC_CONFIG_PATHは、出力モザイクの機能を定義するモザイク構成xmlへのパスです。

- USER_PROCESS_JAR_PATHは任意のユーザー定義jarファイルであり、ソース・イメージに適用される追加の処理クラスが含まれています。

- THUMBNAIL_PATHはロードしたイメージのサムネイル作成を有効化するための任意のフラグです。このパスは、クラスタ内のすべてのノードへのNFSを介してアクセスし、HDFS出力の場合のみ有効です。

- GDAL_LIBRARIES_PATHはGDALライブラリの場所を示すパスです。

- GDAL_DATA_PATHはGDALデータ・フォルダの場所を示すパスです。NFSを介してクラスタ内のすべてにアクセスできるパスを指定する必要があります。

たとえば、次のコマンドは、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プロパティ・ファイルを追加することによってオーバーライドできます。

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>
-<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"/>
<nodata>#000000</nodata>
<pixelType>1</pixelType>
</output>
-<crop>
-<transform>
356958.985610072,280.38843650364862,0,2458324.0825054757,0,-280.38843650364862 </transform>
</crop>
-<process>
-<class>oracle.spatial.imageporcessor.hadoop.process.ImageSlope </class>
</process>
<operations>
<localif operator="<" operand="3" newvalue="6"/>
<localadd arg="5"/>
<localsqrt/>
<localround/>
</operations>
</mosaic>

<mosaic>要素は処理出力の仕様を定義します。

<output>要素は出力に使用される<SRID>などの機能を定義します。異なるSRIDのすべてのイメージは、モザイクSRIDに変換され、その四角形がモザイクに適合するかどうかが判断されます。

<directory>要素は出力の場所を定義します。これは、タグの型で指定される、通常のファイルシステム(FS)またはHDFSのいずれかです。

<tempFsFolder>要素はモザイク出力を一時的に格納するパスを設定します。

<filename>および<format>要素は出力ファイル名を指定します。

<width>および<height>要素はモザイク出力の解像度を設定します。

<algorithm>要素はイメージの順序アルゴリズムを設定します。1はソースの最終変更日付順、2はイメージ・サイズ順を示します。順序タグは昇順モードまたは降順モードを表します。

<bands>要素は出力モザイクの帯域数を指定します。この数より帯域の少ないイメージは破棄されます。

<nodata>要素は、値のないモザイク出力のすべてのピクセルのうち、最初の3帯域の色を指定します。

<pixelType>要素はモザイク出力のピクセル・タイプを設定します。同じピクセル・サイズのないソース・イメージは処理段階で破棄されます。

<crop>要素は、モザイク出力に含まれる座標を、startcoordinateX、pixelXWidth、RotationX、startcoordinateY、RotationY、pixelheightYの順に定義します。

<process>要素はモザイク操作の前に実行するクラスをすべてリストします。この例では、傾斜の計算が適用されており、数値標高モデル(DEM)ファイルの32ビット・イメージにのみ有効です。

<operations>要素は、この要求で処理される地図代数演算をすべてリストします。

その他のユーザー作成処理クラスを指定できます。処理クラスが定義されていない場合は、モザイク操作のみ実行されます。

2.5.3 ジョブ実行

ジョブの最初のステップは、モザイクに適合する四角形をフィルタ処理することです。最初に、四角形のメタデータを保持している位置ファイルがInputFormatに送信されます。

pixelTypeを抽出すると、フィルタにより、関連するソース・イメージが処理に有効かどうかが判別されます。カタログxmlで作成したユーザー定義に基づき、次のいずれかが実行されます。

- イメージが処理に有効な場合、次にSRIDが評価されます

- ユーザー定義と異なる場合、すべての四角形のMBR座標がユーザーSRIDに変換され、評価されます。

この方法では、すべての四角形がモザイク定義と交差するかどうかが評価されます。交差している四角形のみが選択され、それぞれの分割が作成されます。

マッパーでは、格納先のノードでそれぞれの分割が処理されます。マッパーでは、ユーザーが定義した地図代数演算および処理クラスが順に実行され、次にモザイク処理が実行されます。1つのリデューサによってマッパーの結果がまとめられ、ユーザーの要求に応じてイメージがFSまたはHDFSに格納されます。ユーザーの要求がHDFSへの出力の格納の場合、ImageLoaderジョブが起動され、イメージが.ohifファイルとして格納されます。

デフォルトでは、マッパーとリデューサは2GBのJVMを取得できるよう構成されていますが、この設定、またはその他の構成プロパティは、コマンドを実行する同じフォルダの場所で、imagejob.propプロパティ・ファイルを追加することによってオーバーライドできます。

2.5.4 処理クラスおよびImageBandWritable

カタログXMLで指定した処理クラスは、ジョブで正しく処理できるように、次の一連のルールを遵守している必要があります。すべての処理クラスにImageProcessorInterfaceが実装されている必要があります。

処理クラスを実装するには、そのオブジェクト表現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を使用して実行および処理します

処理クラスおよびメソッド

四角形のピクセルを変更する場合は、次のメソッドを使用して、最初に帯域情報を配列に取り込みます。

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);

ここでは、帯域はピクセル情報を含むバイト数または浮動小数点の配列です。処理操作の結果、影響を受けるインスタンス・サイズ、データ型、bytesNumberおよびその他のプロパティを必ず更新してください。各プロパティには、セッターを使用できます。

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

Oracle Image Serverコンソールを使用している場合は、すべての処理クラスが単一のJARファイルに含まれます。コマンドライン・オプションを使用している場合、処理クラスはそれぞれ異なるJARファイルに配置されます。

新しいクラスは、クラスパスで表示されるようになると<process><class>セクションのモザイクXMLに追加されます。追加されたすべての<class>要素は、最終的なモザイク操作の実行前に表示順に実行されます。

2.5.5 地図代数演算

ローカル地図代数演算は入力ラスター上で処理でき、そこではピクセル数が操作に応じて変更されます。構成XMLの操作の順序によって、処理される操作の順序が決まります。すべての地図代数演算が処理されると、処理クラスが実行され、最後にモザイク操作が実行されます。

次の地図代数演算はモザイク構成XMLの<operations>要素に追加でき、演算名を要素名として使用できます。

localnot: 各ピクセルの否定を取得し、ビット・パターンを反転します。結果が負の値でデータ型が符号なしの場合、NODATA値が設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

|locallog: ピクセルの自然対数(底e)を返します。結果がNaNの場合は元のピクセル値が設定され、結果が無限の場合はNODATA値が設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

locallog10: ピクセルの底10の対数が返されます。結果がNaNの場合は元のピクセル値が設定され、結果が無限の場合はNODATA値が設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

localadd: 指定した値を引数としてピクセルに追加します。例: <localadd arg="5"/>

localdivide: 各ピクセルの値を、引数として指定した値セットで除算します。例: <localdivide arg="5"/>

localif: 各ピクセルの値を引数として指定した値および条件に基づいて変更します。有効な演算子: = 、<、>、>=、< !=。例: <localif operator="<" operand="3" newvalue="6"/>、ここでは、値が3未満のピクセルがすべて変更され、新しい値が6に設定されます。

localmultiply: 各ピクセルの値に、引数として指定した値を乗算します。例: <localmultiply arg="5"/>

localpow: 各ピクセルの値を、指定した引数の値のべき乗に切り上げます。例: <localpow arg="5"/>。結果が無限の場合、このピクセルにNODATA値が設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

localsqrt: 各ピクセルを正しく四捨五入した正の値の平方根を返します。結果が無限またはNaNの場合、このピクセルにNODATA値が設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

localsubstract: すべてのピクセル値から引数として指定した値を減算します。例: <localsubstract arg="5"/>

localacos: ピクセルの逆余弦を計算します。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

localasin: ピクセルの逆正弦を計算します。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

localatan: ピクセルの逆正接を計算します。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

localcos: ピクセルの余弦を計算します。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

localcosh: ピクセルの逆双曲線余弦を計算します。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

localsin: ピクセルの正弦を計算します。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

localtan: ピクセルの正接を計算します。ピクセルの余弦が0の場合、このピクセルは変更されません。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

localsinh: ピクセルの逆双曲線正弦を計算します。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

localtanh: ピクセルの双曲線正接を計算します。結果がNaNの場合、NODATA値がこのピクセルに設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

localdefined: セルの値がNODATAではない場合は整数型指定のピクセルが1にマップされ、それ以外の場合は0にマップされます。

localundefined: セルの値がNODATAではない場合は整数型指定のラスターが0にマップされ、それ以外の場合は1にマップされます。

localabs: 符号付きピクセルの絶対値を返します。結果が無限の場合、このピクセルにNODATA値が設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

localnegate: 各ピクセルの値から1を引いた数を乗算します。

localceil: ピクセル値以上であり、ある数学的整数と等しい最小値を返します。結果が無限の場合、このピクセルにNODATA値が設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

localfloor: ピクセル値以下であり、ある数学的整数と等しい最小値を返します。結果が無限の場合、このピクセルにNODATA値が設定されます。ラスターにNODATA値が指定されていない場合、元のピクセルが設定されます。

localround: 各ピクセルに最も近い整数値を返します。

2.5.6 出力

カタログ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 Big Data Spatial Vector Analysis

Oracle Big Data Spatial Vector AnalysisはSpatial Vector Analysis APIであり、Hadoopジョブとして実行され、HDFSに格納されているデータの空間処理のためのMapReduceコンポーネントを提供します。これらのコンポーネントでは、Spatial Java APIを利用して空間分析タスクを実行します。このAPIには、Webコンソールも用意されています。サポートされている機能は次のとおりです。

- 空間の索引付け

- 空間のフィルタ処理

- MVSuggestの使用

- データの階層分類

- バッファの生成

- 空間のビニング

- 空間のクラスタ化

また、次の情報を参照し、実装について詳しく理解します。

- RecordInfoProvider

- HierarchyInfo

- MapReduceジョブでのJGeometryの使用

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

2.7.1 空間の索引付け

空間の索引付けは、キー/値ペアの形式をとり、Hadoop MapFileとして生成されます。それぞれのMapFileエントリには、元のデータの分割の1つに対する空間索引付けが含まれます。キー/値ペアには次の情報が含まれます。

- キー: パス + 開始オフセット + 長さの形式の分割識別子。

- 値: 実際に索引付けしたレコードを含む空間索引の構造。

次の図は、ユーザー・データに関連する空間索引を表します。レコードはr1、r2、のように表現されます。レコードは分割(Split 1、Split 2、Split 3、Split n)ごとにまとめられます。それぞれの分割にはキー/値ペアがあり、キーは分割を表し、値はその分割のレコード上にあるRtree索引を表します。

関連サブトピック:

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

2.7.1.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.7.1.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のサブクラスです。内部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.7.1.3 空間索引の入力形式

InputFormatは次のサポート対象の要件と一致している必要があります。

- FileInputFormatのサブクラスであること。

- getSplits()メソッドがFileSplitまたはCombineFileSplit分割タイプを返すこと。

- RecordReaderのgetPos()メソッドが現在の位置を返し、空間索引のレコードをユーザー・ファイルの元のレコードにトラック・バックすること。現在の位置が返されない場合、空間索引では元のレコードが見つかりません。
ただし、空間索引は引き続き作成でき、元のレコードの読取りを必要としない操作に使用できます。たとえば、他のフィールドを追加フィールドとして追加すると、元のレコード全体を読み取る必要はありません。

注意:

それぞれの分割がgetSplits()メソッドから返されたら、その分割に対して空間索引が作成されます。空間索引をフィルタ処理に使用する(空間のフィルタ処理)場合は、空間索引を作成したものと同じInputFormat実装を使用して、分割索引があるかどうか確認することをお薦めします。

getPos()メソッドはHadoopの新しいAPIから削除されていますが、org.apache.hadoop.mapreduce.lib.input.TextInputFormatおよびCombineTextInputFormatはサポートされており、引き続きレコードの開始オフセットの取得に使用できます。

新しいAPIのその他の入力形式もサポートされていますが、レコード開始オフセットは空間索引に含まれません。このため、元のレコードは検索できません。新しいAPI入力形式の要件は、旧APIのものと同じです。ただし、新しいAPI FileInputFormat、FileSplit、およびCombineFileSplitに変換する必要があります。次の例は、内部入力形式として使用される新しいHadoop APIの入力形式を示します。

CompositeInputFormat.setInternalInputFormatClass(conf, org.apache.hadoop.mapreduce.lib.input.TextInputFormat);
spatialIndexing.setInputFormatClass(CompositeInputFormat.class);

2.7.1.4 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.7.2 MVSuggestの使用

MVSuggestは、ジオメトリがなく、テキスト・フィールドのあるレコードの推定の位置を取得するための空間の索引付けに使用されます。このテキスト・フィールドはレコードの位置の特定に使用されます。MVSuggestから返されたジオメトリが、空間索引内のレコードの包括に使用されます。

すべてのレコードについて検索テキストを含むフィールドを把握する必要があるため、RecordInfoProvider実装では、LocalizableRecordInfoProviderも実装する必要があります。または、検索テキストを含むフィールドの名前で、構成パラメータoracle.spatial.recordInfo.locationFieldを設定できます。

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.7.3 空間のフィルタ処理

空間索引は生成後、データの空間フィルタ処理に使用できます。データの読取り中、マッパーに達するまではフィルタ処理が実行されます。次のサンプル・コードは、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.7.3.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.7.4 データの階層分類

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;
}
}

2.7.4.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.7.4.2 検索階層の制御

検索は常に、(レベル番号が大きい)最下層の階層レベルで実行されます。ユーザー・レコードがこのレベルの階層エントリの一部と一致する場合、その一致は上位レベルの親エントリに伝播されます。たとえば、ユーザー・レコードがロサンゼルスと一致する場合、カリフォルニア、USA、および北米にも一致します。最下位レベルのユーザー・レコードと一致するものがない場合、上位レベルへの検索は続行されません。

この動作は構成パラメータConfigParams.HIERARCHY_SEARCH_MULTIPLE_LEVELSをtrueに設定して変更できます。このため、最下位の下層レベルの検索で、一致しないユーザー・レコードが見つかった場合、最上位レベルに達するまで、あるいは結合するユーザー・レコードがなくなるまで、上位レベルへの検索が続行されます。この動作は、親レベルのジオメトリがその子エントリのジオメトリを完全に囲んでいない場合に使用できます

2.7.4.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.7.5 バッファの生成

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.7.6 空間のビニング

ベクトル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.7.7 空間のクラスタ化

ジョブ・ドライバ・クラス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.7.8 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から返された情報、およびファイル内で元のレコードを特定する情報が含まれています。

2.7.8.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.7.8.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.7.9 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");
}

}

2.7.9.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.7.10 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.7.11 Vector Analysis APIを使用したジョブ実行時間のパフォーマンス・データのチューニング

この表は、Vector Analysis APIを使用したジョブ作成の実行時間を示します。ジョブは4ノードのクラスタを使用して実行されています。時間はクラスタの特性によって異なります。テスト・データセットには、10億以上のレコードがあり、サイズは1TBを超えています。

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

ジョブ・タイプ

経過時間(推定値)

空間の索引付け

2時間

空間索引による空間のフィルタ処理

1時間

空間索引を使用しない空間のフィルタ処理

3時間

空間索引による階層のカウント

5分

空間索引を使用しない階層のカウント

3時間

ジョブにかかる時間は、次の構成パラメータのいずれかを使用して最大分割サイズを増やすと短縮できます。

mapred.max.split.size
mapreduce.input.fileinputformat.split.maxsize

この結果、各マッパーでさらに多くの分割が処理され、実行時間が短縮されます。これはSpatialFilterInputFormat (空間索引付け)またはFileSplitInputFormat (空間階層結合、バッファ)を使用して実行します。また、内部InputFormatとしてCombineFileInputFormatの実装を使用しても、同様の結果が得られます。

2.8 Oracle Big Data Spatial and Graph Vectorコンソールの使用

Oracle Big Data Spatial and Graph Vectorコンソールを使用すると、空間索引付けおよびテーマ・マップの作成と表示に関連するタスクを実行できます。

- コンソールを使用した空間索引の作成

- コンソールを使用したカテゴリ化ジョブの実行

- カテゴリ化結果の表示

- 手動でのカテゴリ化結果の作成

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

- テンプレートの構成

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

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

- 階層結果を作成するジョブの実行

- バッファを生成するジョブの実行

2.8.1 コンソールを使用した空間索引の作成

Oracle Big Data Spatial and Graph Vectorコンソールを使用して空間索引を作成するには、次の手順を実行します。

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

2. 「Create Index」をクリックします。

3. 必要な詳細をすべて指定します。

a. 索引名。

b. HDFSの索引へのファイルのパス。たとえば、hdfs://<server_name_to_store_index>:8020/user/myuser/twitter_logs/part-m-00000です。

c. 新しい索引パス: これはジョブ出力パスです。たとえば、hdfs://<oracle_big_data_spatial_vector_console>:8020/user/myuser/Twitter/indexです。

d. 索引付けするジオメトリのSRID。例: 0.5

e. 索引付けするジオメトリの許容差。例: 8307

f. 索引付けするジオメトリが測地かどうか。

g. 入力形式クラス: 入力形式のクラス。たとえば、org.apache.hadoop.mapred.TextInputFormatです

h. レコード情報プロバイダ・クラス: 空間情報を提供するクラス。たとえば、oracle.spatial.hadoop.vector.geojson. GeoJsonRecordInfoProviderです。

注意:

InputFormatクラスまたはRecordInfoProviderクラスがAPI、またはHadoop APIクラスにない場合、ユーザー定義クラスのJARが提供されます。このJARを使用可能にするには、ユーザーはこれを$JETTY_HOME/webapps/spatialviewer/WEB-INF/libディレクトリに追加し、サーバーを再起動する必要があります。

i. MVSuggestサービスを使用する必要があるかどうか。ジオメトリを場所の文字列から検出する場合は、MVSuggestサービスを使用します。この場合、指定されたRecordInfoProviderがインタフェースoracle.spatial.hadoop.vector. LocalizableRecordInfoProviderを実装します。

j. MVSuggestサービスURL (オプション): ジオメトリを場所の文字列から検出する場合は、MVSuggestサービスを使用します。サービスURLがローカルホストの場合、各データ・ノードでMVSuggestアプリケーションを起動し、実行している必要があります。この場合、新しい索引には、MVSuggestによって各レコードに提供された点ジオメトリとレイヤーが含まれます。ジオメトリがポリゴンの場合、そのジオメトリはポリゴンの重心です。例: http://localhost:8080

k. MVSuggestテンプレート(オプション): MVSuggestサービスを使用する場合、ユーザーは索引の作成に使用するテンプレートを定義できます。

l. 結果通知の送信先電子メール(オプション): ジョブが完了したときに通知を受信する電子メールIDを指定します。電子メールIDが複数ある場合はセミコロンで区切ります。たとえば、mymail@example.comです

4. 「Create」をクリックします。
発行したジョブがリストされるので、ジョブ完了を示す電子メールを受信するまで待ちます。

2.8.2 索引付き空間データの検索

索引付き空間データを検索するには、次の手順を実行します。

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

2. 「Edplore Data」をクリックします。

たとえば、次のことが可能です。

- 必要な索引付きデータを選択し、「Refresh Map」をクリックして地図上にデータを表示します。

- 背景地図のスタイルを変更します。

- 実際のデータ・ズームのレベルを変更します。

- ヒート・マップを使用してデータを表示します。

2.8.3 コンソールを使用したカテゴリ化ジョブの実行

カテゴリ化ジョブは空間索引の有無に関係なく実行できます。次の手順を実行します。

1. http://<oracle_big_data_spatial_vector_console>:8080/spatialviewer/を開きます。

2. 「Categorization」をクリックし、次に「Run Job」をクリックします。

3. 「With Index」または「Without Index」のいずれかを選択し、必要に応じて次の詳細を入力します。

- With Index

a. 索引名

- Without Index

a. データのパス: HDFSデータ・パスを入力します。たとえば、hdfs://<oracle_big_data_spatial_vector_console>:8020/user/*/dataです。

b. ユーザー・クラスのあるJAR (オプション): InputFormatクラスまたはRecordInfoProviderクラスがAPI、またはHadoop APIクラスにない場合、ユーザー定義クラスのJARが提供されます。このJARを使用可能にするには、ユーザーはこれを$JETTY_HOME/webapps/spatialviewer/WEB-INF/libディレクトリに追加し、サーバーを再起動する必要があります。

c. 入力形式クラス: 入力形式のクラス。たとえば、org.apache.hadoop.mapred.TextInputFormatです

d. レコード情報プロバイダ・クラス: 空間情報を提供するクラス。たとえば、oracle.spatial.hadoop.vector.geojson. GeoJsonRecordInfoProviderです。

e. MVSuggestサービスを使用する必要があるかどうか。ジオメトリを場所の文字列から検出する場合は、MVSuggestサービスを使用します。この場合、指定されたRecordInfoProviderがインタフェースoracle.spatial.hadoop.vector. LocalizableRecordInfoProviderを実装します。

4. テンプレート: テーマ・マップを作成するテンプレート。

注意:

テンプレートが点ジオメトリ(都市など)を参照する場合、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」をテンプレートとして使用します。

5. 出力パス: Hadoopジョブ出力パス。例: hdfs://<oracle_big_data_spatial_vector_console>:8020/user/myuser/Twitter/myoutput

6. 結果名: 結果の名前。同じ名前の結果がテンプレートにある場合は上書きされます。たとえば、「Tweets test」などです。

7. 結果通知の送信先電子メール(オプション): ジョブが完了したときに通知を受信する電子メールIDを指定します。電子メールIDが複数ある場合はセミコロンで区切ります。たとえば、mymail@abccorp.comです。

2.8.4 カテゴリ化結果の表示

カテゴリ化結果を表示するには、次の手順を実行します。

1. http://<oracle_big_data_spatial_vector_console>:8080/spatialviewer/を開きます。

2. 「Categorization」をクリックし、次に「View Results」をクリックします。

3. 任意のテンプレートをクリックします。たとえば「World Continents」です。

「World Continents」テンプレートが表示されます。

4. 表示されている結果のいずれかをクリックします。

複数の大陸部が色分けして表示されます。

5. 地図の任意の大陸部をクリックします。たとえば「North America」です。

テンプレートが「World Countries」に変わり、そのフォーカスが国別の結果の「North America」に移ります。

2.8.5 手動でのカテゴリ化結果の作成

結果ファイルを作成したり、ローカルに格納されている結果ファイルをアップロードしたりできます。たとえば、コマンドラインから実行したジョブによって作成された結果ファイルなどです。テンプレートはフォルダ$JETTY_HOME/webapps/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」をクリックし、次に「View Results」をクリックします。

2. 「Template」を選択します。

3. Specify a 「Name」を指定します。

4. 「Choose File」をクリックして「File」の場所を選択します。

5. 「Save」をクリックします。

結果は$JETTY_HOME/webapps/spatialviewer/resultsフォルダに置かれます。

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

新しいテンプレートを作成するには、次の手順を実行します。

1. テンプレートJSONファイルをフォルダ$JETTY_HOME/webapps/spatialviewer/templates/に追加します。

2. テンプレート構成ファイルをフォルダ$JETTY_HOME/webapps/spatialviewer/templates/_config_に追加します。

テンプレートを削除するには、ステップ1と2で追加したJSONファイルおよび構成ファイルを削除します。

2.8.7 テンプレートの構成

各テンプレートには構成ファイルがあります。テンプレート構成ファイルはフォルダ$JETTY_HOME/webapps/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.8.8 コマンドラインを使用した索引作成ジョブの実行

次のコマンドを実行して索引を作成します。

hadoop jar <HADOOP_LIB_PATH>/<jarfile> oracle.spatial.hadoop.vector.demo.job.SpatialIndexing <DATA_PATH> <SPATIAL_INDEX_PATH> <INPUT_FORMAT_CLASS> <RECORD_INFO_PROVIDER_CLASS>

説明

- jarfileは空間索引付けでユーザーが指定するjarファイルです。

- DATA_PATHは索引付けるデータの場所です。

- SPATIAL_INDEX_PATHは結果として生じる空間索引の場所です。

- INPUT_FORMAT_CLASSはデータの読取りに使用するInputFormat実装です。

- RECORD_INFO_PROVIDER_CLASSはレコードからの情報の抽出に使用する実装です。

次の例では、コマンドラインを使用して索引を作成します。

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop/lib/sdohadoop-vector-demo.jar oracle.spatial.hadoop.vector.demo.job.SpatialIndexing "/user/hdfs/demo_vector/tweets/part*" /user/hdfs/demo_vector/tweets/spatial_index org.apache.hadoop.mapred.TextInputFormat oracle.spatial.hadoop.vector.demo.usr.TwitterLogRecordInfoProvider

注意:

前の例では、事前ロードされたデモ・ジョブを使用しています。

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

次のコマンドを実行して空間フィルタ処理を実行します。

hadoop jar HADOOP_LIB_PATH/sdohadoop-vector-demo.jar oracle.spatial.hadoop.vector.demo.job.TwitterLogSearch <DATA_PATH> <RESULT_PATH> <SEARCH_TEXT> <SPATIAL_INTERACTION> <GEOMETRY> <SRID> <TOLERANCE> <GEODETIC> <SPATIAL_INDEX_PATH>

説明

- DATA_PATHはフィルタ処理するデータです。

- RESULT_PATHは結果が生成される場所を示すパスです。

- SEARCH_TEXTは検索対象のテキストです。

- SPATIAL_INTERACTIONは空間の相互作用のタイプです。これは1 (内部)または2 (任意の相互作用)のいずれかです。

- GEOMETRYは空間フィルタ処理の実行に使用するジオメトリです。これはJSON形式で表現されます。

- SRIDは問合せジオメトリのSRS IDです。

- TOLERANCEは空間検索に使用する許容差です。

- GEODETICはジオメトリが測地かどうかを指定します。

- SPATIAL_INDEX_PATHは事前に生成された空間索引へのパスです。

次の例では、一部のテキストを含み、指定のジオメトリと相互作用しているすべてのツイートのカウントを示します。

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop/lib/sdohadoop-vector-demo.jar oracle.spatial.hadoop.vector.demo.job.TwitterLogSearch "/user/hdfs/demo_vector/tweets/part*" /user/hdfs/demo_vector/tweets/text_search feel 2 '{"type":"Polygon", "coordinates":[[-106.64595, 25.83997, -106.64595, 36.50061, -93.51001, 36.50061, -93.51001, 25.83997, -106.64595, 25.83997]]}' 8307 0.0 true /user/hdfs/demo_vector/tweets/spatial_index

注意:

前の例では、事前ロードされたデモ・ジョブを使用しています。

2.8.10 階層結果を作成するジョブの実行

次のコマンドを実行して階層結果を作成します。

hadoop jar HADOOP_LIB_PATH/sdohadoop-vector-demo.jar oracle.spatial.hadoop.vector.demo.job.HierarchicalCount spatial <SPATIAL_INDEX_PATH> <RESULT_PATH> <HIERARCHY_INFO_CLASS> <SPATIAL_INTERACTION> <SRID> <TOLERANCE> <GEODETIC> <HIERARCHY_DATA_INDEX_PATH> <HIERARCHY_DATA_PATHS>

説明

- SPATIAL_INDEX_PATHは事前に生成された空間索引へのパスです。このパスに空間索引パス・ファイル以外のファイル(たとえば、Hadoop生成の_SUCCESSファイルなど)がある場合、次のパターンSPATIAL_INDEX_PATH/part*/dataを追加します。

- RESULT_PATHは結果が生成される場所を示すパスです。各階層レベルには、XXXX_count.jsonという名前のファイルが必要です。

- HIERARCHY_INFO_CLASSは結果として生じる空間索引の場所です。

- INPUT_FORMAT_CLASSはHierarchyInfo実装です。現在の階層データの構造を定義します。

- SPATIAL_INTERACTION,SRID,TOLERANCE,GEODETICはすべて、テキスト検索ジョブの事前定義と同じものを意味します。これらはデータと階層情報ジオメトリの間の空間操作の定義に使用します。

- HIERARCHY_DATA_INDEX_PATHは階層データ索引を配置する場所を示すパスです。この索引は、毎回、親子関係が要求されたときに、その検索を回避するジョブで使用されます。

- HIERARCHY_DATA_PATHSは階層データへのパスのカンマ区切りリストです。階層索引が同じ階層データに対して事前に作成されている場合は省略できます。

次の例では、コマンドラインを使用して索引を作成します。

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop/lib/sdohadoop-vector-demo.jar oracle.spatial.hadoop.vector.demo.job.HierarchicalCount spatial "/user/hdfs/demo_vector/tweets/spatial_index/part*/data" /user/hdfs/demo_vector/tweets/hier_count_spatial oracle.spatial.hadoop.vector.demo.usr.WorldAdminHierarchyInfo 1 8307 0.5 true /user/hdfs/demo_vector/world_hier_index file:///net/den00btb/scratch/hsaucedo/spatial_bda/demo/vector/catalogs/world_continents.json,file:///net/den00btb/scratch/hsaucedo/spatial_bda/demo/vector/catalogs/world_countries.json,file:///net/den00btb/scratch/hsaucedo/spatial_bda/demo/vector/catalogs/world_states_provinces.json

注意:

前の例では、事前ロードされたデモ・ジョブを使用しています。

2.8.11 バッファを生成するジョブの実行

次のコマンドを実行してバッファを生成します。

hadoop jar HADOOP_LIB_PATH/sdohadoop-vector-demo.jar oracle.spatial.hadoop.vector.demo.job.Buffer <DATA_PATH> <RESULT_PATH> <INPUT_FORMAT_CLASS> <RECORD_INFO_PROVIDER_CLASS> <BUFFER_WIDTH> <BUFFER_SMA> <BUFFER_FLAT> <BUFFER_ARCTOL>

説明

- DATA_PATHはフィルタ処理するデータです。

- RESULT_PATHは結果が生成される場所を示すパスです。

- INPUT_FORMAT_CLASSはデータの読取りに使用するInputFormat実装です。

- RECORD_INFO_PROVIDER_CLASSは各レコードからのデータの抽出に使用するRecordInfoProvider実装です。

- BUFFER_WIDTHはバッファの幅を指定します。

- BUFFER_SMAは半長径です。

- BUFFER_FLATはバッファの平坦化です。

- BUFFER_ARCTOLは測地高密度化の円弧許容差です。

次の例では、各レコードのジオメトリを囲むバッファの生成を示します。結果として生じるファイルはMapFileであり、その各エントリは入力データのレコードに対応します。入力キーはレコードIDであり、その値は生成されたバッファおよびレコードの場所(パス、開始オフセットおよび長さ)を保持するRecordInfoインスタンスです。

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop/lib/sdohadoop-vector-demo.jar oracle.spatial.hadoop.vector.demo.job.Buffer "/user/hdfs/demo_vector/waterlines/part*"  /user/hdfs/demo_vector/waterlines/buffers org.apache.hadoop.mapred.TextInputFormat oracle.spatial.hadoop.vector.demo.usr.WorldSampleLineRecordInfoProvider 5.0

注意:

前の例では、事前ロードされたデモ・ジョブを使用しています。

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

Oracle Big Data Spatial and Graph Image Serverコンソールは、「モザイクを作成するためのHDFS Hadoopクラスタへのイメージのロード」などのタスクに使用できます。

2.9.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 プロパティ・グラフ・サポートの構成

この章では、ビッグ・データ環境でプロパティ・グラフのサポートを構成する方法について説明します。

ここでは、ビッグ・データ・アプライアンス(「Oracle Big Data Appliance上でのOracle Big Data Spatial and Graphのインストール」を参照)またはApache Hadoopシステム(「CDHクラスタまたはその他ハードウェアでのプロパティ・グラフ・サポートのインストール」を参照)で、すでにインストールが実行されていると想定しています。

- ソフトウェア構成のチューニング

3.1 ソフトウェア構成のチューニング

データベースおよびJavaの構成設定を変更することにより、プロパティ・グラフのパフォーマンスを改善できる可能性があります。提供する提案事項はガイドラインであり、ご使用のシステムを慎重かつ徹底的に評価した後にのみ従ってください。

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

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

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

Apache HBaseおよびJava仮想マシンのデフォルト構成を変更することにより、パフォーマンスを改善できます。

- Apache HBase構成の変更

- Javaメモリー設定の変更

3.1.1.1 Apache HBase構成の変更

Apache HBaseの構成を変更するには、この項の該当するCDHリリースに対する手順に従います。(個々の手順は、CDHリリースに応じて変わる可能性があります。)

CDH 5.2.xおよびCDH 5.3.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」オプションのうち、最適な方を選択します。

3.1.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

3.1.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

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

この章では、ビッグ・データ環境でのプロパティ・グラフ・データの作成、格納および操作に関する概念と使用方法の情報を提供します。

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

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

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

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

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

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

- セキュアなApache HBase/Hadoopのサポート

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

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

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

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

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

プロパティ・グラフでは、プロパティ(キー値ペア)をグラフの頂点およびエッジに簡単に関連付けることができ、大量のデータ・セット間の関係に基づく分析操作が可能になります。

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

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

4.1.1 プロパティ・グラフとは

プロパティ・グラフは、オブジェクトまたは頂点のセットと、これらのオブジェクトをつなぐ矢印またはエッジのセットで構成されます。頂点とエッジには複数のプロパティを含めることができ、それらはキー値ペアとして表されます。

各頂点には一意の識別子があり、次のものを含めることができます。

- 出力エッジのセット

- 入力エッジのセット

- プロパティの集まり

各エッジには一意の識別子があり、次のものを含めることができます。

- 出力頂点

- 入力頂点

- 2つの頂点間の関係を示すテキスト・ラベル

- プロパティの集まり

図4-1 は、2つの頂点と1つのエッジを持つ非常に単純なプロパティ・グラフを示しています。2つの頂点には、識別子1および2があります。両方の頂点には、プロパティnameおよびageがあります。エッジは、出力頂点1から入力頂点2に向かっています。このエッジは、テキスト・ラベルknowsと、頂点1と2の関係のタイプを識別するプロパティtypeで表されます。

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

プロパティ・グラフ・データ・モデルは標準に基づいていませんが、W3C標準ベースのResource Description Framework (RDF)グラフ・データ・モデルに類似しています。プロパティ・グラフ・データ・モデルはRDFよりも単純であり、精密ではありません。このような相違点により、これは次のようなユースケースでよい候補になります。

- ソーシャル・ネットワークでの影響の特定

- トレンドおよび顧客行動の予測

- パターン一致に基づく関係の発見

- キャンペーンをカスタマイズするためのクラスタの特定

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

プロパティ・グラフは、Hadoopのビッグ・データに対してサポートされます。このサポートは、データ・アクセス・レイヤーと分析レイヤーで構成されます。Hadoopでのデータベースの選択肢により、スケーラブルで一貫したストレージ管理が提供されます。

図4-2 は、Oracleプロパティ・グラフのアーキテクチャを示しています。

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

4.1.2.1 分析レイヤー

分析レイヤーにより、HadoopクラスタでMapReduceプログラムを使用して、プロパティ・グラフを分析できるようになります。これは、パス計算、ランキング、コミュニティ検出、レコメンダ・システムなどを含む、30を超える分析機能を提供します。

4.1.2.2 データ・アクセス・レイヤー

データ・アクセス・レイヤーは、プロパティ・グラフの作成および削除、頂点とエッジの追加および削除、キー値ペアを使用した頂点とエッジの検索、テキスト索引の作成、およびその他の操作の実行に使用できる、Java APIのセットを提供します。Java APIには、プロパティ・グラフ・データ・モデル用のTinkerPop Blueprintsグラフ・インタフェースの実装が含まれています。また、これらのAPIは、広く普及しているオープンソースのテキスト索引付けおよび検索エンジンであるApache LuceneおよびApache SolrCloudと統合されています。

4.1.2.3 ストレージ管理

プロパティ・グラフは、Oracle NoSQL DatabaseまたはApache HBaseのいずれかに格納できます。これらのデータベースは両方とも成熟しており、スケーラブルで、効率的なナビゲーション、問合せおよび分析をサポートします。両方とも、プロパティ・グラフの頂点およびエッジをモデル化するために表を使用します。

4.1.2.4 RESTful Webサービス

RESTful Webサービスを使用して、グラフ・データにアクセスしてグラフ操作を実行することもできます。たとえば、Linux curlコマンドを使用して、頂点とエッジを取得したり、グラフ要素を追加および削除したりすることができます。

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

次のグラフ形式がサポートされます。

- GraphMLデータ形式

- GraphSONデータ形式

- GMLデータ形式

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

4.2.1 GraphMLデータ形式

GraphMLファイル形式では、XMLを使用してグラフを記述します。例4-1 は、図4-1 に示されているプロパティ・グラフのGraphMLの記述を示しています。

関連項目:

『The GraphML File Format』

http://graphml.graphdrawing.org/

例4-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>

4.2.2 GraphSONデータ形式

GraphSONファイル形式では、JavaScript Object Notation (JSON)に基づいてグラフを記述します。例4-2 は、図4-1 に示されているプロパティ・グラフのGraphSONの記述を示しています。

関連項目:

『GraphSON Reader and Writer Library』

https://github.com/tinkerpop/blueprints/wiki/GraphSON-Reader-and-Writer-Library

例4-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"
}
]
}
}

4.2.3 GMLデータ形式

Graph Modeling Language (GML)ファイル形式では、ASCIIを使用してグラフを記述します。例4-3 は、図4-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

例4-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"
]
]

4.2.4 Oracleフラット・ファイル形式

Oracleフラット・ファイル形式はプロパティ・グラフのみを記述します。これは、その他のファイル形式よりも正確で、より優れたデータ型サポートを提供します。Oracleフラット・ファイル形式は、グラフを記述するために、頂点用とエッジ用にそれぞれ1つずつ、2つのファイルを使用します。レコードのフィールドはカンマで区切られます。

例4-4 は、図4-1 に示されているプロパティ・グラフを記述するOracleフラット・ファイルを示しています。

関連項目:

「Oracleフラット・ファイル形式の定義」

例4-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,,

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

プロパティ・グラフを開始するには、次のようにします。

1. プロパティ・グラフを初めて使用する際、ソフトウェアがインストールされ、稼働可能であることを確認します。

2. Java APIで提供されるクラスを使用して、Javaプログラムを作成します。

「プロパティ・グラフ・データ用のJava APIの使用」を参照してください。

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

プロパティ・グラフの作成には、Java APIを使用したプロパティ・グラフとそのオブジェクトの作成が含まれます。

- Java APIの概要

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

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

- 頂点の作成

- エッジの作成

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

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

4.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

4.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リファレンス

Oracle Big Data Spatial and Graph Java APIリファレンス

4.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

4.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/

4.4.1.4 Oracle NoSQL Database Java API

The Oracle NoSQL Database APIを使用すると、キー値(KV)ストアを作成および移入し、Hadoop、HiveおよびOracle 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/

4.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

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

グラフ・データのパラレル・ロードを実行するために、Java APIが提供されています。

頂点ファイル(または入力ストリーム)のセットとエッジ・ファイル(または入力ストリーム)のセットがある場合、それらを複数のチャンクに分割し、並列でデータベースにロードできます。チャンクの数は、ユーザーが指定した並列度(DOP)によって決定されます。

並列性は、頂点およびエッジ・フラット・ファイルを複数のチャンクに分割するスプリッタ・スレッドと、別個のデータベース接続を使用して各チャンクをデータベースにロードするローダー・スレッドによって実現されます。スプリッタ・スレッドとローダー・スレッドを接続するために、Javaパイプが使用されます -- スプリッタ: PipedOutputStreamおよびローダー: PipedInputStream。

データ・ロードAPIの最も単純な使用方法は、1つのプロパティ・グラフ・インスタンス、1つの頂点ファイル、1つのエッジ・ファイルおよびDOPを指定することです。

次のロード・プロセスの例では、最適化されたOracleフラット・ファイル形式の頂点ファイルおよびエッジ・ファイルに格納されたグラフ・データをロードし、並列度48でロードを実行します。

opgdl = OraclePropertyGraphDataLoader.getInstance();
vfile = "/home/alwu/pg-bda-nosql/demo/connections.opv";
efile = "/home/alwu/pg-bda-nosql/demo/connections.ope";
opgdl.loadData(opg, vfile, efile, 48);

4.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);

4.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
OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance();
opgdl.loadData(m_opg, m_szOPVFile, m_szOPEFile,
m_lVertexOffsetlines /* offset of lines to start loading
from partition, default 0*/,
m_lEdgeOffsetlines /* offset of lines to start loading
from partition, default 0*/,
m_lVertexMaxlines /* maximum number of lines to start loading
from partition, default -1 (all lines in partition)*/,
m_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);

4.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());

4.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 < conns.length; idx++) {
conns[idx].close();
}

4.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++;
}

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

Oracle Big Data Spatial and Graphは、グラフ反復パフォーマンスを向上させるために、最適化フラグのサポートを提供します。最適化フラグにより、情報がない、または最小限の情報(ID、ラベルおよび入力/出力頂点など)を持つオブジェクトとして、頂点(またはエッジ)を処理できます。これにより、反復中の各頂点(またはエッジ)の処理にかかる時間が削減されます。

次の表に、プロパティ・グラフで頂点(またはエッジ)を処理するときに使用できる最適化フラグを示します。

最適化フラグ

説明

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のみが含まれ、キー/値プロパティや追加情報は含まれません。

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のみを取得します。

// 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);

4.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("philanthropist")) {
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<Vertex> iter = m_obama.getVertices(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
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
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 " ";
}
}

4.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));

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()));

4.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の使用

4.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();
...

4.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(szClientPort);
int iSplitsPerRegion = 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(false).get();

4.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);

4.4.5 エッジの作成

エッジを作成するには、次のOracle Property Graphメソッドを使用します。

- OraclePropertyGraph.addEdge: グラフにエッジ・インスタンスを追加します。

- OracleEdge.setProperty: エッジにキー値プロパティを割り当てます。

次のコード・フラグメントは、2つの頂点(v1およびv2)と1つのエッジ(e1)を作成します。

// Add vertices v1 and v2
Vertex a = 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");

4.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メソッドを使用できます。ただし、この操作は元に戻せないため、慎重に使用してください。

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

次の例のように、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);

// Remove edge e1
opg.removeEdge(e1);

// Remove vertex v1
opg.removeVertex(v1);

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

データベースからプロパティ・グラフを削除するには、OraclePropertyGraphUtils.dropPropertyGraphメソッドを使用します。このメソッドには、接続情報とグラフ名の2つのパラメータがあります。

接続情報のフォーマットは、バックエンド・データベースとしてHBaseまたはOracle NoSQL Databaseのいずれを使用しているかによって異なります。これは、OraclePropertyGraph.getInstanceに指定する接続情報と同じです。

- Oracle NoSQL Databaseの使用

- Apache HBaseの使用

4.4.8.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);

4.4.8.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);
HConnection conn = HConnectionManager.createConnection(conf);

// Drop the graph
OraclePropertyGraphUtils.dropPropertyGraph(conf, hbGraphName);

4.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を使用して管理されます。この節の続きでは、データ・アクセス・レイヤーのプロパティ・グラフ機能を使用してテキスト索引を作成する方法に焦点を当てます。

- Apache Lucene検索エンジンによる自動索引の使用

- SolrCloud検索エンジンによる手動索引の使用

- データ型の処理

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

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

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

4.5.1 Apache Lucene検索エンジンによる自動索引の使用

提供されている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*").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

関連項目:

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

4.5.2 SolrCloud検索エンジンによる手動索引の使用

提供されている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

関連項目:

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

4.5.3 データ型の処理

Oracleのプロパティ・グラフ・サポートは、値のデータ型に基づいて要素のキー/値ペアを索引付けおよび格納します。データ型処理の主な目的は、数値や日付範囲の問合せなど、包括的な問合せのサポートを提供することです。

デフォルトでは、特定のキー/値ペアに対する検索は、その値のデータ型に基づく問合せ式まで行われます。たとえば、キー値ペアage:30を持つ頂点を検索する場合は、整数のデータ型が指定されたすべての年齢フィールドに対して問合せが実行されます。値が問合せ式である場合は、API get(String key, Object value, Class dtClass, Boolean useWildcards)をコールすることにより、検索する値のデータ型クラスも指定できます。データ型が指定されていない場合、問合せ式はすべての使用可能なデータ型と一致します。

ブール演算子を使用して処理する場合は、問合せで適切な一致が見つかるように、後続の各キー/値ペアにデータ型の接頭辞/接尾辞を追加する必要があります。次の各トピックでは、Apache LuceneおよびSolrCloudでこの接頭辞/接尾辞を追加する方法について説明します。

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

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

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

Luceneのデータ型処理が有効化されている場合、問合せ式のキーの接尾辞として適切なデータ型識別子を追加する必要があります。これは、キーに対してString.concat()の演算を実行することによって行うことができます。Luceneのデータ型処理が無効化されている場合、データ型識別子を値Stringに接頭辞として挿入する必要があります。表4-1 は、Apache Luceneを使用したテキスト索引付けに使用可能なデータ型識別子を示しています(LuceneIndexのJavadocも参照)。

表4-1 Apache Luceneデータ型識別子

Luceneデータ型識別子

説明

TYPE_DT_STRING

文字列

TYPE_DT_BOOL

ブール

TYPE_DT_DATE

日付

TYPE_DT_FLOAT

Float

TYPE_DT_DOUBLE

Double

TYPE_DT_INTEGER

整数

TYPE_DT_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

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

SolrCloudテキスト索引のブール演算では、問合せ式のキーの接尾辞として適切なデータ型識別子を追加する必要があります。これは、キーに対してString.concat()の演算を実行することによって行うことができます。表4-2 は、SolrCloudを使用したテキスト索引付けに使用可能なデータ型識別子を示しています(SolrIndexのJavadocも参照)。

表4-2 SolrCloudデータ型識別子

Solrデータ型識別子

説明

TYPE_DT_STRING

文字列

TYPE_DT_BOOL

ブール

TYPE_DT_DATE

日付

TYPE_DT_FLOAT

Float

TYPE_DT_DOUBLE

Double

TYPE_DT_INTEGER

整数

TYPE_DT_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: " + query + " -----");
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

4.5.4 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

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

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/data/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());

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

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 SolrIndex object
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 */

// Close the connections to the sub-directories after completed
for (int idx = 0; idx < conns.length; idx++) {
conns[idx].close();
}
}

// 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
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 sub-directories after completed
for (int idx = 0; idx < conns.length; idx++) {
conns[idx].shutdown();
}

// Count results
System.out.println("Vertices found using parallel query: " + lCount);

4.6 セキュアな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);

4.7 セキュアなApache HBase/Hadoopのサポート

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();

4.8 プロパティ・グラフ・データでの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リファレンス情報を参照してください。

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

ソフトウェア・インストールには、プロパティ・グラフの作成および操作方法を習得するために使用できる、プログラムの例のディレクトリが含まれています。

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

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

- 出力の例について

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

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

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

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

サンプル・プログラムは、examples/dalという名前のインストール・サブディレクトリに配布されます。例はHBaseおよびOracle NoSQL Database用にレプリケートされるため、選択したバックエンド・データベースに対応するプログラムのセットを使用できます。表4-3 にいくつかのプログラムを示します。

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

プログラム名

説明

ExampleNoSQL1

ExampleHBase1

1つの頂点からなる最小プロパティ・グラフを作成し、様々なデータ型のプロパティを頂点に設定し、保存済のグラフの記述をデータベースに問い合せます。

ExampleNoSQL2

ExampleHBase2

Example1と同じ最小プロパティ・グラフを作成してから、それを削除します。

ExampleNoSQL3

ExampleHBase3

複数の頂点およびエッジを持つグラフを作成します。いくつかの頂点およびエッジを明示的に削除し、その他は他の必須オブジェクトを削除することによって暗黙的に削除します。この例は、オブジェクトの現在のリストを表示するために、データベースを繰り返し問い合せます。

4.9.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"など、グラフの名前。

4.9.3 出力の例について

プログラムの例は、System.out.println を使用して、プロパティ・グラフの記述を格納先のデータベース(Oracle NoSQL DatabaseまたはApache HBaseのいずれか)から取得します。キー名、データ型および値はコロンで区切られます。たとえば、weight:flo:30.0は、キー名がweight、データ型がfloat、値が30.0であることを示しています。

表4-4 に、出力で使用されるデータ型の略称を示します。

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

略称

データ型

bol

ブール

dat

日付

dbl

double

flo

float

int

整数

ser

シリアライズ可能

str

文字列

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

ExampleNoSQL1およびExampleHBase1は、1つの頂点からなる最小プロパティ・グラフを作成します。例4-5 のコード・フラグメントは、v1という名前の頂点を作成し、様々なデータ型のプロパティを設定します。次に、保存済のグラフの記述をデータベースに問い合せます。

例4-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

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

ExampleNoSQL2およびExampleHBase2は、「例: プロパティ・グラフの作成」で作成したようなグラフを作成し、それをデータベースから削除します。

例4-6 のコード・フラグメントは、グラフを削除します。OraclePropertyGraphUtils.dropPropertyGraph引数の説明は、「サンプル・プログラムのコンパイルおよび実行」を参照してください。

例4-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を参照してください。

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

ExampleNoSQL3およびExampleHBase3は、頂点とエッジの両方を追加および削除します。

例4-7 頂点の作成

例4-7 のコード・フラグメントは、3つの頂点を作成します。これは例4-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);

例4-8 エッジの作成

例4-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");

例4-9 エッジおよび頂点の削除

例4-9 のコード・フラグメントは、エッジe3と頂点bを明示的に削除します。これにより、頂点bに接続していたエッジe1が暗黙的に削除されます。

// Remove edge e3
opg.removeEdge(e3);

// Remove vertex b and all related edges
opg.removeVertex(b);

例4-10 頂点およびエッジの問合せ

この例は、データベースに問い合せて、オブジェクトがいつ追加および削除されるかを表示します。例4-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

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

プロパティ・グラフは、頂点用の記述ファイルとエッジ用の記述ファイルの2つのフラット・ファイルに定義できます。

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

- 頂点ファイル

- エッジ・ファイル

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

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

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

ファイルのペアにより、プロパティ・グラフが記述されます。

- 頂点ファイル: プロパティ・グラフの頂点を記述します。このファイルには、.opvというファイル名拡張子が付きます。

- エッジ・ファイル: プロパティ・グラフのエッジを記述します。このファイルには、.opeというファイル名拡張子が付きます。

これら2つのファイルは同じベース名を共有することをお薦めします。たとえば、simple.opvおよびsimple.opeによってプロパティ・グラフを定義します。

4.10.2 頂点ファイル

頂点ファイルの各行は、プロパティ・グラフの1つの頂点を記述する1つのレコードです。1つのレコードは1つの頂点の1つのキー値プロパティを記述できるため、複数のプロパティを持つ頂点を記述する場合は複数のレコード/行が使用されます。

レコードには、カンマで区切られた6つのフィールドが含まれています。各レコードには、値があるかどうかに関係なく、すべてのフィールドを区切るために5つのカンマが含まれている必要があります。

vertex_ID, key_name, value_type, value, value, value

表4-5 に、頂点ファイルのレコードを構成するフィールドを示します。

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

フィールド番号

Name(1)

説明

1

vertex_ID

頂点を一意に識別する整数

2

key_name

キー値ペアのキーの名前

頂点にプロパティが指定されていない場合は、空白(%20)を入力します。この例は、プロパティが指定されていない頂点1を示しています。

1,%20,,,,

3

value_type

キー値ペアの値のデータ型を表す整数。

- 1 文字列

- 2 整数

- 3 Float

- 4 Double

- 5 日付

- 6 ブール

- 101 シリアライズ可能Javaオブジェクト

4

value

数値でも日付でもない場合のkey_nameのエンコードされたnullでない値

5

value

数値である場合のkey_nameのエンコードされたnullでない値

6

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つの方法です。)

4.10.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

表4-6 に、エッジ・ファイルのレコードを構成するフィールドを示します。

表4-6 エッジ・ファイルのレコードの形式

フィールド番号

Name(2)

説明

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 文字列

- 2 整数

- 3 Float

- 4 Double

- 5 日付

- 6 ブール

- 10 シリアライズ可能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つの方法です。)

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

頂点およびエッジ・ファイルのエンコーディングはUTF-8です。表4-7 に、頂点またはエッジ・プロパティ(キー値ペア)またはエッジ・ラベルに表示されるときに文字列としてエンコードされる必要のある特殊文字をリストします。その他すべての文字は、エンコーディングは必要ありません。

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

特殊文字

文字列のエンコーディング

説明

%

%25

パーセント

\t

%09

タブ

%20

空白

\n

%0A

改行

\r

%0D

リターン

,

%2C

カンマ

4.10.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,,,,

4.11 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.getId(),"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.getId(),"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/

[1] 名前は頂点ファイルには表示されませんが、ここではフィールド参照を単純にするために提供されています。

[2] 名前はエッジ・ファイルには表示されませんが、ここではフィールド参照を単純にするために提供されています。

5 インメモリー分析の使用

この章では、インメモリー分析を使用する例について説明します(プロパティ・グラフ・インメモリー分析とも呼ばれ、Javadoc、コマンドライン、パスの説明、エラー・メッセージなどではPGXと省略されます)。主なトピックは次のとおりです。

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

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

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

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

- サブグラフの作成

- Jettyへのデプロイ

- Apache Tomcatへのデプロイ

- Oracle WebLogic Serverへのデプロイ

- インメモリー分析サーバーへの接続

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

- YARNアプリケーションとしてのインメモリー分析の実行

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

このトピックでは、シェル・インタフェースを使用したメモリーへの対話によるグラフの読込みの例について説明します。主な手順は次のとおりです。

1. インメモリー分析サーバー・インスタンスへの接続

2. シェル・ヘルプの使用(必要時)

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

4. グラフ・データのメモリーへの読込み

5.1.1 インメモリー分析サーバー・インスタンスへの接続

インメモリー分析シェルを開始する手順:

1. プロパティ・グラフのサポートがインストールされているシステムで端末セッションを開始します。

2. ローカル(埋込み)・インメモリー分析インスタンスを開始するか、リモート・インメモリー分析インスタンスに接続します

- ローカル・(埋込み)インスタンス開始のJavaの例:

import java.util.Map;
import java.util.HashMap;
import oracle.pgx.api.*;
import oracle.pgx.config.PgxConfig.Field;

String url = Pgx.EMBEDDED_URL; // local JVM
ServerInstance instance = Pgx.getInstance(url);
instance.startEngine(); // will use default configuration
PgxSession session = instance.createSession("test");

- リモート・インスタンスへの接続のJavaの例:

import java.util.Map;
import java.util.HashMap;
import oracle.pgx.api.*;
import oracle.pgx.config.PgxConfig.Field;

String url = "http://my-server.com:8080/pgx" // replace with base URL of your setup
ServerInstance instance = Pgx.getInstance(url);
PgxSession session = instance.createSession("test");

3. シェルでは、次のコマンドを入力しますが、開始コマンド、または必要なインスタンスのタイプへの接続コマンドのいずれか一方を選択します。

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>

4. オプションで、事前定義されている変数も表示します。

pgx> instance
==> PGX Server Instance running on embedded mode
pgx> session
==> PGX session pgxShell registered at PGX Server Instance running on embedded mode
pgx> analyst
==> Analyst for PGX session pgxShell registered at PGX Server Instance running on embedded mode
pgx>

その他のトピックの例では、インスタンスおよびセッション変数は、ここで示すとおり設定されるとみなされます。

インメモリー分析ソフトウェアが正しくインストールされている場合、エンジン実行ログ・メッセージとインメモリー分析シェル・プロンプト(pgx>)が表示されます。

変数instance、session、およびanalystが使用可能です。

このトピックの前の例では、pgxコマンドでリモートURLを指定していないため、シェルがローカル・インスタンスを開始します。

5.1.2 シェル・ヘルプの使用

インメモリー分析シェルには、:helpコマンドを使用してアクセスできるヘルプ・システムが用意されています。

5.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

図5-1 は、データから作成されたプロパティ・グラフを示します。

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

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

グラフをメモリーに読み込むには、次の情報を渡す必要があります。

- グラフのメタデータを指定するグラフ構成ファイルへのパス

- グラフへの参照に使用できる一意の英数字名
同じ名前で別のグラフをすでにロードしている場合は、エラーが発生します。

例: シェルを使用したグラフの読取り

pgx> graph = session.readGraphWithProperties("/opt/oracle/oracle-spatial-graph/property_graph/examples/pgx/graphs/sample.adj.json", "sample");
==> PGX Graph named sample bound to PGX session pgxShell ...
pgx> graph.getNumVertices()
==> 4

例: Javaを使用したグラフの読取り

import oracle.pgx.api.*;

PgxGraph graph = session.readGraphWithProperties("/opt/oracle/oracle-spatial-graph/property_graph/examples/pgx/graphs/sample.adj.json");

次のトピックでは、プロパティ・グラフをメモリーに読み込むその他の例について説明します。

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

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

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

5.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"
}],
"load_edge_label": true,
"edge_props": [{
"name": "label",
"type": "string"
}, {
"name": "weight",
"type": "float"
}]
}
EOF

次のコマンドを使用すると、プロパティ・グラフconnectionsがメモリーに読み込まれます。

pgx> session.readGraphWithProperties("/tmp/my_graph_hbase.json", "connections")
==> PGX Graph named connections ...

大きいサイズのグラフを扱う場合は、IOワーカー、分析対象のワーカー数、タスクのタイムアウトなどのパラメータを調整する必要があります。これらのパラメータは、次のディレクトリ(インストールのホームが/opt/oracle/oracle-spatial-graphの場合)で検索および変更できます。

/opt/oracle/oracle-spatial-graph/property_graph/pgx/conf

5.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"
}],
"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

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

次のコマンドでは、「構成ファイルでのグラフ・メタデータの指定」の構成ファイルおよびmy-graphという名前を使用します。

pgx> g = session.readGraphWithProperties("/opt/oracle/oracle-spatial-graph/property_graph/examples/pgx/graphs/sample.adj.json", "my-graph")

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

ユーザー独自のカスタム・グラフ・データを読み取ることができます。この例では、グラフを作成し、それを変更して正しく読み取る方法を表示します。このグラフでは隣接するリスト形式を使用しますが、インメモリー分析では、複数のグラフ形式をサポートしています。

主な手順は次のとおりです。

1. 単純なグラフ・ファイルの作成

2. 頂点プロパティの追加

3. 頂点識別子としての文字列の使用

4. エッジ・プロパティの追加

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

この例では、頂点またはエッジ・プロパティのない、単純な小さいグラフを隣接するリストに作成します。それぞれの線には、頂点(ノード) ID、およびそのエッジ点を送信する頂点IDが含まれます。

1 2
2 3 4
3 4
4 2

このリストでは、単一スペースで個々のトークンを区切ります。インメモリー分析ではその他のセパレータもサポートしており、グラフ構成ファイルで指定できます。

図5-2 は、4つの頂点と5つのエッジのあるプロパティ・グラフとしてレンダリングされたデータを示します。頂点2から頂点4へのエッジは両方向であることを示しています。

図5-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();

5.2.2 頂点プロパティの追加

「単純なグラフ・ファイルの作成」のグラフは、頂点プロパティまたはエッジ・プロパティを使用しない頂点とエッジで構成されています。頂点プロパティは、それぞれの線の元の頂点IDに続いて配置されます。double頂点(ノード)プロパティがグラフに追加されると、グラフ・データは次のようになります。

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();

5.2.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)はサポートされていません。

5.2.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();

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

グラフはJavaまたはシェルを使用してメモリーに読み込んだ後、別の形式でディスクに格納できます。格納したグラフ・データは、後でインメモリー分析への入力として使用できます。

HTTP/RESTへのグラフの格納は現在サポートされていません。

オプションは次のとおりです。

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

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

5.3.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);

5.3.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)
==> {"node_props":[{"name":"session-12kta9mj-vertex-prop-double-2","type":"double"}],"error_handling":{},"node_id_type":"integer","uri":"/tmp/g.edge","loading":{},"edge_props":[{"name":"cost","type":"double"}],"format":"edge_list"}

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);

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

インメモリー分析には、一連の組込みアルゴリズムが含まれており、Java APIとして使用できます。このセクションでは、Triangle CountingおよびPagerank分析を使用したインメモリー分析の使用方法について説明します。

- インメモリー分析

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

- Pagerankアルゴリズムの実行

5.4.1 インメモリー分析について

インメモリー分析には、一連の組込みアルゴリズムが含まれており、Java APIとして使用できます。APIについて詳しくは、oracle.pgx.api.algorithmsパッケージの製品(デフォルトの/opt/oracle/oracle-spatial-graph/property_graph/doc/pgx)に同梱されているJavadocに記載されています。特に、サポートされているインメモリー分析のリストについては、BuiltinAlgorithmsインタフェースのメソッド・サマリーを参照してください。

たとえば、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 extends Comparable<ID>> VertexProperty<ID, Double> pagerank(PgxGraph graph, double e, double d, int max);

一方、Pagerankのインメモリー分析APIは次のとおりです。

5.4.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);

このアルゴリズムでは、サンプル・グラフ内の1つの三角形を検出します。

ヒント:

インメモリー分析シェルを使用する場合、ロギング・レベルを変更すると、実行中のログ出力の量を増加できます。:h :loglevelを指定した:loglevelコマンドの実行に関する情報を参照してください。

5.4.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());
}

5.5 サブグラフの作成

サブグラフはロードしたグラフに基づいて作成できます。フィルタ式を使用するか、2部グラフの左側の集合を指定する頂点(ノード)に基づく2部サブグラフを作成できます。

- フィルタ式について

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

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

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

グラフのメモリーへの読込みについては、「グラフ・データのメモリーへの読込み」を参照してください。

5.5.1 フィルタ式について

フィルタ式は、各エッジで評価される式です。式によって、結果(この場合はサブグラフ)に含まれるようにエッジを完成させる述部を定義できます。

4つの頂点(ノード)と4つのエッジで構成される図5-1 のグラフを検討します。フィルタ式src.prop == 10と一致するエッジについては、元の頂点のpropプロパティが10になります。図5-3 に示すフィルタ式と一致する2つのエッジ。

図5-3 src.prop == 10と一致するエッジ

図5-4 はフィルタを適用した結果のグラフを示します。フィルタは頂点333に対応するエッジ、およびその頂点自体を除外します。

図5-4 簡易フィルタで作成されたグラフ

フィルタ式を使用すると、単一の頂点または頂点集合の選択が難しくなります。たとえば、プロパティ値10の頂点のみは選択できません。これは、頂点を照合するには、10がソース・プロパティ値と宛先プロパティ値のいずれかであるエッジを照合する必要があるためです。ただし、エッジを一致させるときは、ソースの頂点、宛先の頂点、およびその結果のエッジ自体が自動的に含まれます。

5.5.2 簡易フィルタを使用したサブグラフの作成

次の例は、「フィルタ式について」で説明したサブグラフの作成を示します。

シェルを使用したサブグラフの作成

subgraph = graph.filter(new VertexFilter("vertex.prop == 10"))

Javaを使用したサブグラフの作成

import oracle.pgx.api.*;
import oracle.pgx.api.filter.*;

PgxGraph graph = session.readGraphWithProperties(...);
PgxGraph subgraph = graph.filter(new VertexFilter("vertex.prop == 10"));

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

この例では、少し複雑なフィルタを使用しています。ここでは、識別子の送信エッジの数(ソースsrcまたは宛先dst)を計算するoutDegree関数を使用します。次のフィルタ式は、costプロパティ値が50を超え、outDegreeが1を超える宛先の頂点(ノード)のエッジと一致します。

dst.outDegree() > 1 && edge.cost > 50

図5-5 では、サンプル・グラフのエッジの1つがこのフィルタ式と一致します。

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

図5-6 はフィルタを適用した結果のグラフを示します。フィルタは頂点99と1908に対応するエッジを除外するため、その頂点も除外します。

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

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

2部サブグラフは、左側に使用される頂点(ノード)集合を指定して作成できます。2部サブグラフには、左側の頂点集合と右側の頂点集合の間にのみエッジがあります。左側の2つのノード間など、これらの集合内にエッジはありません。インメモリー分析では、入射および出射エッジが削除されたために分離された頂点は、2部サブグラフの一部ではありません。

次の図は、2部サブグラフを示します。プロパティは示していません。

次の例では、図5-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にはその他のエッジがないため、これも削除されています。

5.6 Jettyへのデプロイ

インメモリー分析は、Eclipse Jetty、Apache Tomcat、またはOracle WebLogicにデプロイできます。この例では、Webアプリケーションとしてインメモリー分析をEclipse Jettyにデプロイする方法を示しています。

1. インメモリー分析Webアプリケーション・アーカイブ・(WAR)ファイルをJetty webappsディレクトリにコピーします。

cd $PGX_HOME
cp $PGX_HOME/webapp/pgx-webapp-1.0.0-for-cdh5.2.1.war $JETTY_HOME/webapps/pgx.war

2. ユーザー名とパスワードのある場所を示すセキュリティ・レルムをJetty内に設定します。ファイルから資格証明を読み取る最も基本的なセキュリティ・レルムを追加するには、このスニペットを$JETTY_HOME/etc/jetty.xmlに追加します。

<Call name="addBean">
<Arg>
<New class="org.eclipse.jetty.security.HashLoginService">
<Set name="name">PGX-Realm</Set>
<Set name="config">
etc/realm.properties
</Set>
<Set name="refreshInterval">0</Set>
</New>
</Arg>
</Call>

このスニペットは、サポートされている最も単純なインメモリー・ログイン・サービス、HashLoginServiceを使用するようにJettyに指示します。このサービスでは、ユーザー名、パスワード、およびロールが格納されている構成ファイルを使用します。

3. 次の形式で、ユーザーを$JETTY_HOME/etc/realm.propertiesに追加します。

username: password, role

たとえば、この行ではユーザーSCOTTをパスワードTIGERおよびUSERロールで追加します。

scott: tiger, USER

4. ポート8080が未使用であることを確認し、Jettyを開始します。

cd $JETTY_HOME
java -jar start.jar

5. インストール用の適切な資格証明を使用して、Jettyが稼働していることを確認します。

cd $PGX_HOME
./bin/pgx --base_url http://scott:tiger@localhost:8080/pgx

6. (オプション)インメモリー分析構成ファイルを変更します。
インメモリー分析エンジンの構成ファイル(pgx.conf)およびロギング・パラメータ(log4j.xml)は、WEB-INF/classesのWARファイル内にあります。サーバーを再起動して変更を有効にします。

関連項目:

構成および使用方法に関するJettyドキュメントは、次を参照してください

http://eclipse.org/jetty/documentation/

- 認証メカニズムについて

5.6.1 認証メカニズムについて

インメモリー分析のWebデプロイメントでは、デフォルトでBASIC Authを使用します。本番のデプロイメントでは、より安全な認証メカニズムに変更する必要があります。

認証メカニズムを変更するには、Webアプリケーション・アーカイブ(WAR)ファイルでweb.xmlデプロイメント記述子のsecurity-constraint要素を変更します。

5.7 Apache Tomcatへのデプロイ

インメモリー分析は、Eclipse Jetty、Apache Tomcat、またはOracle WebLogicにデプロイできます。この例では、Webアプリケーションとしてインメモリー分析をApache Tomcatにデプロイする方法を示しています。

インメモリー分析には、セキュリティ・レルムを必要とする有効なBASIC Authが提供されています。Tomcatでは、様々な種類のレルムをサポートしています。この例では、最も単純なMemoryRealmを構成します。その他の種類については、Tomcatレルムの設定方法を参照してください。

1. インメモリー分析WARファイルをwebappsディレクトリにコピーします。次に例を示します。

cd $PGX_HOME
cp $PGX_HOME/webapp/pgx-webapp-1.0.0-for-cdh5.2.1.war $CATALINA_HOME/webapps/pgx.war

2. エディタで$CATALINA_HOME/conf/server.xmlを開き、次のレルムのクラス宣言を<Engine>要素に追加します。

<Realm className="org.apache.catalina.realm.MemoryRealm" />

3. エディタでCATALINA_HOME/conf/tomcat-users.xmlを開き、USERロールのユーザーを定義します。この例では、scottおよびtigerを適切なユーザー名とパスワードに置き換えます。

<role rolename="USER" />
<user username="scott" password="tiger" roles="USER" />

4. ポート8080が未使用であることを確認します。

5. Tomcatを開始します。

cd $CATALINA_HOME
./bin/startup.sh

6. Tomcatが動作していることを確認します。

cd $PGX_HOME
./bin/pgx --base_url http://scott:tiger@localhost:8080/pgx

注意:

Oracleでは、BASIC Authはテスト用としてのみ推奨します。その他すべてのデプロイメント・タイプについては、より強力な認証メカニズムを使用します。

関連項目:

Tomcatのドキュメントは、次を参照してください

http://tomcat.apache.org/tomcat-7.0-doc/

5.8 Oracle WebLogic Serverへのデプロイ

インメモリー分析は、Eclipse Jetty、Apache Tomcat、またはOracle WebLogic Serverにデプロイできます。この例では、Webアプリケーションとしてインメモリー分析をOracle WebLogic Serverにデプロイする方法を示しています。

- Oracle WebLogic Serverのインストール

- インメモリー分析のデプロイ

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

5.8.1 Oracle WebLogic Serverのデプロイ

Oracle WebLogic Serverの最新バージョンをダウンロードし、インストールするには、次を参照してください

http://www.oracle.com/technetwork/middleware/weblogic/documentation/index.html

5.8.2 インメモリー分析のデプロイ

Oracle WebLogicにインメモリー分析をデプロイするには、次のようなコマンドを使用します。ユーザーの管理資格証明とWARファイルをこの例に示す値に入力します。

cd $MW_HOME/user_projects/domains/mydomain
. bin/setDomainEnv.sh
java weblogic.Deployer -adminurl http://localhost:7001 -username username -password password -deploy -upload $PGX_HOME/lib/server/pgx-webapp-0.9.0.war

スクリプトが正常に実行されると、次のようなメッセージが表示されます。

Target state: deploy completed on Server myserver

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

サーバーに接続できることを確認します。

$PGX_HOME/bin/pgx --base_url scott:tiger123@localhost:7001/pgx

5.9 インメモリー分析サーバーへの接続

プロパティ・グラフのインメモリー分析がHadoopクラスタ、またはEclipse Jetty、Apache Tomcat、Oracle WebLogicのいずれかのWebアプリケーションとしてHadoopのないクライアント・システムにインストールした後は、インメモリー分析サーバーに接続できます。

- インメモリー分析シェルによる接続

- Javaによる接続

- HTTPリクエストによる接続

5.9.1 インメモリー分析シェルによる接続

インメモリー分析インスタンスへの最も単純な接続方法は、サーバーのベースURLを指定することです。次のベースURLでは、SCOTTユーザーをポート8080でリスニングするローカル・インスタンスに接続できます。

http://scott:tiger@localhost:8080/pgx

このベースURLでインメモリー分析シェルを開始するには、--base_urlコマンドライン引数を使用します

cd $PGX_HOME
./bin/pgx --base_url http://scott:tiger@localhost:8080/pgx

同じ方法でリモート・インスタンスに接続できます。ただし、インメモリー分析では現在、Control APIのリモート・サポートは提供されていません。

5.9.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"}}

この例のグラフURIは、インメモリー分析サーバーがHTTPまたはHDFSを使用してアクセスできるファイルを指し示している必要があります。

5.9.2 Javaによる接続

Javaを使用してインメモリー分析を初期化する場合、ベースURLを指定できます。この例は次のようになります。インメモリー分析サーバーへのURLがgetInMemAnalyst 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());

5.9.3 HTTPリクエストによる接続

インメモリー分析シェルでは、HTTPリクエストを使用してインメモリー分析サーバーと通信します。同じHTTPエンドポイントを直接使用、またはユーザーのクライアント・ライブラリへの書込みに使用できます。

この例では、HTTPを使用してcreate sessionを呼び出します。

HTTP POST 'http://scott:tiger@localhost:8080/pgx/core/session' with payload '{"source":"shell"}'
Response: {"sessionId":"session-shell-42v3b9n7"}

create sessionのコールによって、セッション識別子が返されます。ほとんどのHTTPコールはインメモリー分析UUIDを返し、リクエストの結果を保持しているリソースを識別します。インメモリー分析リクエストの数が多いと、完了するまで時間がかかりますが、結果へのハンドルはすぐに取得できます。このハンドルを使用して、HTTP GETを特殊なエンドポイントに呼び出すと、リクエストの結果(リクエストが完了していない場合はブロック)が得られます。

インメモリー分析とHTTPの相互作用のほとんどはこの例のようになります。

// any request, with some payload
HTTP POST 'http://scott:tiger@localhost:8080/pgx/core/session/session-shell-42v3b9n7/graph' with payload '{"graphName":"sample","graphConfig":{"edge_props":[{"type":"double","name":"cost"}],"format":"adj_list","separator":" ","node_props":[{"type":"integer","name":"prop"}],"uri":"http://path.to.some.server/pgx/sample.adj"}}'
Response: {"futureId":"15fc72e9-42e9-4527-9a31-bd20eb0adafb"}

// get the result using the In-Memory Analytics future UUID.
HTTP GET 'http://scott:tiger@localhost:8080/pgx/future/session/session-shell-42v3b9n7/result/15fc72e9-42e9-4527-9a31-bd20eb0adafb'
Response: {"stats":{"loadingTimeMillis":0,"estimatedMemoryMegabytes":0,"numNodes":4,"numEdges":4},"graphName":"sample","nodeProperties":{"prop":"integer"},"edgeProperties":{"cost":"double"}}

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

インメモリー分析では、Hadoop Distributed File System (HDFS)をサポートしています。この例では、インメモリー分析APIによってHDFSのグラフ・データを読み取り、アクセスする方法を示しています。

グラフ構成ファイルはクライアント側で解析されます。グラフ・データと構成ファイルはHDFSに格納されます。Hadoopクライアントはインメモリー分析と同じコンピュータにインストールする必要があります。『Oracle Big Data Applianceソフトウェア・ユーザーズ・ガイド』を参照してください。

グラフ構成ファイルはクライアント側で解析されます。グラフ・データと構成ファイルはHDFSに格納されます。Hadoopクライアントはインメモリー分析と同じコンピュータにインストールする必要があります。『Oracle Big Data Applianceソフトウェア・ユーザーズ・ガイド』のCDHへのリモート・クライアント・アクセスの提供に関する項を参照してください。

注意:

パラレル・インメモリー分析エンジンは、Hadoopクラスタの1つのノードのメモリーでのみ実行されます。

- HDFSからのデータのロード

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

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

5.10.1 HDFSからのデータのロード

この例では、sample.adjグラフ・データとその構成ファイルをHDFSにコピーし、それをメモリーにロードします。

1. グラフ・データをHDFSにコピーします。

cd $PGX_HOME
hadoop fs -mkdir -p /user/pgx
hadoop fs -copyFromLocal examples/graphs/sample.adj /user/pgx

2. グラフ構成ファイルの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/graphs/sample.adj.json /user/pgx

4. 次の例に示すように、HDFSからサンプル・グラフをインメモリー分析にロードします。

シェルを使用したHDFSからのグラフのロード

g = session.readGraphWithProperties("hdfs:/user/pgx/sample.adj.json");
===> {
"graphName" : "G",
"nodeProperties" : {
"prop" : "integer"
},
"edgeProperties" : {
"cost" : "double"
},
"stats" : {
"loadingTimeMillis" : 628,
"estimatedMemoryMegabytes" : 0,
"numNodes" : 4,
"numEdges" : 4
}
}

Javaを使用したHDFSからのグラフのロード

import oracle.pgx.api.*;
PgxGraph g = session.readGraphWithProperties("hdfs:/user/pgx/sample.adj.json");

5.10.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

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

前の例のHdfsExample 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().fromHdfs("/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());
}
}

これらのコマンドは、HdfsExampleクラスをコンパイルします。

cd $PGX_HOME
mkdir classes
javac -cp ../lib/* HdfsDemo.java -d classes

このコマンドはHdfsExampleクラスを実行します。

java -cp ../lib/*:conf:classes:$HADOOP_CONF_DIR HdfsDemo

5.11 YARNアプリケーションとしてのインメモリー分析の実行

この例では、Hadoop NextGen MapReduce (YARN)スケジューリングにより、Hadoopクラスタ上でインメモリー分析サーバーを開始、停止および監視する方法について説明します。

- インメモリー分析サービスの開始および停止

- インメモリー分析サービスへの接続

- インメモリー分析サービスの監視

5.11.1 インメモリー分析サービスの開始および停止

YARNアプリケーションとしてインメモリー分析を開始する前に、インメモリー分析YARNクライアントを構成する必要があります。

5.11.1.1 インメモリー分析YARNクライアントの構成

インメモリー分析ディストリビューションには、$PGX_HOME/conf/yarn.confのYARNクライアント構成ファイルのサンプルが含まれています。

必要なフィールドがすべて設定されていることを確認します。指定したパスがHDFSにあり、zookeeper_connect_stringがCDHクラスタで実行中のZooKeeperポートを指し示している必要があります。

5.11.1.2 新規インメモリー分析サービスの開始

新規インメモリー分析サービスをHadoopクラスタで開始するには、次のコマンドを使用します。

yarn jar $PGX_HOME/yarn/pgx-yarn-1.0.0-for-cdh5.2.1.jar

$PGX_HOME/conf/yarn.conf以外のYARNクライアント構成ファイルを使用するには、ファイル・パスを指定します。

yarn jar $PGX_HOME/yarn/pgx-yarn-1.0.0-for-cdh5.2.1.jar /path/to/different/yarn.conf

サービスが開始されると、インメモリー分析サービスが起動されているHadoopノードのホスト名とポートが表示されます。

5.11.1.3 長期実行インメモリー分析サービスについて

インメモリー分析YARNアプリケーションは、指定した時間後にタイムアウトするようにデフォルトで構成されています。pgx_server_timeout_secsを0に設定してタイムアウトを無効にすると、インメモリー分析サーバーはユーザーまたはHadoopによって明示的に停止されるまで継続して実行されます。

5.11.1.4 インメモリー分析サービスの停止

実行中のインメモリー分析サービスを停止する手順:

yarn application -kill appId

この構文では、appIdがサービス開始時に表示されるアプリケーションIDです。

終了したインメモリー分析サービスのログを検証する手順:

yarn logs -applicationId appId

5.11.2 インメモリー分析サービスへの接続

YARNでのインメモリー分析サービスには、任意のインメモリー分析サーバーへの接続と同じ方法で接続できます。たとえば、シェル・インタフェースでインメモリー分析サービスに接続するには、次のようなコマンドを使用します。

$PGX_HOME/bin/pgx --base_url username:password@hostname:port

この構文では、usernameおよびpasswordがYARN構成で指定されているものと一致します。

5.11.3 インメモリー分析サービスの監視

インメモリー分析サービスを監視するには、リソース・マネージャWeb UIで対応するYARNアプリケーションをクリックします。デフォルトでは、Web UIは次の場所にあります

http://resource-manager-hostname:8088/cluster

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

ビッグ・データ環境でマルチメディア分析フレームワークを使用すると、ビデオおよびイメージで顔認識を実行できます。

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

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

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

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

- 出力のイメージの表示

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

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

- Apache Hadoopでビデオおよびイメージ・データを処理および分析するためのAPI

- Apache Hadoopの並列性を活用した、スケーラブルな高速処理

- OpenCVを使用した組込みの顔認識

- カスタム・ビデオ/イメージ処理(ライセンス・プレート認識など)をインストールおよび実装して、Apache Hadoopでこのフレームワークを使用して実行できる機能

ビデオ分析フレームワークは、Oracle Spatial and Graphのライセンスが付与されている場合にOracle Big Data Applianceにインストールされ、他のHadoopクラスタにインストールできます。

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

マルチメディア分析機能は、組込みの顔認識に含まれています。顔認識では、製品で使用可能なOpenCVライブラリが使用されます。この章では、顔認識機能の使用方法について説明します。

顔認識には次の2つのステップがあります。

1. 顔のイメージを使用してモデルをトレーニングします。このステップは、任意のHadoopクライアントまたはノードで実行できます。

2. トレーニング・モデルを使用して、入力ビデオまたはイメージから顔を認識します。このステップは、Hadoopクラスタで実行するMapReduceジョブです。

トレーニング・プロセスにより、ファイルに格納されるモデルが作成されます。このファイルは、ビデオまたはイメージからの顔認識の入力として使用されます。

トピック:

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

- ビデオでの顔の検出

- イメージでの顔の検出

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

トレーニングは、ordhadoop_multimedia_analytics.jarの一部であるJavaプログラムOrdFaceTrainerを使用して行われます。このプログラムへの入力は、イメージと、イメージをラベルにマッピングするラベル・マッピング・ファイルのセットです。出力は、ファイルに書き込まれるトレーニング・モデルです。(このファイルは編集しないでください。)

顔を検出(認識)するためにマルチメディア分析機能をトレーニングするには、次の手順に従います。

1. 認識の対象となるイメージを格納する、親ディレクトリとサブディレクトリを作成します。
各サブディレクトリには、1人の人物のイメージが1つ以上含まれている必要があります。1人の人物のイメージを複数のサブディレクトリに格納することはできますが、1つのサブディレクトリに含めることができるのは1人の人物のイメージのみです。たとえば、imagesという名前の親ディレクトリが存在し、1つのサブディレクトリ(d1)にはAndrewという名前の人物のイメージが含まれ、2つのサブディレクトリ(d2およびd3)にはBettyという名前の人物のイメージ(2つの異なる場所で2つの異なる時間に撮影された写真など)が含まれているとします。この例では、ディレクトリとその内容は次のようになる可能性があります。

- images/d1には、 Andrewのイメージが5つ含まれています。

- images/d2には、Bettyのイメージが2つ含まれています。

- images/d3には、Bettyのイメージが4つ含まれています。

2. イメージのサブディレクトリをラベルにマップするマッピング・ファイルを作成します。
ラベルとは、認識されるイメージの人物に関連付けられる数値IDです。たとえば、Andrewはラベル値100に関連付けられ、Bettyはラベル値101に関連付けられる、というようになります。マッピング・ファイル内の各レコード(行)には、次の構造が含まれている必要があります。

<subdirectory>,<label-id>,<label-text>

次に例を示します。

d1,100,Andrew
d2,101,Betty
d3,101,Betty

3. 必須の構成プロパティを設定します。

oracle.ord.hadoop.ordfacemodel
oracle.ord.hadoop.ordfacereader
oracle.ord.hadoop.ordsimplefacereader.dirmap
oracle.ord.hadoop.ordsimplefacereader.imagedir

使用可能なプロパティの詳細は、「マルチメディア分析の構成プロパティ」を参照してください。

4. CLASSPATHを設定します。Java CLASSPATH定義に次を含めます。各アスタリスク(*)は、実際のバージョン番号に置き換えてください。

$MMA_HOME/lib/ordhadoop-multimedia-analytics.jar
$MMA_HOME/opencv_3.0.0/opencv-300.jar
$HADOOP_HOME/hadoop-common-*.jar
$HADOOP_HOME/hadoop-auth-*.jar
$HADOOP_HOME/commons-lang*.jar
$HADOOP_HOME/commons-logging-*.jar
$HADOOP_HOME/commons-configuration-*.jar
$HADOOP_HOME/commons-collections-*.jar
$HADOOP_HOME/guava-*.jar
$HADOOP_HOME/slf4j-api-*.jar
$HADOOP_HOME/slf4j-log4j12-*.jar
$HADOOP_HOME/log4j-*.jar
$HADOOP_HOME/commons-cli-*.jar
$HADOOP_HOME/protobuf-java-*.jar
$HADOOP_HOME/avro-*.jar
$HADOOP_HOME/hadoop-hdfs-*.jar
$HADOOP_HOME/hadoop-mapreduce-client-core-*.jar

5. トレーニング・モデルを作成します。次の一般的な形式でコマンドを入力します。

java -classpath <…> oracle.ord.hadoop.recognizer.OrdFaceTrainer <training_config_file.xml>

注意:
$MMA_HOME/exampleには、サンプル・ファイルのセットがあります。これには、Java CLASSPATHを設定するためのスクリプトが含まれています。トレーニング・モデルを作成するために、必要に応じて例を編集できます。

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

トレーニング・モデルの作成に使用するイメージは、顔のみを含み、できるかぎり顔の周囲に細かいものが写っていないようにする必要があります。次のいくつかの例は、同じ男性がそれぞれ異なる表情をした4つのイメージを示しています。

トレーニングのためのイメージの選択は、正確なマッチングのために重要です。次のガイドラインが適用されます。

- イメージのセットには、目を閉じたり笑ったりするなど、考え得るあらゆる構えや表情の顔を含める必要があります。

- 非常に似ているイメージを含めることは避けてください。

- 人物をいくつかの異なる背景や照明条件の下で認識する必要がある場合は、それらの背景を持つイメージを含めます。

- 含めるイメージの数は、入力データで予想される動きや背景の多様さによって異なります。

6.2.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.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_CLASSPATHを設定します。
HADOOP_CLASSPATHに、「顔を検出するためのトレーニング」にリストされているファイルが含まれていることを確認します

5. 顔を認識する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>

顔の検出の正確さは、照明、明度、顔の向き、カメラから顔までの距離、ビデオまたはイメージの鮮明さなど、様々な要因によって決まります。複数の構成プロパティを試して、ユースケースに最も適した値のセットを特定する必要があります。偽陽性(顔が異なるオブジェクトの識別)と誤認(顔のラベル付けの誤り)は、常に発生する可能性があることに注意してください。

注意:
$MMA_HOME/exampleには、サンプル・ファイルのセットがあります。 これには、Java CLASSPATHを設定するためのスクリプトが含まれています。必要に応じて編集し、顔を検出するジョブを発行します。

6.2.4 イメージでの顔の検出

イメージ上の顔を検出するには、イメージをHDFSにコピーします。次のプロパティを指定します。

<property>
<name>oracle.ord.hadoop.inputtype</name>
<value>image</value>
</property>

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

顔の検出を始める際に役立つように、いくつかの例とトレーニング資料が提供されています。

$MMA_HOMEには次のディレクトリがあります。

video/ (contains a sample video file in mp4 and avi formats)
facetrain/
analytics/

facetrain/にはトレーニングの例が含まれています。facetrain/config/にはサンプル構成ファイルが含まれており、facetrain/faces/には、トレーニング・モデルを作成するためのイメージと、イメージにラベルをマップするマッピング・ファイルが含まれています。

Makefileおよびtrainface.shは、トレーニング・ステップを実行するためにMakefileを使用するか、またはバッチ・スクリプトを使用するかの選択肢を提供します。

次のようにして、トレーニング・モデルを作成できます。

$ ./trainface.sh

トレーニング・モデルはordfacemodel_bigdata.datに書き込まれます。

ビデオでの顔の検出について、analytics/には、入力ビデオ・ファイルで顔を検出するためのHadoopジョブの実行例が含まれています。このディレクトリには、構成ファイルの例を含むconf/が含まれています。

Makefileおよびtrainface.shは、Hadoopジョブを発行するためにMakefileを使用するか、またはバッチ・スクリプトを使用するかの選択肢を提供します。

次のようにして、ジョブを実行できます(HDFSディレクトリvinputへのビデオ・ファイルのコピーも含みます)

$ ./runjob.sh

ジョブの出力はHDFSディレクトリvoutputに含められます。

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

マルチメディア分析フレームワークでは、hadooopコマンドで構成プロパティを指定するために標準メソッドを使用します。構成ファイルを指定する場合は–confオプションを使用し、個別のプロパティを指定する場合は-Dオプションを使用します。このトピックでは、構成プロパティに関する参照情報を示します。

いくつかのプロパティは、特定のタスクのために使用されます。たとえば、トレーニング・プロパティには次のものがあります。

- oracle.ord.hadoop.ordfacereader

- oracle.ord.hadoop.ordsimplefacereader.imagedir

- oracle.ord.hadoop.ordsimplefacereader.dirmap

- oracle.ord.hadoop.ordfacemodel

- oracle.ord.hadoop.ordfacereaderconfig

次に、使用可能な構成プロパティをアルファベット順にリストします。(すべての名前はoracle.ord.hadoop.で始まります)。各パラメータについて、パラメータ名をリストし、その次にそのパラメータに関する情報を示します。

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.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>

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

マルチメディアのデコードおよび処理のために、カスタム・モジュールを実装およびインストールできます。

抽出クラスoracle.ord.hadoop.decoder.OrdFrameGrabberを実装することにより、フレームワークでカスタム・ビデオ・デコーダを使用できます。詳細は、Javadocを参照してください。製品には、JCodecおよびFFMPEG用にOrdFrameGrabberを拡張するビデオ・デコーダの実装が2つ含まれています(FFMPEGは別途インストールする必要があります)。

2つの抽出クラスを実装することにより、フレームワークでカスタム・マルチメディア分析を使用できます。

- oracle.ord.hadoop.mapreduce.OrdFrameProcessor&#60;K1,V1,K2,V2>。OrdFrameProcessorの拡張クラスは、ビデオ・フレームまたはイメージを処理するMapReduceジョブのMapフェーズで使用されます。(K1, V1)は入力キー値ペア・タイプで、(K2, V2)は出力キー値ペア・タイプです。詳細は、Javadocを参照してください。製品には、OpenCVを使用した実装が含まれています。

- oracle.ord.hadoop.mapreduce.OrdOutputProcessor&#60;K1,V1,K2,V2>。OrdFrameProcessorの拡張クラスは、ビデオ・フレームまたはイメージを処理するMapReduceジョブのReducerフェーズで使用されます。(K1, V1)は入力キー値ペア・タイプで、(K2, V2)は出力キー値ペア・タイプです。詳細は、Javadocを参照してください。ほとんどの実装は、このクラスの実装を必要としません。

フレームワーク構成パラメータの例は、$MMA_HOME/example/analytics/conf/oracle_multimedia_analysis_framework.xmlにあります。

6.5 出力のイメージの表示

出力がイメージとして表示される場合、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 fluent

- Apache Groovy

- Apache htrace

- Apache HTTP Client

- Apache HTTPComponents Core

- Apache Jena

- Apache Log4j

- Apache Lucene

- Apache Xerces2

- Apache xml-commons

- Cloudera CDH

- Fastutil

- GeoNamesデータ

- Geospatial Data Abstraction Library (GDAL)

- Google Guava

- Google Guice

- Google protobuf

- Jackson

- Jansi

- JCodec

- Jettison

- JLine

- Javassist

- Jung

- MessagePack

- Netty

- OpenCV

- Slf4j

- 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 fluent

Copyright © 2011-2014 The Apache Software Foundation.All rights reserved.

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.12 Apache Groovy

Copyright 2009-2015 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.13 Apache htrace

Copyright 2009-2015 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.14 Apache HTTP Client

Copyright 1999-2013 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.15 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.16 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.17 Apache Log4j

Copyright 2007 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.18 Apache Lucene

Copyright 2011-2012 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.19 Apache Xerces2

Copyright 1999-2012 The Apache Software Foundation

この製品には、The Apache Software Foundation (http://www.apache.org/)によって開発されたソフトウェアが含まれています。

A.20 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.21 Cloudera CDH

コントリビュータ・ライセンス契約により、Apache Software Foundation (ASF)に使用許諾されています。著作権所有に関する追加情報は、この著作物に同梱されているNOTICEファイルを参照してください。ASFはApache License、Version 2.0 ("ライセンス")に基づきこのファイルをライセンス供与します。ライセンスに準拠している場合を除き、このファイルは使用できません。ライセンスのコピーは、次から入手できます

http://www.apache.org/licenses/LICENSE-2.0

適用法により求められた場合、または書面をもって同意された場合を除き、ライセンスに基づいて配布されたソフトウェアは、明示的、黙示的を問わず一切の保証または条件なしに「現状のまま」で提供されています。

特定の言語下のライセンス許諾事項および制限事項については、ライセンスを確認してください。

A.22 Fastutil

FastutilはApache License、Version 2.0に基づいて提供されます。

A.23 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.24 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.Rogers.More 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.25 Google Guava

GuavaはApache License、Version 2.0に基づいてライセンスされています。

Copyright 2006 - 2011 Google, Inc. All rights reserved.

A.26 Google Guice

GuiceはApache License, Version 2.0に基づいてライセンスされています。

Copyright 2006 – 2011 Google, Inc. All rights reserved.

A.27 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.28 Jackson

Copyright 2009 FasterXML, LLC

JacksonはApache License、Version 2.0に基づいて提供されます。

A.29 Jansi

Copyright (C) 2009, Progress Software Corporation and/or its subsidiaries or affiliates.

JansiはApache License、Version 2.0に基づいて提供されます。

A.30 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.31 Jettison

Copyright 2006 Envoi Solutions LLC.

JettisonはApache License、Version 2.0に基づいて提供されます。

A.32 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.33 Javassist

Copyright 1999-2015 by Shigeru Chiba.

このソフトウェアのコンテンツは、Apache License Version 2.0の条項に基づいて使用できます。

A.34 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.35 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.36 Netty

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.37 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.38 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.39 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.40 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.41 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.

オラクルの法律上の注意点について

コピーライトについて

Copyright © 1994-2016, 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およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

アルファ版およびベータ版ドラフト・ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。Oracle Corporationおよびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

非公開のアルファ版およびベータ版ドラフト・ドキュメントについて

このドキュメントが非公開の試作版の場合:

このドキュメントに含まれる情報は、情報の共有のみを目的としたものであって、顧客諮問委員会(Customer Advisory Board)のメンバーとしてのお客様の立場でのみ、またはお客様のベータ・トライアル契約のみに従って検討されるべきものとします。マテリアル、コード、または機能の提供をお約束するものではなく、購入決定を行う際の判断材料とすべきではありません。このドキュメントに記載されている特徴または機能の開発、リリースおよび時期については、オラクルの裁量により決定されます。

このドキュメントには、ソフトウェアまたは印刷物などの形式を問わず、オラクルが独占的な権利を有する財産的情報が含まれています。この機密資料へのアクセスと使用は、お客様とオラクルとの間で締結され、お客様が遵守に同意した、Oracle Master Agreement、Oracle License and Oracle Services Agreement (オラクル・ライセンスおよびサービスに関する契約書)、Oracle PartnerNetwork 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を参照してください。