предисловие
После того, как я изменил его N раз и общался с большими парнями в сообществе открытого исходного кода Apache Spark в течение 2 недель, мой запрос на слияние наконец был принят! ! !
Заинтересованные друзья могут посетить ссылку ниже, чтобы испытать очарование сообщества открытого исходного кода.Большие ребята действительно полны энтузиазма и дали мне много ценных мнений о моем PR!
[SPARK-35907][CORE] Вместо File#mkdirs ожидается Files#createDirectories.
текст
Ниже приводится краткое изложение процесса отправки PR и принятия.Если вы заинтересованы в сообществе открытого исходного кода и хотите стать участником Apache Spark, чтение следующих статей поможет вам избежать многих окольных путей~
Самые основные требования для того, чтобы стать участником Apache Spark:
- Относительно солидные навыки программирования на Java и Scala (не понимаете Scala, особенно использование расширенного синтаксиса, вы в основном не понимаете исходный код Apache Spark, кривая обучения Scala относительно крутая, невозможно изучить Scala без Java, исходный код Apache Spark также частично написан на Java)
- OK уровень английского языка (мой английский не очень хорош, но я могу, по крайней мере, посмотреть, хорош ли английский, переведенный Google~( ̄▽ ̄~)(~ ̄▽ ̄)~ Это также очень важно, потому что многие ==Comment ==Вы должны написать это сами, по крайней мере, вы должны убедиться, что с аннотацией не будет проблем, и над ней не будут смеяться иностранцы)
- Вы знакомы с Apache Spark и хорошо знаете некоторые основные концепции Apache Spark (например, Worker, упомянутый ниже, что вам нужно знать? Что он делает?)
- Учетная запись github и учетная запись JIRA плюс хорошая сеть (плевать, семейный доступ к github слишком жалкий, часто не доступен)
Ниже приведен состав языка программирования Apache Spark:
fork
После форка в собственный репозиторий github не забудьте клонировать его в локальный для разработки.
Github Actions
Для тестирования необходимо включить рабочий процесс GitHub Actions.
Таким образом, после каждого git push Github начнет автоматически тестировать отправленный вами код, который также должен быть включен в соответствии с правилами сообщества.
Apache Spark использует GitHub Actions для непрерывной интеграции и расширенной автоматизации.
Вот встречный пример:
Я не открывал GitHub Actions при первой отправке PR, и результатом была ошибка
Workflow run detection failed
Unable to detect the workflow run for testing the changes in your PR.
подготовка кода
Во-первых,Самое главное — найти, где код можно модифицировать.
Позвольте мне рассказать вам, как я нашел, где изменить код Apache Spark
Я читал исходный код Apache Spark раньше, когда я читал код для запуска рабочего (это код, принадлежащий Spark Core)
/**
* Create a directory given the abstract pathname
* @return true, if the directory is successfully created; otherwise, return false.
*/
def createDirectory(dir: File): Boolean = {
try {
// This sporadically fails - not sure why ... !dir.exists() && !dir.mkdirs()
// So attempting to create and then check if directory was created or not.
dir.mkdirs()
if ( !dir.exists() || !dir.isDirectory) {
logError(s"Failed to create directory " + dir)
}
dir.isDirectory
} catch {
case e: Exception =>
logError(s"Failed to create directory " + dir, e)
false
}
}
Фрагмент кода из класса org.apache.spark.util.Utils
Когда рабочий процесс запускается, он вызывает указанный выше метод класса инструментов для создания рабочего каталога.
Я заметил эту фразу в комментариях
This sporadically fails - not sure why ...
я думаюApache Spark как лучший проект с открытым исходным кодом, такие неточные слова не должны появляться в исходном коде,
File.mkdirs() Этот метод должен быть знаком всем Java-программистам, он используется для создания каталогов, даже если родительский каталог не существует.
Этот метод может не создать и вернет false в случае сбоя создания (хотя родительский каталог мог быть создан в это время). Причины сбоя:
- Проблемы с разрешениями (самая распространенная)
- Исключение ввода-вывода (это связано с ОС)
- Файл уже существует
По моему первоначальному замыслу, когда я впервые отправлял PR, я просто хотел изменить комментарии (я следил заКомментарии -> оптимизировать код -> исправить ошибки -> разработать требованияЭто путь, который также является путем развития большинства новых участников)
Я собирался добавить вышеуказанные причины сбоя в исходный код для отправки на английском языке, но в это время я вспомнил, что в JDK7 был добавлен новый инструментальный класс java.nio.file.Files, который имеет метод Files.createDirectories( )
Раньше, когда писал IO tools, специально изучал его ⊙▽⊙
Этот метод является полной заменой File.mkdirs().
Затем я внимательно изучил исходный код Files.createDirectories(), я обнаружил, что этот метод == имеет больше преимуществ в обработке исключений, чем File.mkdirs() ==, File.mkdirs() не удалось создать только Return false, даже если возникает исключение, будет выброшено только SecurityException. Механизм обработки исключений Files.createDirectories() более дружественный: SecurityException выдается при проблемах с правами доступа, IOException выдается при проблемах операционной системы, а FileAlreadyExistsException выбрасывается, когда файл уже существует (это также подкласс IOException).
Можно сказать, что механизм обработки исключений Files.createDirectories() взорвал File.mkdirs(), как это происходит, не знаю, почему для Files.createDirectories() вообще не существует, это будет четко указано в выброшенном исключении Узнать что послужило причиной провала творения.
Я понял, что это хороший момент для изменения, и затем я просмотрел исходный код Apache Spark, который содержал немало файлов File.mkdirs().
Поэтому я решил отправить PR, код выглядит следующим образом
/**
* Create a directory given the abstract pathname
* @return true, if the directory is successfully created; otherwise, return false.
*/
def createDirectory(dir: File): Boolean = {
try {
// SPARK-35907: The check was required by File.mkdirs() because it could sporadically
// fail silently. After switching to Files.createDirectories(), ideally, there should
// no longer be silent fails. But the check is kept for the safety concern. We can
// remove the check when we're sure that Files.createDirectories() would never fail silently.
Files.createDirectories(dir.toPath)
if ( !dir.exists() || !dir.isDirectory) {
logError(s"Failed to create directory " + dir)
}
dir.isDirectory
} catch {
case e: Exception =>
logError(s"Failed to create directory " + dir, e)
false
}
}
Это финальная версия после общения с лидерами сообщества, выбрана только часть, соответствующая приведенному выше коду для всеобщего понимания.
push
Обратите внимание, успешно ли запускается тестовый пример в GitHub Actions после нажатия (я несколько раз сталкивался с тем, что тестовый пример не запускался, и необходимо повторить попытку)
JIRA
Не забудьте зарегистрировать проблему в JIRA Apache Spark, прежде чем отправлять PR на github.
URL-адрес доступа JIRA для Apache Spark
Формат представления может относиться к моей проблеме:
SPARK-35907 Instead of File#mkdirs, Files#createDirectories is expected
Отправить PR
Обратите внимание, что вам нужно переключиться на ветку кода, которую вы отправили здесь, лучше всего использовать номер задачи в JIRA.
Требования к формату PR
Следующий формат будет автоматически отображаться в поле ввода после отправки PR, что служит объяснением
[SPARK-xxxxx 即上面关联的 JIRA 的 issue][涉及到的模块比如 CORE ] 标题
### What changes were proposed in this pull request?
这次 PR 中期望带来哪些改变?就是说明一下哪些地方的代码改动了。
### Why are the changes needed?
为什么需要这些改变?第一次提交 PR 的最好想一个比较好的理由可以说服 commiter 把你的代码合入 master。
### Does this PR introduce _any_ user-facing change?
这次 PR 是否有面向用户层面的改动?注意是任何面向用户层面的改动都得写 Yes,并且要写出哪些改动是面向用户的。
### How was this patch tested?
这个 patch 是怎样测试的?这个很重要,第一次提交 PR 要想成功一定要写非常完善的测试用例。
Ниже представлен PR, который я представил, и его можно объединить с приведенным выше, чтобы понять
[SPARK-35907][CORE] Instead of File#mkdirs, Files#createDirectories is expected
### What changes were proposed in this pull request?
The code of method: createDirectory in class: org.apache.spark.util.Utils is modified.
### Why are the changes needed?
To solve the problem of ambiguous exception handling in traditional IO creating directories.
What's more, there shouldn't be an improper comment in Spark's source code.
### Does this PR introduce _any_ user-facing change?
Yes
The modified method would be called to create the working directory when Worker starts.
The modified method would be called to create local directories for storing block data when the class: DiskBlockManager instantiates.
The modified method would be called to create a temporary directory inside the given parent directory in several classes.
### How was this patch tested?
I have provided test cases as much as possible.
общаться
==Важность МАКС==
По сути, это имеет тот же уровень важности, что и написание кода выше.Хотя код написан, вы должны убедить коммиттера объединить ваш код в мастер, иначе будет бесполезно писать больше кода!
Обязательно больше общайтесь с крупными игроками в сообществе. У нескольких участников могут быть предложения по вашему представлению. Обязательно == ответьте им == . Конечно, предложение Committer имеет приоритет MAX, потому чтоТолько у них есть разрешение на слияние вашего кода с мастером..
Здесь это проявляетсяВажность хорошего английскогоЕсли вы это сделаете, вам не придется использовать Google Translate (Baidu Translate) для общения, как я, и вам придется менять его после каждого перевода.
┭┮﹏┭┮
успешно слился с мастером
Самый красивый текст о( ̄︶ ̄)o
Суммировать
Код имеет значение, тестирование имеет значение, коммуникация имеет значение