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

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

Kengo Seki
September 13, 2022

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

Kengo Seki

September 13, 2022
Tweet

Other Decks in Technology

Transcript

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

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

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

    の並列分散 処理エンジン • 1台のマシンのメモリに収まりきらないデータや、1台では時間が かかりすぎる処理に対して、複数台のマシンのメモリ上にデータ を分割して持ち、それらのマシンに処理を分散して実行すること が可能 • AWS, Azure, GCP といった代表的なクラウド上でも、これらを基盤 とするマネージドサービスが複数提供されている
  5. 題材とするタスク: 近隣に存在するランドマークやユーザの検索 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と、その緯度経度
  6. 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 は 実用的でない 無理に実行しても、大容量データの転送や、 メモリに乗り切らないデータをディスクとの 間で出し入れすることにより、処理が大幅に 遅くなる
  7. ジオコーディングを用いた解決策 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
  8. ... ... ... 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 (長時間化) … …
  9. 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
  10. 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 が提供するデータ型・関数を登録
  11. クラウドサービスでの活用 • Sedona は Spark や Flink の拡張ライブラリなので、Amazon EMR や

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

    や Amazon MSK (Managed Streaming for Apache Kafka) に投入されたストリームデータを, Flink を使ってリアルタイムに加工・ 分析できるサービス • https://aws.amazon.com/jp/kinesis/data-analytics/
  13. アップロードする 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/ を参照。
  14. • Flink をベースとした, Amazon Kinesis Data Stream や Amazon MSK

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

    Notebook などの機能が統合 されたサービスで, Spark を使った分析が可能
  16. 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
  17. まとめ • Apache Sedona は, Spark や Flink といった並列分散処理エンジンで 大規模地理データを扱うための

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