Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Apache Sedona (incubating) を用いたクラウド上での大規模地理データの処理

Kengo Seki
PRO
September 13, 2022

Apache Sedona (incubating) を用いたクラウド上での大規模地理データの処理

Kengo Seki
PRO

September 13, 2022
Tweet

Other Decks in Technology

Transcript

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

  2. 自己紹介 • SIer 所属のデータエンジニア • Apache Hadoop, Apache Spark といった、ビッグデータ関連OSSを用

    いたシステムの開発や研究開発に従事しています • Apache Software Foundation 傘下の、いくつかのビッグデータ関連 OSSプロジェクトでコミッタを務めています • 本日は、私が最近開発に参加している Apache Sedona という OSS を ご紹介させていただきます
  3. 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/
  4. 地理データの用途 • ランドマークの検索や推薦 • ランドマークへのナビゲーション、混雑具合の可視化 • 配車、配送 • マーケティング、整備計画 •

    etc. Sedonaはこういった処理を容易に実装できるよう、以下のような 機能を提供(後述) • Spatial Partitioning & Join • Spatial Index • Spatial data types & functions
  5. Apache Spark, Apache Flink • Apache Software Foundation 傘下で開発されている, OSS

    の並列分散 処理エンジン • 1台のマシンのメモリに収まりきらないデータや、1台では時間が かかりすぎる処理に対して、複数台のマシンのメモリ上にデータ を分割して持ち、それらのマシンに処理を分散して実行すること が可能 • AWS, Azure, GCP といった代表的なクラウド上でも、これらを基盤 とするマネージドサービスが複数提供されている
  6. 題材とするタスク: 近隣に存在するランドマークやユーザの検索 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と、その緯度経度
  7. 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 は 実用的でない 無理に実行しても、大容量データの転送や、 メモリに乗り切らないデータをディスクとの 間で出し入れすることにより、処理が大幅に 遅くなる
  8. ジオコーディングを用いた解決策 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
  9. ... ... ... 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 (長時間化) … …
  10. 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
  11. Sedonaが提供する機能②: Spatial Index • 四分木やkd木で分割したパーティションに対して、各ノード上 に自身が担当する範囲のローカルなインデックスを作成できる • インデックス作成のオーバーヘッドはあるが、繰り返し同じ データを参照する場合に効果を発揮 ・バージョン1.2.1時点では

    四分木とR木をサポート
  12. 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 が提供するデータ型・関数を登録
  13. クラウドサービスでの活用 • Sedona は Spark や Flink の拡張ライブラリなので、Amazon EMR や

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

    や Amazon MSK (Managed Streaming for Apache Kafka) に投入されたストリームデータを, Flink を使ってリアルタイムに加工・ 分析できるサービス • https://aws.amazon.com/jp/kinesis/data-analytics/
  15. Kinesis Data Analytics では、実現したい処理を Flink アプリケーションとして開発し、その jar ファイルを S3 上に配置する

  16. アップロードする 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/ を参照。
  17. • Flink をベースとした, Amazon Kinesis Data Stream や Amazon MSK

    (Managed Streaming for Apache Kafka) に対して アプリケーションの先頭で Sedona のデータ型や関数を登録する。 詳細な説明は https://sedona.apache.org/tutorial/flink/sql/ を参照。 Sedona が提供するデータ型や 関数を使って処理を記述
  18. 活用例: Azure Synapse Analytics • https://azure.microsoft.com/ja-jp/services/synapse-analytics/ • データレイク, DWH, BIツール,

    Notebook などの機能が統合 されたサービスで, Spark を使った分析が可能
  19. Synapse Studio を起動し, workspace に以下のページで 配布されている Sedona の jar ファイルを登録する。

    https://sedona.apache.org/download/
  20. Spark Pool の設定から, workspace に登録した jar ファイルをパッケージとして追加

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

  22. 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
  23. まとめ • Apache Sedona は, Spark や Flink といった並列分散処理エンジンで 大規模地理データを扱うための

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