Slide 1

Slide 1 text

Apache Sedona (incubating) を用いた クラウド上での大規模地理データの処理 関 堅吾 本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。

Slide 2

Slide 2 text

自己紹介 • SIer 所属のデータエンジニア • Apache Hadoop, Apache Spark といった、ビッグデータ関連OSSを用 いたシステムの開発や研究開発に従事しています • Apache Software Foundation 傘下の、いくつかのビッグデータ関連 OSSプロジェクトでコミッタを務めています • 本日は、私が最近開発に参加している Apache Sedona という OSS を ご紹介させていただきます

Slide 3

Slide 3 text

Apache Sedona (incubating) とは • https://sedona.apache.org/ • 並列分散処理フレームワークである Apache Spark 上で、地理データを 効率的に扱うための OSS • 2022/4リリースのバージョン 1.2.0 から Apache Flink もサポート • もともとは GeoSpark という名称で、アリゾナ州立大学の Data Systems Lab で 2015 年から開発が始められた • 2020年7月に incubation project として Apache Software Foundation に寄贈 された • Sedona 1.0.0 は GeoSpark 1.3.2 がベース • 2022年9月時点の最新バージョンは 1.2.1-incubating • 関連する論文の一覧 • https://sedona.apache.org/community/publication/

Slide 4

Slide 4 text

地理データの用途 • ランドマークの検索や推薦 • ランドマークへのナビゲーション、混雑具合の可視化 • 配車、配送 • マーケティング、整備計画 • etc. Sedonaはこういった処理を容易に実装できるよう、以下のような 機能を提供(後述) • Spatial Partitioning & Join • Spatial Index • Spatial data types & functions

Slide 5

Slide 5 text

Apache Spark, Apache Flink • Apache Software Foundation 傘下で開発されている, OSS の並列分散 処理エンジン • 1台のマシンのメモリに収まりきらないデータや、1台では時間が かかりすぎる処理に対して、複数台のマシンのメモリ上にデータ を分割して持ち、それらのマシンに処理を分散して実行すること が可能 • AWS, Azure, GCP といった代表的なクラウド上でも、これらを基盤 とするマネージドサービスが複数提供されている

Slide 6

Slide 6 text

題材とするタスク: 近隣に存在するランドマークやユーザの検索 a 35.650 ユーザID 緯度 経度 139.778 b 35.665 139.785 c 35.655 139.795 d 35.651 139.799 e 35.660 139.800 f 35.653 139.810 A 35.656 ランドマークID 緯度 経度 139.797 … … A 35.656 139.797 A 35.656 139.797 A 35.656 139.797 a 35.650 139.778 b 35.665 139.785 35.655 139.795 35.651 139.799 c d 35.660 139.800 35.653 139.810 e f 35.655 139.795 c 2. サイズの小さい側はデータ全体を、大きい側はデータを 分割して各ノードに送信 (broadcast join). 各ノードは全ての 組合せについて距離を計算し、該当するデータを抽出 3. 各ノードで得られた結果をマージする ことで、全体としての結果が得られる 1. 入力データは、ランドマークやユーザを 一意に表すIDと、その緯度経度

Slide 7

Slide 7 text

Broadcast Join が機能しないケース a 35.650 ユーザID 緯度 経度 139.778 b 35.665 139.785 c 35.655 139.795 d 35.651 139.799 e 35.660 139.800 f 35.653 139.810 A 35.656 ランドマークID 緯度 経度 139.797 … B 35.656 139.797 C 35.656 139.797 D 35.656 139.797 … 両方のデータが大規模な場合、broadcast は 実用的でない 無理に実行しても、大容量データの転送や、 メモリに乗り切らないデータをディスクとの 間で出し入れすることにより、処理が大幅に 遅くなる

Slide 8

Slide 8 text

ジオコーディングを用いた解決策 xn76v4 … A 35.656 139.797 B 35.656 139.797 b 3. 各ノードで得られた結果をマージする ことで、全体としての結果が得られる xn76v6 xn76v5 xn76v5 xn76vh xn76vk xn76uu xn76ug xn76u9 xn76uc xn76v1 xn76v3 xn76ud xn76uf xn76ue xn76us a 35.650 ユーザID 緯度 経度 139.778 b 35.665 139.785 c 35.655 139.795 d 35.651 139.799 e 35.660 139.800 f 35.653 139.810 A 35.656 ランドマークID 緯度 経度 139.797 … B ... ... C ... ... D ... ... … GeoHash xn76v4 xn76uu xn76vk xn76v3 GeoHash xn76u9 xn76uu xn76v4 xn76v4 xn76v5 xn76v6 … … xn76v4 c 35.655 139.795 d 35.651 139.799 xn76v4 xn76v4 xn76uu 35.665 139.785 xn76uu c 35.655 139.795 b 35.665 139.785 1. GeoHash や地域メッシュ, H3といったジオ コーディング手法を用いて、地図を一意のIDを 持つ範囲に分割 (ここではGeoHashを使用) 2. GeoHash をキーとしてデータを各ノードに分割し (同一の GeoHash に属する近傍のデータ同士を同じ ノードに集める)、各ノード内で両者の距離を計算 • GeoHash: http://geohash.org/ • 地域メッシュ: JIS X 0410, https://www.stat.go.jp/data/mesh/index.html • H3: https://h3geo.org/ A 35.656 139.797 B 35.656 139.797

Slide 9

Slide 9 text

... ... ... xn76v4 ジオコーディングを用いた場合の問題点 xn76v4 … A ... ... B 35.656 139.797 b xn76v6 xn76v5 xn76v5 xn76vh xn76vk xn76uu xn76ug xn76u9 xn76uc xn76v1 xn76v3 xn76ud xn76uf xn76ue xn76us a ... ユーザID 緯度 経度 ... b ... ... c ... ... d ... ... e ... ... ... ... ... A ... ランドマークID 緯度 経度 ... … B ... ... C ... ... D ... ... … GeoHash xn76v4 xn76uu xn76vk xn76v3 GeoHash xn76u9 xn76uu xn76v4 xn76v4 xn76v4 xn76v4 … … xn76v4 c ... ... d ... ... xn76v4 xn76v4 xn76uu 35.665 139.785 xn76uu b 35.665 139.785 実際には、ランドマークやユーザの地理的な分布には 大きな偏りがある(都市圏への集中など) そのため、ジオコーディングを使っても、特定の値 を担当しているノードに処理すべきデータが偏り、 それに引きずられて処理全体が遅延することがある B 35.656 139.797 e ... ... xn76v4 ... ... ... xn76v4 (長時間化) … …

Slide 10

Slide 10 text

Sedonaが提供する機能①: Spatial Partitioning & Join • Sedona では, GeoHash のような単純な uniform grid (左) だけでなく、 範囲に属するデータの個数を考慮したデータの分割が可能 • バージョン1.2.1時点では、四分木 (中央) とkd木 (右) をサポート • 領域を分割するため、データ全体の1%をサンプルとして使用 Yu et al. (2019) より引用 https://doi.org/10.1007/s10707-018-0330-9

Slide 11

Slide 11 text

Sedonaが提供する機能②: Spatial Index • 四分木やkd木で分割したパーティションに対して、各ノード上 に自身が担当する範囲のローカルなインデックスを作成できる • インデックス作成のオーバーヘッドはあるが、繰り返し同じ データを参照する場合に効果を発揮 ・バージョン1.2.1時点では 四分木とR木をサポート

Slide 12

Slide 12 text

Sedonaが提供する機能③: Spatial data types & functions • SQL/MM-Part 3: Spatial 標準仕様に準拠したデータ型および関数を提供 • バージョン1.2.1時点では未サポートの関数もあるため、詳細はAPIドキュメント (https://sedona.apache.org/api/sql/Overview/) を参照 $ spark-shell --packages org.apache.sedona:sedona-python-adapter-3.0_2.12:1.2.1- incubating,org.apache.sedona:sedona-viz-3.0_2.12:1.2.1-incubating,org.datasyslab:geotools- wrapper:1.1.0-25.2 ... scala> import org.apache.sedona.sql.utils.SedonaSQLRegistrator import org.apache.sedona.sql.utils.SedonaSQLRegistrator scala> SedonaSQLRegistrator.registerAll(spark) scala> spark.sql("SELECT ST_GeoHash(ST_SetSRID(ST_Point(139.797, 35.656), 4329), 6)").show() +----------------------------------------------------------+ |st_geohash(st_setsrid(st_point(139.797, 35.656), 4329), 6)| +----------------------------------------------------------+ | xn76v4| +----------------------------------------------------------+ 先ほど出てきた GeoHash も, Sedona が提供する関数を使って 容易に求められる Spark の場合の使用方法 1. Spark の実行コマンドに、Sedonaと依存 ライブラリの jar ファイルを指定 2. Sedona が提供するデータ型・関数を登録

Slide 13

Slide 13 text

クラウドサービスでの活用 • Sedona は Spark や Flink の拡張ライブラリなので、Amazon EMR や Azure HDInsight, Google Cloud Dataproc といったマネージド Hadoop サービスと組み合わせて利用可能 • これらの OSS を基盤としたよりマネージドなサービスでも、外 部ライブラリを追加可能であれば利用できる • Amazon Kinesis Data Analytics • Azure Synapse Analytics など

Slide 14

Slide 14 text

活用例: Amazon Kinesis Data Analytics • Amazon Kinesis Data Streams や Amazon MSK (Managed Streaming for Apache Kafka) に投入されたストリームデータを, Flink を使ってリアルタイムに加工・ 分析できるサービス • https://aws.amazon.com/jp/kinesis/data-analytics/

Slide 15

Slide 15 text

Kinesis Data Analytics では、実現したい処理を Flink アプリケーションとして開発し、その jar ファイルを S3 上に配置する

Slide 16

Slide 16 text

アップロードする jar ファイルに, Sedona とその 依存ライブラリが含まれるよう、ビルドツール を設定する (画面は maven の例) ※2022/9 時点の最新バージョンである 1.2.1 では Spark に比べて Flink がサポートしている関数が少ないため、 使用する関数によっては, Sedona をソースコードから コンパイルする必要がある。 Sedona のコンパイル手順は https://sedona.apache.org/setup/compile/ を、 関数ごとのサポート開始バージョンについては https://sedona.apache.org/api/flink/Overview/ を参照。

Slide 17

Slide 17 text

• Flink をベースとした, Amazon Kinesis Data Stream や Amazon MSK (Managed Streaming for Apache Kafka) に対して アプリケーションの先頭で Sedona のデータ型や関数を登録する。 詳細な説明は https://sedona.apache.org/tutorial/flink/sql/ を参照。 Sedona が提供するデータ型や 関数を使って処理を記述

Slide 18

Slide 18 text

活用例: Azure Synapse Analytics • https://azure.microsoft.com/ja-jp/services/synapse-analytics/ • データレイク, DWH, BIツール, Notebook などの機能が統合 されたサービスで, Spark を使った分析が可能

Slide 19

Slide 19 text

Synapse Studio を起動し, workspace に以下のページで 配布されている Sedona の jar ファイルを登録する。 https://sedona.apache.org/download/

Slide 20

Slide 20 text

Spark Pool の設定から, workspace に登録した jar ファイルをパッケージとして追加

Slide 21

Slide 21 text

Notebook を起動し、先頭で Sedona のデータ型や関数を登録する。 詳細な説明は https://sedona.apache.org/tutorial/sql/ を参照。 Sedona が提供するデータ型や、 関数を使って処理を記述できる

Slide 22

Slide 22 text

Sedona の whl ファイルを自分でビルドして アップロードすれば, PySpark からも利用可能。 Debian/Ubuntu でのビルド手順は以下の通り。 $ sudo apt-get install pipenv $ git clone --branch=sedona-1.2.1-incubating --depth=1 https://github.com/apache/incubator-sedona.git $ cd incubator-sedona/python $ vi Pipfile # python_version を使用中の Python バージョンに変更 $ ./build_wheel.sh $ ls dist apache-sedona-1.2.1.tar.gz apache_sedona-1.2.1-py3-none-any.whl

Slide 23

Slide 23 text

まとめ • Apache Sedona は, Spark や Flink といった並列分散処理エンジンで 大規模地理データを扱うための OSS です。 • Spark や Flink を基盤としたクラウドサービスは意外と多く存在し、 外部ライブラリを導入可能なものであれば Sedona を利用できる ので、大規模な地理データの加工や分析を行いたい場合は候補と して検討してみてはいかがでしょうか。