

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="/favicon.ico">
    <base href="https://hadoop.apache.org">
    <title>Apache Hadoop</title>

    
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

    
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
    <link rel="stylesheet" href="/css/hadoop.css">

    
    
  </head>

  <body>

    <nav class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <img class="navbar-logo" src="/elephant.png">
          <a class="navbar-brand" href="/"> Apache Hadoop</a>
        </div>
        
   <div id="navbar" class="navbar-collapse collapse">
     <ul class="nav navbar-nav">
       
       
          
             <li class=""><a href="releases.html">Download</a></li>
          
       
          
            <li class="dropdown ">
             <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Documentation <span class="caret"></span></a>
             <ul class="dropdown-menu">
               
                  <li ><a href="http://apache.github.io/hadoop/">Current (trunk)</a></li>
               
                  <li ><a href="https://hadoop.apache.org/docs/current/">Latest</a></li>
               
                  <li ><a href="https://hadoop.apache.org/docs/stable/">Stable</a></li>
               
               
               <li role="separator" class="divider"></li>
               
               <li><a href="https://hadoop.apache.org/docs/r3.4.0/">3.4.0</a></li>
               
               <li><a href="https://hadoop.apache.org/docs/r3.3.6/">3.3.6</a></li>
               
               <li><a href="https://hadoop.apache.org/docs/r2.10.2/">2.10.2</a></li>
               
               <li role="separator" class="divider"></li>
               <li><a href="https://wiki.apache.org/hadoop">Wiki</a></li>
               
             </ul>
           </li>
          
       
          
            <li class="dropdown  active">
             <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Community <span class="caret"></span></a>
             <ul class="dropdown-menu">
               
                  <li ><a href="/bylaws.html">Bylaws</a></li>
               
                  <li ><a href="/committer_criteria.html">Criteria for Committership</a></li>
               
                  <li ><a href="/mailing_lists.html">Mailing lists</a></li>
               
                  <li ><a href="/cve_list.html">Published CVEs</a></li>
               
                  <li ><a href="/who.html">Who We are</a></li>
               
               
             </ul>
           </li>
          
       
          
            <li class="dropdown ">
             <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Development <span class="caret"></span></a>
             <ul class="dropdown-menu">
               
                  <li ><a href="https://cwiki.apache.org/confluence/display/HADOOP/How&#43;To&#43;Contribute">How to Contribute</a></li>
               
                  <li ><a href="/issue_tracking.html">Issue Tracking</a></li>
               
                  <li ><a href="/version_control.html">Version Control</a></li>
               
                  <li ><a href="/versioning.html">Versioning</a></li>
               
               
             </ul>
           </li>
          
       
          
            <li class="dropdown ">
             <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Help <span class="caret"></span></a>
             <ul class="dropdown-menu">
               
                  <li ><a href="https://www.cafepress.com/hadoop">Buy Stuff</a></li>
               
                  <li ><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
               
                  <li ><a href="https://www.apache.org/foundation/thanks.html">Thanks</a></li>
               
               
             </ul>
           </li>
          
       
     </ul>
	  <ul class="nav navbar-nav navbar-right">
      <li>
       <a href="https://www.apache.org/">Apache Software Foundation <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span></a>
      </li>


     </ul>
   </div>

      </div>
    </nav>

<div class="container">
<h1>Criteria for Committership</h1>
<!---
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->
<p>Committers are responsible for reviewing and integrating code changes.
The PMC votes to make a contributor a committer based on an assessment
of their contributions to the project. Contributions can be made in many
ways, and there is no one route to committership. That said, here are
the general criteria that the PMC looks for from all potential
committers:</p>
<ul>
<li>
<p><strong>A history of sustained contribution to the project.</strong> This is a
way for a contributor to demonstrate their expertise in an area, and
thus their ability to help review and commit contributions by others
in that same area. Sustained contribution is also a way of
demonstrating commitment to the project, essentially that someone
will continue contributing even after they become a committer.</p>
</li>
<li>
<p><strong>High-quality contributions.</strong> As experienced contributors,
committers set an example for others in the project, and help
inculcate a culture of high-quality contributions. For code
contributions, this means clean, documented code which includes unit
tests if appropriate and passes precommit checks. For reviews, this
means thorough, actionable feedback, and a +1 vote (even
non-binding) only when there is a high degree of confidence in the
change.</p>
</li>
<li>
<p><strong>Community involvement.</strong> Contributors are always expected to be
polite, constructive, and respectful of others during community
interactions. Disagreement can (and will) happen over technical
issues, but the discussion should remain friendly and focused on
technical merits. Committers also have the additional responsibility
of mentoring newer contributors, as well as helping to grow the
community through actions like responding to emails on the user and
dev list.</p>
</li>
</ul>
<h1 id="example-paths-to-committership">Example Paths to Committership</h1>
<p>Here are a few hypothetical example paths to a commit bit:</p>
<p><em>Han Meimei</em> works at a big company operating a large Apache Hadoop
cluster. While deploying the newest version of Hadoop to her staging
cluster, she discovers a number of bugs and performance regressions. She
files JIRAs for these issues, and is able to post patches for some of
them. On the remaining JIRAs, she works with other community members by
doing additional debugging on her cluster and testing and reviewing
intermediate patches. Additionally, Han Meimei works with the release
manager of the release line, <em>Lei Li</em>, to make sure critical issues are
backported to the next maintenance release. Han Meimei also makes an
effort to help fix and review other critical issues targeted at the next
maintenance release, even though her cluster is not currently affected.
She continues doing similar stabilization work for subsequent
maintenance releases in this release line, demonstrating her commitment
to shipping high-quality upstream releases.</p>
<p><em>Elise</em> works at a commercial big data vendor as a developer. Elise
ramps up by doing some newbie JIRAs, but then gets involved with a large
cross-company development effort happening on a feature branch. Elise
helps to review the design of the feature, providing constructive
feedback, and works with other community members to divide the work into
subtasks. At this point, the PMC grants Elise branch committership to
accelerate development. Elise submits good patches for a number of
subtasks, and shows care and thoroughness when reviewing and committing
code of others. After the feature branch is later merged to trunk, Elise
continues to find and fix bugs related to the feature, as well as
reviewing code contributions from others.</p>
<p><em>Raj</em> works as a test engineer at a commercial big data vendor. Raj
notices the lack of integration testing upstream, and contributes a test
harness for fault-injection testing which is committed to the project.
Raj coordinates with the PMC to get the test harness running on Apache
infrastructure, and starts triaging the output and filing JIRAs for
relevant bugs with reproductions. Raj helps with gathering logs and
reproducing issues, and continues making improvements to the test
harness.</p>
<p><em>Peter</em> is a technical writer interested in improving Hadoop&rsquo;s
documentation. He starts by fixing outdated information and incorrect
examples, reaching out to subject matter experts and exploring the
codebase to clarify technical details. As Peter becomes more familiar
with the set of documentation, he realizes that a newly contributed
feature didn&rsquo;t include sufficient documentation, and contributes a guide
on how to setup and use the feature that also explains some of the
design decisions that influenced API design. Peter continues to broaden
his doc contributions to more and more areas, and also is active
answering user questions on the mailing list. This demonstrates his
knowledge of the project, attention to detail, and also his user-focus.</p>

</div>

<div class="container">
<footer class="footer container">
  <div class="col-md-6">
  <p>Apache Hadoop, Hadoop, Apache, the Apache feather logo,
    and the Apache Hadoop project logo are either registered trademarks or trademarks of the Apache Software Foundation
     in the United States and other countries</p>
  <p>Copyright © 2006-2024 The Apache Software Foundation</p>
  <p><a href="/privacy_policy.html">Privacy policy</a></p>
  </div>
  <div class="col-md-6">
    <img class="img-responsive" src="/asf_logo_wide.png"/>
  </div>
</footer>
</div>
    
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
    <script>
    $(function() { $('table').addClass('table table-striped'); })
    </script>

<script type="application/javascript">
var doNotTrack = false;
if (!doNotTrack) {
	(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
	(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
	m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
	})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
	ga('create', 'UA-7453027-1', 'auto');
	
	ga('send', 'pageview');
}
</script>
</body>
</html>

