© 2020, Amazon Web Services, Inc. or its Affiliates.
Noritaka Sekiyama
Big Data Architect, AWS Glue & Lake Formation
2020/7/31
Spark にプルリクを投げてみた
© 2020, Amazon Web Services, Inc. or its Affiliates.
自己紹介
関山 宜孝
Big Data Architect
AWS Glue & Lake Formation
• GlueとLake Formationの
ユーザーに近い部分の開発を担当
• 5年間 AWS サポートにて技術支援を担当
• 2019年からプロダクト開発チームにジョイン
@moomindani moomindaniNoritakaS-AWS
Forum
© 2020, Amazon Web Services, Inc. or its Affiliates.
AWS x Apache Spark
AWS Glue = サーバーレス Apache Spark 実行環境
• Glue Spark Job x Spark DataFrame, Spark SQL
• Glue Streaming Job x Spark Structured Streaming
Amazon EC2 Amazon EMR AWS Glue
© 2020, Amazon Web Services, Inc. or its Affiliates.
Spark にプルリクを投げようと思ったきっかけ
• きっかけ
• AWS のお客様からの問い合わせ
• AWS のプロダクト開発時の問題解決
• サポートチーム時代
• 日々たくさんの異常系を目にする
• OSS の実運用上の問題やフィードバックをよく知っている
• 不具合を修正したり、トラブルシューティングをやりやすくす
るためのモチベーションが強い
• プロダクトチーム時代
• プロダクトが Apache Spark に Deep に依存している
• Apache Spar kへの貢献がプロダクト改善にもつながる
© 2020, Amazon Web Services, Inc. or its Affiliates.
現在進めているプルリク / Issue
• SPARK-21514: Added a new option to use non-blobstore
storage when writing into blobstore storage
https://github.com/apache/spark/pull/27690
• SPARK-32013: Support query execution before reading
DataFrame and before/after writing DataFrame over JDBC
https://github.com/apache/spark/pull/28953/
• SPARK-32432: Add support for reading ORC/Parquet files with
SymlinkTextInputFormat
https://issues.apache.org/jira/browse/SPARK-32432
© 2020, Amazon Web Services, Inc. or its Affiliates.
SPARK-21514: Amazon S3 等の Blobstore 向けの最適化
• Spark でテーブルにデータを書き込むとき、一時ファイルをつくって
最後に Rename する。
• S3 上のテーブルに対しても S3 に一時ファイルをつくる。
• HDFS の Rename: メタデータのみの操作
• S3 の Rename: N 回のデータコピーおよび元データの削除
© 2020, Amazon Web Services, Inc. or its Affiliates.
SPARK-21514: Amazon S3 等の Blobstore 向けの最適化
• このパッチは一時ファイルを HDFS に、結果ファイルを S3 に出力す
るようにする。
• 新オプションを追加:
• spark.sql.hive.supportedSchemesToUseNonBlobstore=s3,s3a,s3n
• (効果は未検証であるものの)同様の性質をもつ他の DFS でも使用可能
• 期待される効果
• パフォーマンスの向上
• S3 API のコストの削減
• S3 結果整合性の影響の低減
© 2020, Amazon Web Services, Inc. or its Affiliates.
SPARK-32013: JDBC データソースの read/write の便利機能
• Spark を ETL に使いたい場合、DataFrame の read/write の前後に
JDBC 接続先データソースに任意のクエリを実行したいときがある。
• レコードの追加/更新/削除
• View の作成
• Stored Procedure の実行など
• このパッチは DataFrame の read 前、write 前後に任意のクエリを
実行できるようにする。
• パラメータを追加: preActions, postActions
© 2020, Amazon Web Services, Inc. or its Affiliates.
SPARK-32013: JDBC データソースの read/write の便利機能
val preSQL = "drop view if exists PEOPLEVIEW; " +
"create view PEOPLEVIEW as select * from PEOPLE where name='mary’”
val df = spark.read.format("jdbc")
.option("url",
"jdbc:h2:mem:testdb0;user=testUser;password=testPass")
.option("dbtable", "PEOPLEVIEW")
.option("preActions", preSQL)
.load()
df.show()
© 2020, Amazon Web Services, Inc. or its Affiliates.
SPARK-32013: JDBC データソースの read/write の便利機能
val postSQL = "insert into TEST.CUSTOMQUERY values ('fred', 1)”
df.write.format("jdbc")
.option("Url", "jdbc:h2:mem:testdb3")
.option("dbtable", "TEST.CUSTOMQUERY")
.option("postActions", postSQL)
.options(properties.asScala)
.save()
© 2020, Amazon Web Services, Inc. or its Affiliates.
SPARK-32432: ORC/Parquet の symlink.txt 対応
• SymlinkTextInputFormat (symlink.txt manifest) は複数の分析エ
ンジンで使用できる共通フォーマット
• Spark では、テキストファイル (JSON, CSV, etc.) では動作す
る一方、ORC/Parquet では動作しない。
• prestodb/prestosql ではいずれも動作する。
• Amazon Athena や S3 Inventory でも使われている。
• このパッチは ORC/Parquet でも SymlinkTextInputFormat を使用
できるようにする。
© 2020, Amazon Web Services, Inc. or its Affiliates.
SPARK-32432: ORC/Parquet の symlink.txt 対応
hdfs://path_to_warehouse/symlink_table/dt=20200731/symlink.txt
CREATE TABLE symlink_table(
a BIGINT,
b BIGINT,
c BIGINT
)
PARTITIONED BY (dt STRING)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
hdfs://path_to_parquet_data/data1.parquet
hdfs://path_to_parquet_data/data2.parquet
hdfs://path_to_parquet_data/data3.parquet
© 2020, Amazon Web Services, Inc. or its Affiliates.
プルリクを送ってみて
• よかったこと
• Apache Spark のコードベースの知識が深まった
• Apache Spark の開発プロセスの理解が深まった
• Spark コミュニティは優しい
• 反省
• ファイルの diff はもっと注意深くチェックするべきだった
• Newer is better
• 感想
• 当初思ったほどハードルは高くなかった
• 広く使われるソフトウェアに直接的に関わるのは楽しい
© 2020, Amazon Web Services, Inc. or its Affiliates.
Spark に
ソースコードがマージされるまで
© 2020, Amazon Web Services, Inc. or its Affiliates.
Spark にソースコードがマージされるまでのステップ
1. アイデアを見つける
2. 実装・テストする
3. プルリクを送る
4. コードレビューを受けて修正する
5. マージされる
© 2020, Amazon Web Services, Inc. or its Affiliates.
1. アイデアを見つける
• トラブルシューティングしてたら不具合を見つけた
• やりたいことを実現する機能/ドキュメントがなかった
• 現在の制限がブロッカーになった
• Spark JIRA から興味のある Issue を見つけた
© 2020, Amazon Web Services, Inc. or its Affiliates.
2. 実装・テストする
• リポジトリをフォーク
• フォークしたリポジトリをクローン
• パッチ用のブランチを作成
$ git clone git@github.com:moomindani/spark.git
$ cd spark
$ git branch SPARK-xxxxx
$ git checkout SPARK-xxxxx
© 2020, Amazon Web Services, Inc. or its Affiliates.
2. 実装・テストする
• 実装する
• Mac x IntelliJ IDEA の人が多そう
• ビルドする
• テストする
$ ./build/sbt
> project hive
> testOnly *HogeHogeSuite
$ ./build/sbt “project hive” ”testOnly *HogeHogeSuite”
© 2020, Amazon Web Services, Inc. or its Affiliates.
2. 実装・テストする
• Building Spark
https://spark.apache.org/docs/latest/building-spark.html
• Developer Tools
https://spark.apache.org/developer-tools.html
© 2020, Amazon Web Services, Inc. or its Affiliates.
3. プルリクを送る
• パッチをコミット&プッシュ
• GitHub 上でプルリクエストを作成
$ git commit –m “[SPARK-21514] Fixed xxx bug”
$ git push
© 2020, Amazon Web Services, Inc. or its Affiliates.
4. コードレビューを受けて修正する
• コードレビューを受ける
• 修正パッチをコミット&プッシュ
© 2020, Amazon Web Services, Inc. or its Affiliates.
5. マージされる
© 2020, Amazon Web Services, Inc. or its Affiliates.
参考
• Sparkコミュニティに飛び込もう!(Spark Meetup Tokyo 2015)
https://www.slideshare.net/hadoopxnttdata/apache-spark-
commnity-nttdata-sarutak

Sparkにプルリク投げてみた

  • 1.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. Noritaka Sekiyama Big Data Architect, AWS Glue & Lake Formation 2020/7/31 Spark にプルリクを投げてみた
  • 2.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. 自己紹介 関山 宜孝 Big Data Architect AWS Glue & Lake Formation • GlueとLake Formationの ユーザーに近い部分の開発を担当 • 5年間 AWS サポートにて技術支援を担当 • 2019年からプロダクト開発チームにジョイン @moomindani moomindaniNoritakaS-AWS Forum
  • 3.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. AWS x Apache Spark AWS Glue = サーバーレス Apache Spark 実行環境 • Glue Spark Job x Spark DataFrame, Spark SQL • Glue Streaming Job x Spark Structured Streaming Amazon EC2 Amazon EMR AWS Glue
  • 4.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. Spark にプルリクを投げようと思ったきっかけ • きっかけ • AWS のお客様からの問い合わせ • AWS のプロダクト開発時の問題解決 • サポートチーム時代 • 日々たくさんの異常系を目にする • OSS の実運用上の問題やフィードバックをよく知っている • 不具合を修正したり、トラブルシューティングをやりやすくす るためのモチベーションが強い • プロダクトチーム時代 • プロダクトが Apache Spark に Deep に依存している • Apache Spar kへの貢献がプロダクト改善にもつながる
  • 5.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. 現在進めているプルリク / Issue • SPARK-21514: Added a new option to use non-blobstore storage when writing into blobstore storage https://github.com/apache/spark/pull/27690 • SPARK-32013: Support query execution before reading DataFrame and before/after writing DataFrame over JDBC https://github.com/apache/spark/pull/28953/ • SPARK-32432: Add support for reading ORC/Parquet files with SymlinkTextInputFormat https://issues.apache.org/jira/browse/SPARK-32432
  • 6.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. SPARK-21514: Amazon S3 等の Blobstore 向けの最適化 • Spark でテーブルにデータを書き込むとき、一時ファイルをつくって 最後に Rename する。 • S3 上のテーブルに対しても S3 に一時ファイルをつくる。 • HDFS の Rename: メタデータのみの操作 • S3 の Rename: N 回のデータコピーおよび元データの削除
  • 7.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. SPARK-21514: Amazon S3 等の Blobstore 向けの最適化 • このパッチは一時ファイルを HDFS に、結果ファイルを S3 に出力す るようにする。 • 新オプションを追加: • spark.sql.hive.supportedSchemesToUseNonBlobstore=s3,s3a,s3n • (効果は未検証であるものの)同様の性質をもつ他の DFS でも使用可能 • 期待される効果 • パフォーマンスの向上 • S3 API のコストの削減 • S3 結果整合性の影響の低減
  • 8.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. SPARK-32013: JDBC データソースの read/write の便利機能 • Spark を ETL に使いたい場合、DataFrame の read/write の前後に JDBC 接続先データソースに任意のクエリを実行したいときがある。 • レコードの追加/更新/削除 • View の作成 • Stored Procedure の実行など • このパッチは DataFrame の read 前、write 前後に任意のクエリを 実行できるようにする。 • パラメータを追加: preActions, postActions
  • 9.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. SPARK-32013: JDBC データソースの read/write の便利機能 val preSQL = "drop view if exists PEOPLEVIEW; " + "create view PEOPLEVIEW as select * from PEOPLE where name='mary’” val df = spark.read.format("jdbc") .option("url", "jdbc:h2:mem:testdb0;user=testUser;password=testPass") .option("dbtable", "PEOPLEVIEW") .option("preActions", preSQL) .load() df.show()
  • 10.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. SPARK-32013: JDBC データソースの read/write の便利機能 val postSQL = "insert into TEST.CUSTOMQUERY values ('fred', 1)” df.write.format("jdbc") .option("Url", "jdbc:h2:mem:testdb3") .option("dbtable", "TEST.CUSTOMQUERY") .option("postActions", postSQL) .options(properties.asScala) .save()
  • 11.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. SPARK-32432: ORC/Parquet の symlink.txt 対応 • SymlinkTextInputFormat (symlink.txt manifest) は複数の分析エ ンジンで使用できる共通フォーマット • Spark では、テキストファイル (JSON, CSV, etc.) では動作す る一方、ORC/Parquet では動作しない。 • prestodb/prestosql ではいずれも動作する。 • Amazon Athena や S3 Inventory でも使われている。 • このパッチは ORC/Parquet でも SymlinkTextInputFormat を使用 できるようにする。
  • 12.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. SPARK-32432: ORC/Parquet の symlink.txt 対応 hdfs://path_to_warehouse/symlink_table/dt=20200731/symlink.txt CREATE TABLE symlink_table( a BIGINT, b BIGINT, c BIGINT ) PARTITIONED BY (dt STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' hdfs://path_to_parquet_data/data1.parquet hdfs://path_to_parquet_data/data2.parquet hdfs://path_to_parquet_data/data3.parquet
  • 13.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. プルリクを送ってみて • よかったこと • Apache Spark のコードベースの知識が深まった • Apache Spark の開発プロセスの理解が深まった • Spark コミュニティは優しい • 反省 • ファイルの diff はもっと注意深くチェックするべきだった • Newer is better • 感想 • 当初思ったほどハードルは高くなかった • 広く使われるソフトウェアに直接的に関わるのは楽しい
  • 14.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. Spark に ソースコードがマージされるまで
  • 15.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. Spark にソースコードがマージされるまでのステップ 1. アイデアを見つける 2. 実装・テストする 3. プルリクを送る 4. コードレビューを受けて修正する 5. マージされる
  • 16.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. 1. アイデアを見つける • トラブルシューティングしてたら不具合を見つけた • やりたいことを実現する機能/ドキュメントがなかった • 現在の制限がブロッカーになった • Spark JIRA から興味のある Issue を見つけた
  • 17.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. 2. 実装・テストする • リポジトリをフォーク • フォークしたリポジトリをクローン • パッチ用のブランチを作成 $ git clone git@github.com:moomindani/spark.git $ cd spark $ git branch SPARK-xxxxx $ git checkout SPARK-xxxxx
  • 18.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. 2. 実装・テストする • 実装する • Mac x IntelliJ IDEA の人が多そう • ビルドする • テストする $ ./build/sbt > project hive > testOnly *HogeHogeSuite $ ./build/sbt “project hive” ”testOnly *HogeHogeSuite”
  • 19.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. 2. 実装・テストする • Building Spark https://spark.apache.org/docs/latest/building-spark.html • Developer Tools https://spark.apache.org/developer-tools.html
  • 20.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. 3. プルリクを送る • パッチをコミット&プッシュ • GitHub 上でプルリクエストを作成 $ git commit –m “[SPARK-21514] Fixed xxx bug” $ git push
  • 21.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. 4. コードレビューを受けて修正する • コードレビューを受ける • 修正パッチをコミット&プッシュ
  • 22.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. 5. マージされる
  • 23.
    © 2020, AmazonWeb Services, Inc. or its Affiliates. 参考 • Sparkコミュニティに飛び込もう!(Spark Meetup Tokyo 2015) https://www.slideshare.net/hadoopxnttdata/apache-spark- commnity-nttdata-sarutak