このガイドでは、コード変更の提出前に必要なことなど、Apache Sparkへの様々な種類の貢献を行うための最善の方法について説明します。
Sparkへの貢献は、コードを書くだけではありません。メーリングリストで新米ユーザーを支援したり、リリースをテストしたり、ドキュメントを改善したりすることも歓迎されます。実際、大幅なコード変更を提案するには、まず他の方法でコミュニティに貢献して経験と信頼を築くことが必要となる場合が多いです。このガイドは、効果的な貢献者になるためのものでもあります。
そのため、このガイドでは、長期的に関与したいと考えている新規貢献者が考慮すべき順序で貢献を整理しています。単にプルリクエストを開くだけでなく、他者を支援する実績を積み重ねましょう。
Sparkに貢献する素晴らしい方法は、user@spark.apache.orgメーリングリストまたはStackOverflowでユーザーの質問に答えることです。Sparkの新米ユーザーは常に多くいます。質問に答えるために数分を費やすことは、非常に価値のあるコミュニティサービスです。
貢献者は、このメーリングリストを購読し、Sparkの動向を把握しておく必要があります。質問に答えることは、コミュニティを支援するための優れた、そして目に見える方法であり、あなたの専門知識を示すことにもなります。
メーリングリストやStackOverflowのようなフォーラムでの効果的な議論への参加方法については、メーリングリストガイドを参照してください。
Sparkのリリースプロセスはコミュニティ主導であり、コミュニティのメンバーはdev@spark.apache.orgメーリングリストで新しいリリースに投票することができます。Sparkユーザーは、アナウンスを受け取り、新しいリリースでワークロードをテストし、新しいリリースで見つかったパフォーマンスまたは正確性の問題についてフィードバックを提供するために、このメーリングリストを購読することが推奨されます。
Sparkのソースコードへの変更は、GitHubのプルリクエスト(後述)を通じて提案、レビュー、コミットされます。誰でもここでアクティブな変更を表示してコメントすることができます。他の人の変更をレビューすることは、変更プロセスがどのように機能するかを学び、コードの様々な部分の活動に触れる良い方法です。タイポや小さなスタイル上の問題であっても、変更をレビューし、質問をしたり、問題点を指摘したりすることで貢献できます。また、オープンなPRを表示およびフィルタリングする便利な方法として、https://spark-prs.appspot.com/も参照してください。
リリースドキュメント(https://spark.dokyumento.jp/docs/の下に表示されるドキュメント)への変更を提案するには、Sparkのdocs/ディレクトリにあるMarkdownソースファイルを編集します。このディレクトリのREADMEファイルには、ローカルでドキュメントをビルドして変更をテストする方法が示されています。ドキュメント変更の提案プロセスは、後述するコード変更の提案プロセスと同じです。
それ以外のドキュメント(https://spark.dokyumento.jp/docs/の下に表示されないドキュメント)への変更を提案するには、同様に、spark-websiteリポジトリのMarkdownを編集し、プルリクエストを開いてください。
JavaやScalaのアプリケーションが、JavaやScala自体には含まれていない膨大な数のライブラリやユーティリティにアクセスできるのと同様に、Sparkは豊富なライブラリエコシステムをサポートすることを目指しています。多くの新しい有用なユーティリティや機能は、コアSpark内ではなく、外部に存在するべきです。例えば、言語サポートはコアSparkの一部である必要がありますが、有用な機械学習アルゴリズムはMLlibの外部に存在することができます。
そのために、大規模で独立した新機能は、Spark自体への取り込みが拒否されることが多いですが、個別のプロジェクトおよびリポジトリとしてホストされ、spark-packages.orgコレクションに含まれることができますし、そうされるべきです。
理想的には、バグレポートにはバグを修正するためのコード変更の提案が伴います。バグを発見した人がそれを修正する経験を持っていない場合もあるため、これは常に可能とは限りません。JIRAを作成することでバグを報告できますが、プルリクエストを作成する必要はありません(下記参照)。
ただし、バグレポートは、バグを理解し、分離し、理想的には再現するために十分な情報が含まれていないと有用ではありません。単にエラーに遭遇したからといって、バグを報告すべきではありません。下記のように、まずJIRAを検索し、Sparkのユーザー/開発者メーリングリストで検索して問い合わせてください。再現できないバグや単純なエラーレポートは閉じられる場合があります。
バグレポートに、バグがどのように導入されたか、どのコミットによって導入されたかについての説明があると非常に役立ちます。これにより、レビュアーはバグを容易に理解できます。また、プルリクエストがマージされた際に、バグ修正をどの程度バックポートすべきかをコミッターが判断するのに役立ちます。バグを修正するプルリクエストは、問題を根本原因に絞り込む必要があります。
パフォーマンスの低下も一種のバグです。パフォーマンスの低下を修正するプルリクエストには、問題が実際に修正されたことを証明するベンチマークを提供する必要があります。
データ正確性/データ損失のバグは非常に深刻であることに注意してください。対応するバグレポートJIRAチケットにcorrectnessまたはdata-lossというラベルが付いていることを確認してください。バグレポートが十分な注目を集めない場合は、dev@spark.apache.orgにメールを送信して、より多くの注目を集めてください。
新機能の提案も可能です。これらは通常、設計ドキュメントやコード変更などの詳細が伴わない限り役立ちません。大規模な新規貢献は、まずspark-packages.orgを検討するか(上記参照)、まずメーリングリストで議論してください。機能リクエストは拒否されたり、長期間アクティブでない場合に閉じられたりする可能性があります。
Apache Spark JIRAに寄せられる問題の sheer volume を考えると、一部の問題は重複していたり、時代遅れになったり、最終的に他の方法で修正されたり、再現できなかったり、詳細が不足していたりすることは避けられません。これらの問題を特定し、議論を進めたり、JIRAを解決したりすることで貢献することは有益です。ほとんどの貢献者は、JIRAを直接解決できます。問題が解決されたと確信があるかどうかを判断する際には、判断力を使用してください。ただし、変更は簡単に元に戻すことができます。疑わしい場合は、JIRAにコメントを残すだけで十分です。
JIRAを解決する際には、いくつかの便利な規約に従ってください。
Sparkは非常に活発なプロジェクトであり、平均して数時間ごとに新しいJIRAやプルリクエストがあります。レビューにはコミッターの数時間または数日かかる場合があります。貢献者が有用で、明確で、評価しやすく、基本的なチェックにすでに合格する変更に集中すれば、誰もが恩恵を受けます。
時には、貢献者がすでに特定の新しい変更やバグを念頭に置いている場合があります。アイデアを探している場合は、JIRAのスタータータスクリストを参照するか、user@spark.apache.orgメーリングリストに問い合わせてください。
続行する前に、貢献者は提案された変更が関連性があり、新しく、実行可能である可能性が高いかどうかを評価する必要があります。
user@spark.apache.orgに、可能性のある変更についてメールしてください。user@spark.apache.orgおよびdev@spark.apache.orgメーリングリストのアーカイブで関連する議論を検索してください。多くの場合、問題は以前に議論されており、コード変更を必要としない解決策が見つかったり、どのような種類の変更が解決策として受け入れられないかが記録されている場合があります。spark [検索語]と入力します。論理的に類似した問題がすでに存在する場合は、新しいものを作成する代わりに、既存のJIRAとプルリクエストでの議論に貢献してください。Sparkのコア、またはSQLやCatalystのような非常に複雑で重要なモジュールへの変更は、正しく行うのが難しいことを再強調する価値があります。それらはより多くの精査を受け、他の変更よりも高いレビュー基準で判断されます。
アルゴリズムの豊富なセットはMLLibにとって重要な目標ですが、プロジェクトをスケーリングするには、保守性、一貫性、コード品質が最優先されます。新しいアルゴリズムは次の条件を満たす必要があります。
@Sinceアノテーションが付いていること。Sparkでスローされる例外は、標準化され、実行可能なエラーメッセージに関連付けられるべきです。
エラーメッセージは、以下の質問に答えるべきです。
エラーメッセージを作成する際は、以下の点に留意してください。
詳細については、エラーメッセージガイドラインを参照してください。
動作の変更とは、パブリックAPIを介した新しいリリースにおける、ユーザーから見える機能的な変更のことです。「ユーザー」とは、クエリやSparkプラグインを開発するだけでなく、Sparkクラスターをデプロイおよび/または管理する人も指します。新機能やバグ修正(クエリ結果やスキーマの修正、以前は誤った結果を返していたサポートされていないクエリのエラー化など)は、動作の変更と見なされます。ただし、パフォーマンスの改善、コードのリファクタリング、未リリースAPI/機能の変更は該当しません。
誰もが間違いを犯します。Spark開発者も例外ではありません。発生した欠陥は引き続き修正します。しかし、これらの動作の変更を伝えることは、Sparkユーザーがバージョンアップに備えられるようにするために重要です。PRが動作の変更を導入する場合、PRの説明に明記する必要があります。動作の変更により追加のユーザーアクションが必要になる場合、これは移行ガイド(SQLコンポーネントのdocs/sql-migration-guide.mdおよび他のコンポーネントの類似ファイル)で強調されるべきです。可能な場合は、以前の動作を復元するオプションを提供し、これらのオプションをエラーメッセージに記載してください。例をいくつか示します。
このリストは網羅的なものではありません。PRをレビューする人は、変更がリスクが高く、アップグレード中にユーザーを混乱させる可能性があると判断した場合、PR作成者に移行ガイドへの追加を依頼できます。
コードの貢献方法を検討する前に、コードがどのようにレビューされ、なぜ変更が却下される可能性があるかを理解することが役立ちます。Googleのエンジニアリングプラクティスドキュメントにあるコードレビュー担当者向けの詳細ガイドを参照してください。簡単に言えば、多くの大きなプラス点があり、マイナス効果やリスクが少ない変更は、マージされ、迅速にマージされる可能性がはるかに高くなります。リスクが高く価値の低い変更は、レビューの繰り返しを受けるのではなく、却下される可能性が非常に高いです。
コード変更を提案する前に、前のセクションを確認してください。このセクションでは、その方法について説明します。
コードを貢献する際、あなたは貢献があなたのオリジナル作品であり、プロジェクトのオープンソースライセンスの下でその作品をプロジェクトにライセンスすることを認めます。明示的に述べているかどうかにかかわらず、プルリクエスト、メール、またはその他の手段を通じて著作権で保護された資料を提出することにより、その資料をプロジェクトのオープンソースライセンスの下でライセンスすることに同意し、そうする法的権限があることを保証します。
最新の開発コードに興味がある場合、またはApache Sparkの開発に貢献したい場合は、Gitからmasterブランチをチェックアウトできます。
# Master development branch
git clone git://github.com/apache/spark.git
Sparkをダウンロードしたら、ドキュメントページでインストールおよびビルドの手順を確認できます。
一般的に、SparkはJIRAを使用してバグや改善を含む論理的な問題を追跡し、GitHubプルリクエストを使用して特定のコード変更のレビューとマージを管理します。つまり、JIRAは何を修正または変更すべきか、および高レベルのアプローチを記述するために使用され、プルリクエストはプロジェクトのソースコードでどのようにその変更を実装するかを記述します。たとえば、主要な設計上の決定はJIRAで議論されます。
Foo scaladocのタイポを修正correctness:正確性に関する問題data-loss:データ損失の問題release-notes:変更の影響をリリースノートで言及する必要がある。JIRAまたはプルリクエストには、リリースノートに含めるのに適した詳細を含める必要があります。「Docs Text」を参照してください。starter:新規貢献者向けの小さくて簡単な変更。dev@spark.apache.orgで問題について議論することを検討してください。Apache Sparkでプルリクエストを作成する前に、ブランチでテストがパスするかどうかを確認することが重要です。GitHub Actionsのワークフローがプルリクエスト/後続のコミットのテストを自動的に実行し、Apache SparkリポジトリのGitHub Actionsの限られたリソースに毎回負荷がかかるためです。以下の手順でプロセスを案内します。
test("SPARK-12345: a short description of the test") {
...
@Test
public void testCase() {
// SPARK-12345: a short description of the test
...
def test_case(self):
# SPARK-12345: a short description of the test
...
test_that("SPARK-12345: a short description of the test", {
...
./dev/run-testsで全てのテストを実行してください。スタイルチェックに失敗した場合は、後述のコードスタイルガイドを参照してください。apache/sparkのmasterブランチを対象とします(特別な場合を除き、他のブランチを対象とするPRは開かれません)。これにより、「On pull request*」(Sparkリポジトリ内)のワークフローがトリガーされ、「あなたの」Forkしたリポジトリでの成功したワークフロー実行が検索/監視されます(実行中の場合は待機します)。[SPARK-xxxx][COMPONENT] Titleの形式にする必要があります。ここで、SPARK-xxxxは関連するJIRA番号、COMPONENTはspark-prs.appspot.comで表示されるPRカテゴリのいずれか、TitleはJIRAのタイトル、またはPR自体を説明するより具体的なタイトルになります。[WIP]を追加してください。@usernameを追加して、すぐに ping することができます。git remote add upstream https://github.com/apache/spark.gitでupstream変更を追跡するためのリモートを追加し、git fetch upstreamを実行し、その後git rebase upstream/masterを実行して手動で競合を解決し、その結果をブランチにプッシュすることで解決できます。master以外のブランチに対してプルリクエストを開くように求められた場合、実際にはプルリクエストを手動で閉じる必要があることに注意してください。既存のコードベースのスタイルに従ってください。
何かの適切なスタイルがわからない場合は、既存のコードベースのスタイルに従うようにしてください。コード内に、あなたの機能を使用している他の例があるかどうかを確認してください。また、dev@spark.apache.orgリストで気軽に質問したり、コミッターに尋ねたりしてください。
Apache Sparkプロジェクトは、Apache Software Foundation行動規範に従います。行動規範は、IRC、すべての公開および非公開メーリングリスト、課題追跡システム、Wiki、ブログ、Twitter、およびコミュニティが使用するその他のコミュニケーションチャネルを含む、Apache Software Foundationによって管理されるすべてのスペースに適用されます。対面イベント(カンファレンスなど)に特化した行動規範は、公開されているASFのハラスメント防止ポリシーに成文化されています。
この行動規範は、Apacheコミュニティに正式または非正式に参加するすべての人、または財団に関連する活動において、特にASFを代表する際に、財団への所属を主張するすべての人によって尊重されることを期待します。
このコードは網羅的または完全ではありません。これは、共同作業、共有環境、および目標についての共通の理解を簡潔にまとめたものです。私たち全員と私たちが参加する技術コミュニティを豊かにするために、文字通りだけでなく精神的にも従われることを期待します。
詳細および具体的なガイドラインについては、Apache Software Foundation行動規範を参照してください。