Spark Meetup Tokyo #1 (Spark+AI Summit 2019) 勉強会メモ

# 概要

[Spark Meetup Tokyo #1 (Spark+AI Summit 2019)](https://spark-meetup-tokyo.connpass.com/event/131791/)

> Spark+AI Summit 2019で発表があったSparkの最新開発状況，ユーザからのユースケース報告，関連OSSであるKoalas/MLflow/Delta Lakeなどに関する情報をお伝えします．


# 発表内容

## [SPARK+AI Summitセッションハイライト](https://www.slideshare.net/nttdata-tech/spark-ai-summit-2019-report-nttdata)

[関連: Spark+AI Summit 2019参加レポート](https://medium.com/nttlabs/spark-ai-summit-2019-d08224ef507d)

### Keynote

- Databricksによる新機能の紹介
    - koalas
    - MLflow
    - Delta Lake

- Delta Lake
    - データレイクの課題
        - 安全な読み書きが難しい
            - 書き込み中のデータを使用する場合等
        - 結果を再現するのが難しい
            - 同じデータでも更新されている
        - 気軽にデータを投入できる反面、データのバリデーションが大変
        - データが肥大化と共に、メタデータも肥大化し、ボトルネックになる
    - Delta Lakeとは
        - トランザクションできるストレージソフトウェア
            - HDFSなどの分散データストアにトランザクション機能を提供する
        - Snapshot Isolation / バリデーション機能
    - テーブルの書き込みごとに、バージョン作成
        - 読み込み時にバージョンやタイムスタンプを指定することで、対応するデータが取得できる
        - 裏では、対応するparquetとスナップショットのjson(Delta Log)を作成
            - Delta Logは各スナップショットの差分とメタデータを持つ
            - 読み込み時の自動キャッシュと一定更新ごとに作成するチェックポイントにより高速読み込みが可能
    - 平衡制御
        - 書き込み中の読み込み、読み込み中の書き込みは、Snapshot Isolationで制御
        - 同時の書き込みはDeltaLogに先にアクセスしたトランザクションがコミット成功

### 個別セッションの紹介

- [Migrating to Apache Spark at Netflix](https://www.slideshare.net/databricks/migrating-to-apache-spark-at-netflix)
    - NetflixにおけるSparkの利用事例
        - S3へのジョブの大半がSparkで利用
        - 以前は、HiveやPigを使っていたが、エンジンの知識が必要なため切り替え
    - 複数バージョンを独自に社内でメンテ運用している
    - 社内の取り組み
        - cgroupsを使い、謎のエラー落ちへの対処
        - Broadcast Joinを行わずメモリエラーを避ける
        - おすすめ設定のドキュメンテーションを行って教育

- [Apache Spark at Airbnb](https://www.slideshare.net/databricks/apache-spark-at-airbnb)
    - Search RankingやSmart Pricingに活用
    - Kafkaからデータを読み出し、Sparkで処理してHBaseにデータを格納する
    - 課題と取り組み
        - 扱うログごとのサイズ偏りが発生
        - KafkaのPartition数でSparkの並列数が決まりボトルネックに
        - 自動でPartitionを制御するBlanced Kafka Reader for Sparkでスループット向上
            - OSSとして公開予定

- [Introducing .NET Bindings ffor Apache Spark](https://de.slideshare.net/databricks/introducing-net-bindings-for-apache-spark)
    - ビッグデータソリューションは.NETをサポートしてないことが多い
    - 一方、ビジネス上.NETでの実装は多い
    - Scala APIの移植ではない.NET実装の開発

- [Modular Apache Spark: Transform Your Code in Pieces](https://www.slideshare.net/databricks/modular-apache-spark-transform-your-code-in-pieces-with-albert-franzi)
    - Sparkコードあるある
        - initialize Spark
        - read path
        - execute logic
        - write the result
        - etc.
    - 似たようなコードが多くなるが、綺麗にコードをかかれずメソッドが肥大化するケース
    - コードを書くたびにテストを回すと時間がかかる
    - デファクトスタンダードなフレームワークが存在しない
    - Spark Applicationをモジュールごとに分けて実装する
        - モジュールごとに書いているので独立にテストできる
        - テストは、spark-testing-baseを使う


## [Nested Columnsの10x性能改善](https://www.slideshare.net/techblogyahoo/sparkai-summit-2019apache-spark-24nested-columns10x)

- 紹介する発表
    - [Making Nested Columns as First Citizen in Apache Spark SQL](https://www.slideshare.net/databricks/making-nested-columns-as-first-citizen-in-apache-spark-sql)

- Apple Siriチーム
    - データをNested構造で保存
    - top5カラムの下に、2000のネストフィールド
    - spark2.3から2.4でパフォーマンス向上

- Nested column
    - 1カラムに構造体(Struct, Array)を埋め込んでいる場合、不要なサブカラムを読み込んでしまう
        - 列志向のメリットを活かせない
    - 不要なサブカラムをPruningする
        - "spark.sql.optimizzer.nestedSchemaPruning.enabled" = true
        - Spark2.4以上のparquetに対応
            - 3.0以上でORCにも対応
    - column pruning
        - Nested columnのAliasを作成する
    - schema purining
        - プランニングの結果を踏まえて、DataSchemaを書き換える


## [MLflow + Kubeflow MLプラットフォーム事例](https://www.slideshare.net/techblogyahoo/mlflow-kubeflow-ml-sparktokyo)

- 紹介する発表
    - [Utilizing MLFlow and Kubenetes to build an Enterprise ML Platform](https://www.slideshare.net/databricks/how-to-utilize-mlflow-and-kubernetes-to-build-an-enterprise-ml-platform)

- 課題
    - デプロイのコード修正を不要にしたい
    - モデルの学習や評価を簡単にしたい
    - モデル作成者が簡単にデプロイしたい

- アーキテクチャ
    - Spark
        - 前処理、特徴量作成、学習
    - MLFlow
        - モデル管理、トラッキング
    - Kubeflow
        - パッケージ、モデルサービング

- 開発フロー
    - databricksでコードを作成
    - GitHubにコードを同期する
    - GitからyamlをAcgoCDへyamlを送る
    - ArgoCDからdockerhubへimage
    - ArgoCDからKuberflowへデプロイ


## [Spark In-Memoryの発表と関連セッションの紹介](https://www.slideshare.net/ishizaki/sparktokyo2019)

- 紹介する発表
    - [In-Memory Storage Evolution in Apache Spark](https://www.slideshare.net/ishizaki/in-memory-evolution-in-apache-spark)

- In-memory storageの変化
    - 初期はRDD
    - DataFrame
    - Apache Arrowのサポート

- Apache Arrow
    - pandas udf with arrowの対応(spark2.3)
        - Arrowを介することで、serialization/deserializationの削減
    - 他ソフト・ハードとの統合
        - Pytorch/TensorflowなどのDL/MLフレームワーク
        - GPUやFPGなどのハードウェア

## [Koalas: Unifying Spark and pandas APIs](https://www.slideshare.net/ueshin/koalas-unifying-spark-and-pandas-apis)

- pandasとSparkのDataFrame
    - pandasはmutable / sparkはimmutable
    - Add Column/Rename column/value countなどのやり方が違う

- Koalas
    - 純粋なpythonライブラリ
    - pandasAPIでsparkを動かす
    - 毎週リリースしてる！
    - 現在DataFrameやSeriesのおおよそ30%↑のAPIをカバーしている

- pandasとの違い
    - 遅延評価で動く
    - 分散処理なので、レコードの並びが担保されない

- 今後のリリース予定
    - cacheの実装
    - plotting
    - index周りの対応
    - 列の文字列・日時データの操作
    - etc.


## [MLflowによる機械学習モデルのライフサイクルの管理](https://www.slideshare.net/maropu0804/mlflow)

- 紹介する発表
    - [Accelerating Machine Learning Development with MLflow](https://folk.idi.ntnu.no/odderik/RAI-2019/presentations/mlflow.pdf)

- 機械学習のサイクル
    - 前処理、モデル学習、デプロイのサイクルを繰り返す
    - 実行環境やライブラリが人によってさまざま

- MLflow
    - 機械学習の再現性や再利用性の向上
    - 機能
        - MLflow Tracking
            - 追跡性と再現性を高めるロギングフレームワーク
        - MLflow Projects
            - 再利用性を高める実行環境のパッケージング
        - MLflow Models
            - 共通フォーマットによるデプロイ支援

    - MLflow自身は、既存のライブラリを補う形でフローの支援を行う

- MLflow Traching
    - ログ記録のAPI
    - ログの確認・比較をするViewの提供

- MLflow Projets
    - パッケージフォーマットの提供
        - condaやdockerを使ったスクリプトの依存関係を解決
    - `mlflow run <project path>`

- MLflow Models
    - 利用するライブラリを共通フォーマットでデプロイ